Events In Python (Debugging with GDB)
Next: Threads In Python, Previous: Inferiors In Python, Up: Python API [Contents][Index]
23.3.2.17 Events In Python
GDB provides a general event facility so that Python code can be notified of various state changes, particularly changes that occur in the inferior.
An event is just an object that describes some state change. The type of the object and its attributes will vary depending on the details of the change. All the existing events are described below.
In order to be notified of an event, you must register an event handler with an event registry. An event registry is an object in the gdb.events module which dispatches particular events. A registry provides methods to register and unregister event handlers:
- Function
- EventRegistry.connect (object)
- Add the given callable
objectto the registry. This object will be called when an event corresponding to this registry occurs.
- Function
- EventRegistry.disconnect (object)
- Remove the given
objectfrom the registry. Once removed, the object will no longer receive notifications of events.
Here is an example:
def exit_handler (event):
print ("event type: exit")
if hasattr (event, 'exit_code'):
print ("exit code: %d" % (event.exit_code))
else:
print ("exit code not available")
gdb.events.exited.connect (exit_handler)
In the above example we connect our handler exit_handler to the registry events.exited. Once connected, exit_handler gets called when the inferior exits. The argument event in this example is of type gdb.ExitedEvent. As you can see in the example the ExitedEvent object has an attribute which indicates the exit code of the inferior.
The following is a listing of the event registries that are available and details of the events they emit:
events.contEmits
gdb.ThreadEvent.Some events can be thread specific when GDB is running in non-stop mode. When represented in Python, these events all extend
gdb.ThreadEvent. Note, this event is not emitted directly; instead, events which are emitted by this or other modules might extend this event. Examples of these events aregdb.BreakpointEventandgdb.ContinueEvent.- Variable: ThreadEvent.inferior_thread
In non-stop mode this attribute will be set to the specific thread which was involved in the emitted event. Otherwise, it will be set to
None.
Emits
gdb.ContinueEventwhich extendsgdb.ThreadEvent.This event indicates that the inferior has been continued after a stop. For inherited attribute refer to
gdb.ThreadEventabove.events.exitedEmits
events.ExitedEventwhich indicates that the inferior has exited.events.ExitedEventhas two attributes:- Variable: ExitedEvent.exit_code
An integer representing the exit code, if available, which the inferior has returned. (The exit code could be unavailable if, for example, GDB detaches from the inferior.) If the exit code is unavailable, the attribute does not exist.
- Variable: ExitedEvent.inferior
A reference to the inferior which triggered the
exitedevent.
events.stopEmits
gdb.StopEventwhich extendsgdb.ThreadEvent.Indicates that the inferior has stopped. All events emitted by this registry extend StopEvent. As a child of
gdb.ThreadEvent,gdb.StopEventwill indicate the stopped thread when GDB is running in non-stop mode. Refer togdb.ThreadEventabove for more details.Emits
gdb.SignalEventwhich extendsgdb.StopEvent.This event indicates that the inferior or one of its threads has received as signal.
gdb.SignalEventhas the following attributes:- Variable: SignalEvent.stop_signal
A string representing the signal received by the inferior. A list of possible signal values can be obtained by running the command
info signalsin the GDB command prompt.
Also emits
gdb.BreakpointEventwhich extendsgdb.StopEvent.gdb.BreakpointEventevent indicates that one or more breakpoints have been hit, and has the following attributes:- Variable: BreakpointEvent.breakpoints
A sequence containing references to all the breakpoints (type
gdb.Breakpoint) that were hit. See Breakpoints In Python, for details of thegdb.Breakpointobject.
- Variable: BreakpointEvent.breakpoint
A reference to the first breakpoint that was hit. This function is maintained for backward compatibility and is now deprecated in favor of the
gdb.BreakpointEvent.breakpointsattribute.
events.new_objfileEmits
gdb.NewObjFileEventwhich indicates that a new object file has been loaded by GDB.gdb.NewObjFileEventhas one attribute:- Variable: NewObjFileEvent.new_objfile
A reference to the object file (
gdb.Objfile) which has been loaded. See Objfiles In Python, for details of thegdb.Objfileobject.
events.clear_objfilesEmits
gdb.ClearObjFilesEventwhich indicates that the list of object files for a program space has been reset.gdb.ClearObjFilesEventhas one attribute:- Variable: ClearObjFilesEvent.progspace
A reference to the program space (
gdb.Progspace) whose objfile list has been cleared. See Progspaces In Python.
events.inferior_callEmits events just before and after a function in the inferior is called by GDB. Before an inferior call, this emits an event of type
gdb.InferiorCallPreEvent, and after an inferior call, this emits an event of typegdb.InferiorCallPostEvent.gdb.InferiorCallPreEventIndicates that a function in the inferior is about to be called.
- Variable: InferiorCallPreEvent.ptid
The thread in which the call will be run.
- Variable: InferiorCallPreEvent.address
The location of the function to be called.
gdb.InferiorCallPostEventIndicates that a function in the inferior has just been called.
- Variable: InferiorCallPostEvent.ptid
The thread in which the call was run.
- Variable: InferiorCallPostEvent.address
The location of the function that was called.
events.memory_changed
Emits gdb.MemoryChangedEvent which indicates that the memory of the inferior has been modified by the GDB user, for instance via a command like set *addr = value /@w . The event has the following attributes:
- Variable
- MemoryChangedEvent.address
- The start address of the changed region.
- Variable
- MemoryChangedEvent.length
- Length in bytes of the changed region.
events.register_changed
Emits gdb.RegisterChangedEvent which indicates that a register in the inferior has been modified by the GDB user.
- Variable
- RegisterChangedEvent.frame
- A gdb.Frame object representing the frame in which the register was modified.
- Variable
- RegisterChangedEvent.regnum
- Denotes which register was modified.
events.breakpoint_created
This is emitted when a new breakpoint has been created. The argument that is passed is the new gdb.Breakpoint object.
events.breakpoint_modified
This is emitted when a breakpoint has been modified in some way. The argument that is passed is the new gdb.Breakpoint object.
events.breakpoint_deleted
This is emitted when a breakpoint has been deleted. The argument that is passed is the gdb.Breakpoint object. When this event is emitted, the gdb.Breakpoint object will already be in its invalid state; that is, the is_valid method will return False.
events.before_prompt
This event carries no payload. It is emitted each time GDB presents a prompt to the user.
events.new_inferior
This is emitted when a new inferior is created. Note that the inferior is not necessarily running; in fact, it may not even have an associated executable.
The event is of type gdb.NewInferiorEvent. This has a single attribute:
- Variable
- NewInferiorEvent.inferior
- The new inferior, a
gdb.Inferiorobject.
events.inferior_deleted
This is emitted when an inferior has been deleted. Note that this is not the same as process exit; it is notified when the inferior itself is removed, say via remove-inferiors.
The event is of type gdb.InferiorDeletedEvent. This has a single attribute:
- Variable
- NewInferiorEvent.inferior
- The inferior that is being removed, a
gdb.Inferiorobject.
events.new_thread
This is emitted when GDB notices a new thread. The event is of type gdb.NewThreadEvent, which extends gdb.ThreadEvent. This has a single attribute:
- Variable
- NewThreadEvent.inferior_thread
- The new thread.
events.gdb_exiting
This is emitted when GDB exits. This event is not emitted if GDB exits as a result of an internal error, or after an unexpected signal. The event is of type gdb.GdbExitingEvent, which has a single attribute:
- Variable
- GdbExitingEvent.exit_code
- An integer, the value of the exit code GDB will return.
Next: Threads In Python, Previous: Inferiors In Python, Up: Python API [Contents][Index]