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

Reply via email to