o TestEvents.py:
Add a usage example of SBEvent APIs. o SBEvent.h and SBListener.h: Add method docstrings for SBEvent.h and SBListener.h, and example usage of SBEvent into the class docstring of SBEvent. o lldb.swig: Add typemap for SBEvent::SBEvent (uint32_t event, const char *cstr, uint32_t cstr_len) so that we can use, in Python, obj2 = lldb.SBEvent(0, "abc") to create an SBEvent. llvm-svn: 134766
This commit is contained in:
parent
129b4cc9ec
commit
3a709ac7bf
|
@ -20,18 +20,124 @@ namespace lldb {
|
|||
|
||||
class SBBroadcaster;
|
||||
|
||||
#ifdef SWIG
|
||||
%feature("docstring",
|
||||
"API clients can register to receive events.
|
||||
|
||||
For example, check out the following output:
|
||||
|
||||
Try wait for event...
|
||||
Event description: 0x103d0bb70 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = running}
|
||||
Event data flavor: Process::ProcessEventData
|
||||
Process state: running
|
||||
|
||||
Try wait for event...
|
||||
Event description: 0x103a700a0 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = stopped}
|
||||
Event data flavor: Process::ProcessEventData
|
||||
Process state: stopped
|
||||
|
||||
Try wait for event...
|
||||
Event description: 0x103d0d4a0 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = exited}
|
||||
Event data flavor: Process::ProcessEventData
|
||||
Process state: exited
|
||||
|
||||
Try wait for event...
|
||||
timeout occurred waiting for event...
|
||||
|
||||
from test/python_api/event/TestEventspy:
|
||||
|
||||
def do_listen_for_and_print_event(self):
|
||||
'''Create a listener and use SBEvent API to print the events received.'''
|
||||
exe = os.path.join(os.getcwd(), 'a.out')
|
||||
|
||||
# Create a target by the debugger.
|
||||
target = self.dbg.CreateTarget(exe)
|
||||
self.assertTrue(target, VALID_TARGET)
|
||||
|
||||
# Now create a breakpoint on main.c by name 'c'.
|
||||
breakpoint = target.BreakpointCreateByName('c', 'a.out')
|
||||
|
||||
# Now launch the process, and do not stop at the entry point.
|
||||
process = target.LaunchSimple(None, None, os.getcwd())
|
||||
self.assertTrue(process.GetState() == lldb.eStateStopped,
|
||||
PROCESS_STOPPED)
|
||||
|
||||
# Get a handle on the process's broadcaster.
|
||||
broadcaster = process.GetBroadcaster()
|
||||
|
||||
# Create an empty event object.
|
||||
event = lldb.SBEvent()
|
||||
|
||||
# Create a listener object and register with the broadcaster.
|
||||
listener = lldb.SBListener('my listener')
|
||||
rc = broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged)
|
||||
self.assertTrue(rc, 'AddListener successfully retruns')
|
||||
|
||||
traceOn = self.TraceOn()
|
||||
if traceOn:
|
||||
lldbutil.print_stacktraces(process)
|
||||
|
||||
# Create MyListeningThread class to wait for any kind of event.
|
||||
import threading
|
||||
class MyListeningThread(threading.Thread):
|
||||
def run(self):
|
||||
count = 0
|
||||
# Let's only try at most 4 times to retrieve any kind of event.
|
||||
# After that, the thread exits.
|
||||
while not count > 3:
|
||||
if traceOn:
|
||||
print 'Try wait for event...'
|
||||
if listener.WaitForEventForBroadcasterWithType(5,
|
||||
broadcaster,
|
||||
lldb.SBProcess.eBroadcastBitStateChanged,
|
||||
event):
|
||||
if traceOn:
|
||||
desc = lldbutil.get_description(event)
|
||||
print 'Event description:', desc
|
||||
print 'Event data flavor:', event.GetDataFlavor()
|
||||
print 'Process state:', lldbutil.state_type_to_str(process.GetState())
|
||||
print
|
||||
else:
|
||||
if traceOn:
|
||||
print 'timeout occurred waiting for event...'
|
||||
count = count + 1
|
||||
return
|
||||
|
||||
# Let's start the listening thread to retrieve the events.
|
||||
my_thread = MyListeningThread()
|
||||
my_thread.start()
|
||||
|
||||
# Use Python API to continue the process. The listening thread should be
|
||||
# able to receive the state changed events.
|
||||
process.Continue()
|
||||
|
||||
# Use Python API to kill the process. The listening thread should be
|
||||
# able to receive the state changed event, too.
|
||||
process.Kill()
|
||||
|
||||
# Wait until the 'MyListeningThread' terminates.
|
||||
my_thread.join()
|
||||
"
|
||||
) SBEvent;
|
||||
#endif
|
||||
class SBEvent
|
||||
{
|
||||
#ifdef SWIG
|
||||
%feature("autodoc", "1");
|
||||
#endif
|
||||
public:
|
||||
SBEvent();
|
||||
|
||||
SBEvent (const lldb::SBEvent &rhs);
|
||||
|
||||
// Make an event that contains a C string.
|
||||
#ifdef SWIG
|
||||
%feature("autodoc", "__init__(self, int type, str data) -> SBEvent") SBEvent;
|
||||
#endif
|
||||
SBEvent (uint32_t event, const char *cstr, uint32_t cstr_len);
|
||||
|
||||
~SBEvent();
|
||||
|
||||
SBEvent (const lldb::SBEvent &rhs);
|
||||
|
||||
#ifndef SWIG
|
||||
const SBEvent &
|
||||
operator = (const lldb::SBEvent &rhs);
|
||||
|
|
|
@ -16,6 +16,9 @@ namespace lldb {
|
|||
|
||||
class SBListener
|
||||
{
|
||||
#ifdef SWIG
|
||||
%feature("autodoc", "1");
|
||||
#endif
|
||||
public:
|
||||
SBListener ();
|
||||
|
||||
|
|
|
@ -102,7 +102,16 @@ o SBLineEntry: Specifies an association with a contiguous range of instructions
|
|||
|
||||
|
||||
// typemap for an outgoing buffer
|
||||
// See also SBProcess::WriteMemory.
|
||||
// See also SBEvent::SBEvent(uint32_t event, const char *cstr, uint32_t cstr_len).
|
||||
%typemap(in) (const char *cstr, uint32_t cstr_len) {
|
||||
if (!PyString_Check($input)) {
|
||||
PyErr_SetString(PyExc_ValueError, "Expecting a string");
|
||||
return NULL;
|
||||
}
|
||||
$1 = (char *) PyString_AsString($input);
|
||||
$2 = PyString_Size($input);
|
||||
}
|
||||
// And SBProcess::WriteMemory.
|
||||
%typemap(in) (const void *buf, size_t size) {
|
||||
if (!PyString_Check($input)) {
|
||||
PyErr_SetString(PyExc_ValueError, "Expecting a string");
|
||||
|
|
|
@ -118,6 +118,7 @@ class APIDefaultConstructorTestCase(TestBase):
|
|||
@python_api_test
|
||||
def test_SBEvent(self):
|
||||
obj = lldb.SBEvent()
|
||||
obj2 = lldb.SBEvent(0, "abc")
|
||||
if self.TraceOn():
|
||||
print obj
|
||||
self.assertFalse(obj)
|
||||
|
|
|
@ -12,6 +12,19 @@ class EventAPITestCase(TestBase):
|
|||
|
||||
mydir = os.path.join("python_api", "event")
|
||||
|
||||
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
|
||||
@python_api_test
|
||||
def test_listen_for_and_print_event_with_dsym(self):
|
||||
"""Exercise SBEvent API."""
|
||||
self.buildDsym()
|
||||
self.do_listen_for_and_print_event()
|
||||
|
||||
@python_api_test
|
||||
def test_listen_for_and_print_event_with_dwarf(self):
|
||||
"""Exercise SBEvent API."""
|
||||
self.buildDwarf()
|
||||
self.do_listen_for_and_print_event()
|
||||
|
||||
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
|
||||
@python_api_test
|
||||
def test_wait_for_event_with_dsym(self):
|
||||
|
@ -44,6 +57,78 @@ class EventAPITestCase(TestBase):
|
|||
# Find the line number to of function 'c'.
|
||||
self.line = line_number('main.c', '// Find the line number of function "c" here.')
|
||||
|
||||
def do_listen_for_and_print_event(self):
|
||||
"""Create a listener and use SBEvent API to print the events received."""
|
||||
exe = os.path.join(os.getcwd(), "a.out")
|
||||
|
||||
# Create a target by the debugger.
|
||||
target = self.dbg.CreateTarget(exe)
|
||||
self.assertTrue(target, VALID_TARGET)
|
||||
|
||||
# Now create a breakpoint on main.c by name 'c'.
|
||||
breakpoint = target.BreakpointCreateByName('c', 'a.out')
|
||||
|
||||
# Now launch the process, and do not stop at the entry point.
|
||||
process = target.LaunchSimple(None, None, os.getcwd())
|
||||
self.assertTrue(process.GetState() == lldb.eStateStopped,
|
||||
PROCESS_STOPPED)
|
||||
|
||||
# Get a handle on the process's broadcaster.
|
||||
broadcaster = process.GetBroadcaster()
|
||||
|
||||
# Create an empty event object.
|
||||
event = lldb.SBEvent()
|
||||
|
||||
# Create a listener object and register with the broadcaster.
|
||||
listener = lldb.SBListener("my listener")
|
||||
rc = broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged)
|
||||
self.assertTrue(rc, "AddListener successfully retruns")
|
||||
|
||||
traceOn = self.TraceOn()
|
||||
if traceOn:
|
||||
lldbutil.print_stacktraces(process)
|
||||
|
||||
# Create MyListeningThread class to wait for any kind of event.
|
||||
import threading
|
||||
class MyListeningThread(threading.Thread):
|
||||
def run(self):
|
||||
count = 0
|
||||
# Let's only try at most 4 times to retrieve any kind of event.
|
||||
# After that, the thread exits.
|
||||
while not count > 3:
|
||||
if traceOn:
|
||||
print "Try wait for event..."
|
||||
if listener.WaitForEventForBroadcasterWithType(5,
|
||||
broadcaster,
|
||||
lldb.SBProcess.eBroadcastBitStateChanged,
|
||||
event):
|
||||
if traceOn:
|
||||
desc = lldbutil.get_description(event)
|
||||
print "Event description:", desc
|
||||
print "Event data flavor:", event.GetDataFlavor()
|
||||
print "Process state:", lldbutil.state_type_to_str(process.GetState())
|
||||
print
|
||||
else:
|
||||
if traceOn:
|
||||
print "timeout occurred waiting for event..."
|
||||
count = count + 1
|
||||
return
|
||||
|
||||
# Let's start the listening thread to retrieve the events.
|
||||
my_thread = MyListeningThread()
|
||||
my_thread.start()
|
||||
|
||||
# Use Python API to continue the process. The listening thread should be
|
||||
# able to receive the state changed events.
|
||||
process.Continue()
|
||||
|
||||
# Use Python API to kill the process. The listening thread should be
|
||||
# able to receive the state changed event, too.
|
||||
process.Kill()
|
||||
|
||||
# Wait until the 'MyListeningThread' terminates.
|
||||
my_thread.join()
|
||||
|
||||
def do_wait_for_event(self):
|
||||
"""Get the listener associated with the debugger and exercise WaitForEvent API."""
|
||||
exe = os.path.join(os.getcwd(), "a.out")
|
||||
|
@ -84,6 +169,8 @@ class EventAPITestCase(TestBase):
|
|||
while not count > 3:
|
||||
if listener.WaitForEvent(5, event):
|
||||
#print "Got a valid event:", event
|
||||
#print "Event data flavor:", event.GetDataFlavor()
|
||||
#print "Event type:", lldbutil.state_type_to_str(event.GetType())
|
||||
return
|
||||
count = count + 1
|
||||
print "Timeout: listener.WaitForEvent"
|
||||
|
|
Loading…
Reference in New Issue