2011-07-19 06:11:53 +08:00
|
|
|
//===-- SWIG Interface for SBEvent ------------------------------*- C++ -*-===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2011-07-19 06:11:53 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
namespace lldb {
|
|
|
|
|
|
|
|
class SBBroadcaster;
|
|
|
|
|
|
|
|
%feature("docstring",
|
|
|
|
"API clients can register to receive events.
|
|
|
|
|
2021-01-15 21:43:26 +08:00
|
|
|
For example, check out the following output: ::
|
2011-07-19 06:11:53 +08:00
|
|
|
|
2021-01-15 21:43:26 +08:00
|
|
|
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
|
2011-07-19 06:11:53 +08:00
|
|
|
|
2021-01-15 21:43:26 +08:00
|
|
|
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
|
2011-07-19 06:11:53 +08:00
|
|
|
|
2021-01-15 21:43:26 +08:00
|
|
|
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
|
2011-07-19 06:11:53 +08:00
|
|
|
|
2021-01-15 21:43:26 +08:00
|
|
|
Try wait for event...
|
|
|
|
timeout occurred waiting for event...
|
2011-07-19 06:11:53 +08:00
|
|
|
|
2021-01-15 21:43:26 +08:00
|
|
|
from test/python_api/event/TestEventspy: ::
|
2011-07-19 06:11:53 +08:00
|
|
|
|
|
|
|
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:
|
2015-10-17 01:52:32 +08:00
|
|
|
print('Try wait for event...')
|
2011-07-19 06:11:53 +08:00
|
|
|
if listener.WaitForEventForBroadcasterWithType(5,
|
|
|
|
broadcaster,
|
|
|
|
lldb.SBProcess.eBroadcastBitStateChanged,
|
|
|
|
event):
|
|
|
|
if traceOn:
|
2015-10-17 01:52:32 +08:00
|
|
|
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()
|
2011-07-19 06:11:53 +08:00
|
|
|
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.
|
2019-04-19 00:23:33 +08:00
|
|
|
my_thread.join()") SBEvent;
|
2011-07-19 06:11:53 +08:00
|
|
|
class SBEvent
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
SBEvent();
|
|
|
|
|
|
|
|
SBEvent (const lldb::SBEvent &rhs);
|
2019-04-19 00:23:33 +08:00
|
|
|
|
2011-07-19 06:11:53 +08:00
|
|
|
%feature("autodoc",
|
|
|
|
"__init__(self, int type, str data) -> SBEvent (make an event that contains a C string)"
|
|
|
|
) SBEvent;
|
|
|
|
SBEvent (uint32_t event, const char *cstr, uint32_t cstr_len);
|
|
|
|
|
|
|
|
~SBEvent();
|
|
|
|
|
|
|
|
bool
|
|
|
|
IsValid() const;
|
|
|
|
|
Add "operator bool" to SB APIs
Summary:
Our python version of the SB API has (the python equivalent of)
operator bool, but the C++ version doesn't.
This is because our python operators are added by modify-python-lldb.py,
which performs postprocessing on the swig-generated interface files.
In this patch, I add the "operator bool" to all SB classes which have an
IsValid method (which is the same logic used by modify-python-lldb.py).
This way, we make the two interfaces more constent, and it allows us to
rely on swig's automatic syntesis of python __nonzero__ methods instead
of doing manual fixups.
Reviewers: zturner, jingham, clayborg, jfb, serge-sans-paille
Subscribers: jdoerfert, lldb-commits
Differential Revision: https://reviews.llvm.org/D58792
llvm-svn: 355824
2019-03-11 21:58:46 +08:00
|
|
|
explicit operator bool() const;
|
|
|
|
|
2011-07-19 06:11:53 +08:00
|
|
|
const char *
|
|
|
|
GetDataFlavor ();
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
GetType () const;
|
|
|
|
|
|
|
|
lldb::SBBroadcaster
|
|
|
|
GetBroadcaster () const;
|
|
|
|
|
2012-02-16 14:50:00 +08:00
|
|
|
const char *
|
|
|
|
GetBroadcasterClass () const;
|
|
|
|
|
2011-07-19 06:11:53 +08:00
|
|
|
bool
|
|
|
|
BroadcasterMatchesRef (const lldb::SBBroadcaster &broadcaster);
|
|
|
|
|
|
|
|
void
|
|
|
|
Clear();
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
GetCStringFromEvent (const lldb::SBEvent &event);
|
|
|
|
|
|
|
|
bool
|
|
|
|
GetDescription (lldb::SBStream &description) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace lldb
|