It shouldn't have a pointer to a weak pointer, it should have a instance of a Process weak_ptr...
Fixed class ivar definition: class SBUnixSignals { private: lldb::ProcessWP m_opaque_wp; }; > On Jun 17, 2014, at 10:52 AM, Greg Clayton <gclay...@apple.com> wrote: > > Looks good except for one thing: SBUnixSignals needs to keep a weak reference > to the process: > > class SBUnixSignals { > private: > lldb::ProcessWP *m_opaque_wp; > }; > > Otherwise you can crash later if someone grabs a SBUnixSignals instance and > uses it after the process gets destroyed. > > These functions go away: > > UnixSignals * > SBUnixSignals::GetPtr() const > { > return m_opaque_ptr; > } > > void > SBUnixSignals::SetPtr (UnixSignals *unix_signals_ptr) > { > m_opaque_ptr = unix_signals_ptr; > } > > And should probably be changed to: > > > lldb::ProcessSP > SBUnixSignals::GetSP() const > { > return m_opaque_wp.lock(); > } > > void > SBUnixSignals::SetSP (const lldb::ProcessSP &process_sp) > { > m_opaque_wp = process_sp; > } > > Then all functions that want to do something, need to get the ProcessSP for > the ProcessWP and then use it if the process shared pointer is valid: > > bool > SBUnixSignals::IsValid() const > { > return (bool)GetSP(); > } > > const char * > SBUnixSignals::GetSignalAsCString (int32_t signo) const > { > ProcessSP process_sp(GetSP()); > if (process_sp) > return process_sp.GetUnixSignals().GetSignalAsCString(signo); > return NULL; > } > > > > This will allow you to play with the process' unix signals object until the > process doesn't exist anymore and then all functions become no-ops and > everything stays safe. The only time it is ok to use pointers in the lldb::SB > classes is for objects that are in global lists that never get destroyed, or > for objects you create yourself and want to work on directly. Here we really > want to be modifying the copy of the UnixSignals from a specific process, so > we need to keep a smart reference to the process. > > Greg > >> On Jun 17, 2014, at 9:35 AM, Russell Harmon <eatnumb...@google.com> wrote: >> >> Ping. Can someone take a look at this when they get a chance? >> >> On Thu Jun 05 2014 at 6:17:00 PM, Russell Harmon <eatnumb...@google.com> >> wrote: >> This commit allows you to control the signals that lldb will suppress, stop >> or >> forward using the Python and C++ APIs. >> --- >> include/lldb/API/SBDefines.h | 1 + >> include/lldb/API/SBProcess.h | 3 + >> include/lldb/API/SBUnixSignals.h | 84 +++++++++++++ >> include/lldb/lldb-defines.h | 4 + >> include/lldb/lldb-forward.h | 1 + >> scripts/Python/build-swig-Python.sh | 6 +- >> scripts/Python/interface/SBProcess.i | 3 + >> scripts/Python/interface/SBUnixSignals.i | 74 ++++++++++++ >> scripts/lldb.swig | 5 + >> source/API/CMakeLists.txt | 1 + >> source/API/SBProcess.cpp | 14 +++ >> source/API/SBUnixSignals.cpp | 192 >> ++++++++++++++++++++++++++++++ >> test/python_api/signals/Makefile | 5 + >> test/python_api/signals/TestSignalsAPI.py | 49 ++++++++ >> test/python_api/signals/main.cpp | 20 ++++ >> 15 files changed, 460 insertions(+), 2 deletions(-) >> create mode 100644 include/lldb/API/SBUnixSignals.h >> create mode 100644 scripts/Python/interface/SBUnixSignals.i >> create mode 100644 source/API/SBUnixSignals.cpp >> create mode 100644 test/python_api/signals/Makefile >> create mode 100644 test/python_api/signals/TestSignalsAPI.py >> create mode 100644 test/python_api/signals/main.cpp >> >> diff --git a/include/lldb/API/SBDefines.h b/include/lldb/API/SBDefines.h >> index 15d8d1f..30ea0df 100644 >> --- a/include/lldb/API/SBDefines.h >> +++ b/include/lldb/API/SBDefines.h >> @@ -85,6 +85,7 @@ class LLDB_API SBTypeList; >> class LLDB_API SBValue; >> class LLDB_API SBValueList; >> class LLDB_API SBWatchpoint; >> +class LLDB_API SBUnixSignals; >> >> } >> >> diff --git a/include/lldb/API/SBProcess.h b/include/lldb/API/SBProcess.h >> index 448e959..4b59462 100644 >> --- a/include/lldb/API/SBProcess.h >> +++ b/include/lldb/API/SBProcess.h >> @@ -221,6 +221,9 @@ public: >> lldb::SBError >> Signal (int signal); >> >> + lldb::SBUnixSignals >> + GetUnixSignals(); >> + >> void >> SendAsyncInterrupt(); >> >> diff --git a/include/lldb/API/SBUnixSignals.h >> b/include/lldb/API/SBUnixSignals.h >> new file mode 100644 >> index 0000000..d95453a >> --- /dev/null >> +++ b/include/lldb/API/SBUnixSignals.h >> @@ -0,0 +1,84 @@ >> +//===-- SBUnixSignals.h -----------------------------------------------*- >> C++ -*-===// >> +// >> +// The LLVM Compiler Infrastructure >> +// >> +// This file is distributed under the University of Illinois Open Source >> +// License. See LICENSE.TXT for details. >> +// >> +//===----------------------------------------------------------------------===// >> + >> +#ifndef LLDB_SBUnixSignals_h_ >> +#define LLDB_SBUnixSignals_h_ >> + >> +#include "lldb/API/SBDefines.h" >> + >> +namespace lldb { >> + >> +class SBUnixSignals { >> +public: >> + SBUnixSignals (); >> + >> + SBUnixSignals (const lldb::SBUnixSignals &rhs); >> + >> + ~SBUnixSignals(); >> + >> + const SBUnixSignals & >> + operator =(const lldb::SBUnixSignals &rhs); >> + >> + void >> + Clear (); >> + >> + bool >> + IsValid () const; >> + >> + const char * >> + GetSignalAsCString (int32_t signo) const; >> + >> + int32_t >> + GetSignalNumberFromName (const char *name) const; >> + >> + bool >> + GetShouldSuppress (int32_t signo) const; >> + >> + bool >> + SetShouldSuppress (int32_t signo, >> + bool value); >> + >> + bool >> + GetShouldStop (int32_t signo) const; >> + >> + bool >> + SetShouldStop (int32_t signo, >> + bool value); >> + >> + bool >> + GetShouldNotify (int32_t signo) const; >> + >> + bool >> + SetShouldNotify (int32_t signo, bool value); >> + >> + int32_t >> + GetNumSignals () const; >> + >> + int32_t >> + GetSignalAtIndex (int32_t index) const; >> + >> +protected: >> + friend class SBProcess; >> + >> + SBUnixSignals (lldb_private::UnixSignals *unix_signals_ptr); >> + >> + lldb_private::UnixSignals * >> + GetPtr() const; >> + >> + void >> + SetPtr (lldb_private::UnixSignals *unix_signals_ptr); >> + >> +private: >> + lldb_private::UnixSignals *m_opaque_ptr; >> +}; >> + >> + >> +} // namespace lldb >> + >> +#endif // LLDB_SBUnixSignals_h_ >> diff --git a/include/lldb/lldb-defines.h b/include/lldb/lldb-defines.h >> index 1cfbe4e..f8a0257 100644 >> --- a/include/lldb/lldb-defines.h >> +++ b/include/lldb/lldb-defines.h >> @@ -24,6 +24,10 @@ >> #define LLDB_API >> #endif >> >> +#if !defined(INT32_MAX) >> + #define INT32_MAX 2147483647 >> +#endif >> + >> #if !defined(UINT32_MAX) >> #define UINT32_MAX 4294967295U >> #endif >> diff --git a/include/lldb/lldb-forward.h b/include/lldb/lldb-forward.h >> index 9cd6adb..e4db5a1 100644 >> --- a/include/lldb/lldb-forward.h >> +++ b/include/lldb/lldb-forward.h >> @@ -249,6 +249,7 @@ class TypeEnumMemberListImpl; >> class TypeNameSpecifierImpl; >> class TypePair; >> class UUID; >> +class UnixSignals; >> class Unwind; >> class UnwindAssembly; >> class UnwindPlan; >> diff --git a/scripts/Python/build-swig-Python.sh >> b/scripts/Python/build-swig-Python.sh >> index 5f9b574..3e30a6a 100755 >> --- a/scripts/Python/build-swig-Python.sh >> +++ b/scripts/Python/build-swig-Python.sh >> @@ -122,7 +122,8 @@ HEADER_FILES="${SRC_ROOT}/include/lldb/lldb.h"\ >> " ${SRC_ROOT}/include/lldb/API/SBTypeSynthetic.h"\ >> " ${SRC_ROOT}/include/lldb/API/SBValue.h"\ >> " ${SRC_ROOT}/include/lldb/API/SBValueList.h"\ >> -" ${SRC_ROOT}/include/lldb/API/SBWatchpoint.h" >> +" ${SRC_ROOT}/include/lldb/API/SBWatchpoint.h"\ >> +" ${SRC_ROOT}/include/lldb/API/SBUnixSignals.h" >> >> INTERFACE_FILES="${SRC_ROOT}/scripts/Python/interface/SBAddress.i"\ >> " ${SRC_ROOT}/scripts/Python/interface/SBBlock.i"\ >> @@ -169,7 +170,8 @@ >> INTERFACE_FILES="${SRC_ROOT}/scripts/Python/interface/SBAddress.i"\ >> " ${SRC_ROOT}/scripts/Python/interface/SBTypeSynthetic.i"\ >> " ${SRC_ROOT}/scripts/Python/interface/SBValue.i"\ >> " ${SRC_ROOT}/scripts/Python/interface/SBValueList.i"\ >> -" ${SRC_ROOT}/scripts/Python/interface/SBWatchpoint.i" >> +" ${SRC_ROOT}/scripts/Python/interface/SBWatchpoint.i"\ >> +" ${SRC_ROOT}/scripts/Python/interface/SBUnixSignals.i" >> >> if [ $Debug -eq 1 ] >> then >> diff --git a/scripts/Python/interface/SBProcess.i >> b/scripts/Python/interface/SBProcess.i >> index d023b24..5cd99c0 100644 >> --- a/scripts/Python/interface/SBProcess.i >> +++ b/scripts/Python/interface/SBProcess.i >> @@ -240,6 +240,9 @@ public: >> lldb::SBError >> Signal (int signal); >> >> + lldb::SBUnixSignals >> + GetUnixSignals(); >> + >> %feature("docstring", " >> Returns a stop id that will increase every time the process executes. If >> include_expression_stops is true, then stops caused by expression >> evaluation >> diff --git a/scripts/Python/interface/SBUnixSignals.i >> b/scripts/Python/interface/SBUnixSignals.i >> new file mode 100644 >> index 0000000..2bd537a >> --- /dev/null >> +++ b/scripts/Python/interface/SBUnixSignals.i >> @@ -0,0 +1,74 @@ >> +//===-- SWIG Interface for SBProcess ----------------------------*- C++ >> -*-===// >> +// >> +// The LLVM Compiler Infrastructure >> +// >> +// This file is distributed under the University of Illinois Open Source >> +// License. See LICENSE.TXT for details. >> +// >> +//===----------------------------------------------------------------------===// >> + >> +namespace lldb { >> + >> +%feature("docstring", >> +"Allows you to manipulate LLDB's signal disposition" >> +) SBUnixSignals; >> +class SBUnixSignals >> +{ >> +public: >> + SBUnixSignals (); >> + >> + SBUnixSignals (const lldb::SBUnixSignals &rhs); >> + >> + ~SBUnixSignals(); >> + >> + void >> + Clear (); >> + >> + bool >> + IsValid () const; >> + >> + const char * >> + GetSignalAsCString (int32_t signo) const; >> + >> + int32_t >> + GetSignalNumberFromName (const char *name) const; >> + >> + bool >> + GetShouldSuppress (int32_t signo) const; >> + >> + bool >> + SetShouldSuppress (int32_t signo, >> + bool value); >> + >> + bool >> + GetShouldStop (int32_t signo) const; >> + >> + bool >> + SetShouldStop (int32_t signo, >> + bool value); >> + >> + bool >> + GetShouldNotify (int32_t signo) const; >> + >> + bool >> + SetShouldNotify (int32_t signo, bool value); >> + >> + int32_t >> + GetNumSignals () const; >> + >> + int32_t >> + GetSignalAtIndex (int32_t index) const; >> + >> + %pythoncode %{ >> + def get_unix_signals_list(self): >> + signals = [] >> + for idx in range(0, self.GetNumSignals()): >> + signals.append(self.GetSignalAtIndex(sig)) >> + return signals >> + >> + __swig_getmethods__["signals"] = get_unix_signals_list >> + if _newclass: threads = property(get_unix_signals_list, None, >> doc='''A read only property that returns a list() of valid signal numbers >> for this platform.''') >> + %} >> +}; >> + >> +} // namespace lldb >> diff --git a/scripts/lldb.swig b/scripts/lldb.swig >> index 1a230d1..94392a1 100644 >> --- a/scripts/lldb.swig >> +++ b/scripts/lldb.swig >> @@ -102,6 +102,7 @@ import os >> #include "lldb/API/SBValue.h" >> #include "lldb/API/SBValueList.h" >> #include "lldb/API/SBWatchpoint.h" >> +#include "lldb/API/SBUnixSignals.h" >> >> #include "../scripts/Python/python-swigsafecast.swig" >> >> @@ -109,6 +110,9 @@ import os >> >> /* Various liblldb typedefs that SWIG needs to know about. */ >> #define __extension__ /* Undefine GCC keyword to make Swig happy when >> processing glibc's stdint.h. */ >> +/* The ISO C99 standard specifies that in C++ implementations limit macros >> such >> + as INT32_MAX should only be defined if __STDC_LIMIT_MACROS is. */ >> +#define __STDC_LIMIT_MACROS >> %include "stdint.i" >> %include "lldb/lldb-defines.h" >> %include "lldb/lldb-enumerations.h" >> @@ -169,6 +173,7 @@ import os >> %include "./Python/interface/SBValue.i" >> %include "./Python/interface/SBValueList.i" >> %include "./Python/interface/SBWatchpoint.i" >> +%include "./Python/interface/SBUnixSignals.i" >> >> %include "./Python/python-extensions.swig" >> >> diff --git a/source/API/CMakeLists.txt b/source/API/CMakeLists.txt >> index 63adb68..b903b4e 100644 >> --- a/source/API/CMakeLists.txt >> +++ b/source/API/CMakeLists.txt >> @@ -51,4 +51,5 @@ add_lldb_library(lldbAPI >> SBValue.cpp >> SBValueList.cpp >> SBWatchpoint.cpp >> + SBUnixSignals.cpp >> ) >> diff --git a/source/API/SBProcess.cpp b/source/API/SBProcess.cpp >> index bb5b989..2f32f28 100644 >> --- a/source/API/SBProcess.cpp >> +++ b/source/API/SBProcess.cpp >> @@ -40,6 +40,7 @@ >> #include "lldb/API/SBThread.h" >> #include "lldb/API/SBStream.h" >> #include "lldb/API/SBStringList.h" >> +#include "lldb/API/SBUnixSignals.h" >> >> using namespace lldb; >> using namespace lldb_private; >> @@ -893,6 +894,19 @@ SBProcess::Signal (int signo) >> return sb_error; >> } >> >> +SBUnixSignals >> +SBProcess::GetUnixSignals() >> +{ >> + SBUnixSignals sb_unix_signals; >> + ProcessSP process_sp(GetSP()); >> + if (process_sp) >> + { >> + sb_unix_signals.SetPtr(&process_sp->GetUnixSignals()); >> + } >> + >> + return sb_unix_signals; >> +} >> + >> void >> SBProcess::SendAsyncInterrupt () >> { >> diff --git a/source/API/SBUnixSignals.cpp b/source/API/SBUnixSignals.cpp >> new file mode 100644 >> index 0000000..21c508d >> --- /dev/null >> +++ b/source/API/SBUnixSignals.cpp >> @@ -0,0 +1,192 @@ >> +//===-- SBUnixSignals.cpp -------------------------------------------*- C++ >> -*-===// >> +// >> +// The LLVM Compiler Infrastructure >> +// >> +// This file is distributed under the University of Illinois Open Source >> +// License. See LICENSE.TXT for details. >> +// >> +//===----------------------------------------------------------------------===// >> + >> +#include "lldb/lldb-defines.h" >> +#include "lldb/Target/UnixSignals.h" >> +#include "lldb/Core/Log.h" >> + >> +#include "lldb/API/SBUnixSignals.h" >> + >> +using namespace lldb; >> +using namespace lldb_private; >> + >> +SBUnixSignals::SBUnixSignals () : >> + m_opaque_ptr(NULL) >> +{ >> +} >> + >> +SBUnixSignals::SBUnixSignals (const SBUnixSignals &rhs) : >> + m_opaque_ptr(rhs.m_opaque_ptr) >> +{ >> +} >> + >> +SBUnixSignals::SBUnixSignals (UnixSignals *unix_signals_ptr) : >> + m_opaque_ptr(unix_signals_ptr) >> +{ >> +} >> + >> +const SBUnixSignals& >> +SBUnixSignals::operator = (const SBUnixSignals& rhs) >> +{ >> + if (this != &rhs) >> + m_opaque_ptr = rhs.m_opaque_ptr; >> + return *this; >> +} >> + >> +SBUnixSignals::~SBUnixSignals() >> +{ >> +} >> + >> +UnixSignals * >> +SBUnixSignals::GetPtr() const >> +{ >> + return m_opaque_ptr; >> +} >> + >> +void >> +SBUnixSignals::SetPtr (UnixSignals *unix_signals_ptr) >> +{ >> + m_opaque_ptr = unix_signals_ptr; >> +} >> + >> +void >> +SBUnixSignals::Clear () >> +{ >> + m_opaque_ptr = NULL; >> +} >> + >> +bool >> +SBUnixSignals::IsValid() const >> +{ >> + return m_opaque_ptr != NULL; >> +} >> + >> +const char * >> +SBUnixSignals::GetSignalAsCString (int32_t signo) const >> +{ >> + if (m_opaque_ptr) return m_opaque_ptr->GetSignalAsCString(signo); >> + return NULL; >> +} >> + >> +int32_t >> +SBUnixSignals::GetSignalNumberFromName (const char *name) const >> +{ >> + if (m_opaque_ptr) return m_opaque_ptr->GetSignalNumberFromName(name); >> + return -1; >> +} >> + >> +bool >> +SBUnixSignals::GetShouldSuppress (int32_t signo) const >> +{ >> + if (m_opaque_ptr) return m_opaque_ptr->GetShouldSuppress(signo); >> + return false; >> +} >> + >> +bool >> +SBUnixSignals::SetShouldSuppress (int32_t signo, bool value) >> +{ >> + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); >> + >> + if (log) >> + { >> + log->Printf ("SBUnixSignals(%p)::SetShouldSuppress (signo=%d, >> value=%d)", >> + m_opaque_ptr, >> + signo, >> + value); >> + } >> + >> + if (m_opaque_ptr) return m_opaque_ptr->SetShouldSuppress(signo, value); >> + return false; >> +} >> + >> +bool >> +SBUnixSignals::GetShouldStop (int32_t signo) const >> +{ >> + if (m_opaque_ptr) return m_opaque_ptr->GetShouldStop(signo); >> + return false; >> +} >> + >> +bool >> +SBUnixSignals::SetShouldStop (int32_t signo, bool value) >> +{ >> + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); >> + >> + if (log) >> + { >> + log->Printf ("SBUnixSignals(%p)::SetShouldStop (signo=%d, >> value=%d)", >> + m_opaque_ptr, >> + signo, >> + value); >> + } >> + >> + if (m_opaque_ptr) return m_opaque_ptr->SetShouldStop(signo, value); >> + return false; >> +} >> + >> +bool >> +SBUnixSignals::GetShouldNotify (int32_t signo) const >> +{ >> + if (m_opaque_ptr) return m_opaque_ptr->GetShouldNotify(signo); >> + return false; >> +} >> + >> +bool >> +SBUnixSignals::SetShouldNotify (int32_t signo, bool value) >> +{ >> + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); >> + >> + if (log) >> + { >> + log->Printf ("SBUnixSignals(%p)::SetShouldNotify (signo=%d, >> value=%d)", >> + m_opaque_ptr, >> + signo, >> + value); >> + } >> + >> + if (m_opaque_ptr) return m_opaque_ptr->SetShouldNotify(signo, value); >> + return false; >> +} >> + >> +int32_t >> +SBUnixSignals::GetNumSignals () const >> +{ >> + if (m_opaque_ptr) >> + { >> + int32_t num_signals = 0; >> + for ( >> + int32_t signo = m_opaque_ptr->GetFirstSignalNumber(); >> + signo != LLDB_INVALID_SIGNAL_NUMBER; >> + signo = m_opaque_ptr->GetNextSignalNumber(signo) >> + ) >> + { >> + num_signals++; >> + } >> + return num_signals; >> + } >> + return LLDB_INVALID_SIGNAL_NUMBER; >> +} >> + >> +int32_t >> +SBUnixSignals::GetSignalAtIndex (int32_t index) const >> +{ >> + if (m_opaque_ptr) >> + { >> + int32_t idx = 0; >> + for ( >> + int32_t signo = m_opaque_ptr->GetFirstSignalNumber(); >> + signo != LLDB_INVALID_SIGNAL_NUMBER; >> + signo = m_opaque_ptr->GetNextSignalNumber(signo) >> + ) >> + { >> + if (index == idx) return signo; >> + idx++; >> + } >> + } >> + return LLDB_INVALID_SIGNAL_NUMBER; >> +} >> diff --git a/test/python_api/signals/Makefile >> b/test/python_api/signals/Makefile >> new file mode 100644 >> index 0000000..8a7102e >> --- /dev/null >> +++ b/test/python_api/signals/Makefile >> @@ -0,0 +1,5 @@ >> +LEVEL = ../../make >> + >> +CXX_SOURCES := main.cpp >> + >> +include $(LEVEL)/Makefile.rules >> diff --git a/test/python_api/signals/TestSignalsAPI.py >> b/test/python_api/signals/TestSignalsAPI.py >> new file mode 100644 >> index 0000000..9702284 >> --- /dev/null >> +++ b/test/python_api/signals/TestSignalsAPI.py >> @@ -0,0 +1,49 @@ >> +""" >> +Test SBProcess APIs, including ReadMemory(), WriteMemory(), and others. >> +""" >> + >> +import os, time >> +import unittest2 >> +import lldb >> +from lldbutil import get_stopped_thread, state_type_to_str >> +from lldbtest import * >> + >> +class SignalsAPITestCase(TestBase): >> + mydir = os.path.join("python_api", "signals") >> + >> + @python_api_test >> + def test_ignore_signal(self): >> + """Test Python SBUnixSignals.Suppress/Stop/Notify() API.""" >> + self.buildDefault() >> + exe = os.path.join(os.getcwd(), "a.out") >> + self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) >> + >> + target = self.dbg.CreateTarget(exe) >> + self.assertTrue(target, VALID_TARGET) >> + >> + line = line_number("main.cpp", "// Set break point at this line and >> setup signal ignores.") >> + breakpoint = target.BreakpointCreateByLocation("main.cpp", line) >> + self.assertTrue(breakpoint, VALID_BREAKPOINT) >> + >> + # Launch the process, and do not stop at the entry point. >> + process = target.LaunchSimple (None, None, >> self.get_process_working_directory()) >> + >> + thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) >> + self.assertTrue(thread.IsValid(), "There should be a thread stopped >> due to breakpoint") >> + >> + unix_signals = process.GetUnixSignals() >> + sigint = unix_signals.GetSignalNumberFromName("SIGINT") >> + unix_signals.SetShouldSuppress(sigint, True) >> + unix_signals.SetShouldStop(sigint, False) >> + unix_signals.SetShouldNotify(sigint, False) >> + >> + process.Continue() >> + self.assertTrue(process.state == lldb.eStateExited, "The process >> should have exited") >> + self.assertTrue(process.GetExitStatus() == 0, "The process should >> have returned 0") >> + >> + >> +if __name__ == '__main__': >> + import atexit >> + lldb.SBDebugger.Initialize() >> + atexit.register(lambda: lldb.SBDebugger.Terminate()) >> + unittest2.main() >> diff --git a/test/python_api/signals/main.cpp >> b/test/python_api/signals/main.cpp >> new file mode 100644 >> index 0000000..ddd2ffe >> --- /dev/null >> +++ b/test/python_api/signals/main.cpp >> @@ -0,0 +1,20 @@ >> +//===-- main.c --------------------------------------------------*- C++ >> -*-===// >> +// >> +// The LLVM Compiler Infrastructure >> +// >> +// This file is distributed under the University of Illinois Open Source >> +// License. See LICENSE.TXT for details. >> +// >> +//===----------------------------------------------------------------------===// >> +#include <stdio.h> >> +#include <sys/types.h> >> +#include <unistd.h> >> +#include <signal.h> >> + >> +// This simple program is to test the lldb Python API related to process. >> + >> +int main (int argc, char const *argv[]) >> +{ >> + kill(getpid(), SIGINT); // Set break point at this line and setup >> signal ignores. >> + return 0; >> +} >> -- >> 2.0.0.526.g5318336 >> >> _______________________________________________ >> lldb-dev mailing list >> lldb-dev@cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev > _______________________________________________ lldb-dev mailing list lldb-dev@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev