
v6: Fix comments. Fix copyright Remove unnecessary test suite stuff. save_var had to stay, as it mutates some test suite state that otherwise fails. v5: Did what Tom Tromey requested in v4; which can be found here: https://pi.simark.ca/gdb-patches/87pmjm0xar.fsf@tromey.com/ v4: Doc formatting fixed. v3: Eli: Updated docs & NEWS to reflect new changes. Added a reference from the .ptid attribute of the ThreadExitedEvent to the ptid attribute of InferiorThread. To do this, I've added an anchor to that attribute. Tom: Tom requested that I should probably just emit the thread object; I ran into two issues for this, which I could not resolve in this patch; 1 - The Thread Object (the python type) checks it's own validity by doing a comparison of it's `thread_info* thread` to nullptr. This means that any access of it's attributes may (probably, since we are in "async" land) throw Python exceptions because the thread has been removed from the thread object. Therefore I've decided in v3 of this patch to just emit most of the same fields that gdb.InferiorThread has, namely global_num, name, num and ptid (the 3-attribute tuple provided by gdb.InferiorThread.ptid). 2 - A python user can hold a global reference to an exiting thread. Thus in order to have a ThreadExit event that can provide attribute access reliably (both as a global reference, but also inside the thread exit handler, as we can never guarantee that it's executed _before_ the thread_info pointer is removed from the gdbpy thread object), the `thread_info *` thread pointer must not be null. However, this comes at the cost of gdb.InferiorThread believing it is "valid" - which means, that if a user holds takes a global reference to that exiting event thread object, they can some time later do `t.switch()` at which point GDB will 'explode' so to speak. v2: Fixed white space issues and NULL/nullptr stuff, as requested by Tom Tromey. v1: Currently no event is emitted for a thread exit. This adds this functionality by emitting a new gdb.ThreadExitedEvent. It currently provides four attributes: - global_num: The GDB assigned global thread number - num: the per-inferior thread number - name: name of the thread or none if not set - ptid: the PTID of the thread, a 3-attribute tuple, identical to InferiorThread.ptid attribute Added info to docs & the NEWS file as well. Added test to test suite. Fixed formatting. Feedback wanted and appreciated.
127 lines
3.6 KiB
C++
127 lines
3.6 KiB
C++
/* Python event definitions -*- c++ -*-
|
|
|
|
Copyright (C) 2017-2023 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
/* To use this file, define GDB_PY_DEFINE_EVENT_TYPE to expand how you
|
|
like, then include the file.
|
|
|
|
Each invocation is of the form:
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE(name, py_name, doc, base)
|
|
|
|
NAME is the name of the event.
|
|
PY_NAME a string representing what the event should be called in
|
|
python.
|
|
DOC Python documentation for the new event type
|
|
BASE the base event for this event usually just event_object_type.
|
|
*/
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (breakpoint,
|
|
"BreakpointEvent",
|
|
"GDB breakpoint stop event object",
|
|
stop_event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (continue,
|
|
"ContinueEvent",
|
|
"GDB continue event object",
|
|
thread_event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (exited,
|
|
"ExitedEvent",
|
|
"GDB exited event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (new_thread,
|
|
"NewThreadEvent",
|
|
"GDB new thread event object",
|
|
thread_event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (thread_exited,
|
|
"ThreadExitedEvent",
|
|
"GDB thread exited event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (new_inferior,
|
|
"NewInferiorEvent",
|
|
"GDB new inferior event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (inferior_deleted,
|
|
"InferiorDeletedEvent",
|
|
"GDB inferior deleted event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (inferior_call_pre,
|
|
"InferiorCallPreEvent",
|
|
"GDB inferior function pre-call event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (inferior_call_post,
|
|
"InferiorCallPostEvent",
|
|
"GDB inferior function post-call event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (register_changed,
|
|
"RegisterChangedEvent",
|
|
"GDB register change event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (memory_changed,
|
|
"MemoryChangedEvent",
|
|
"GDB memory change event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (new_objfile,
|
|
"NewObjFileEvent",
|
|
"GDB new object file event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (free_objfile,
|
|
"FreeObjFileEvent",
|
|
"GDB free object file event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (clear_objfiles,
|
|
"ClearObjFilesEvent",
|
|
"GDB clear object files event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (signal,
|
|
"SignalEvent",
|
|
"GDB signal event object",
|
|
stop_event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (stop,
|
|
"StopEvent",
|
|
"GDB stop event object",
|
|
thread_event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (thread,
|
|
"ThreadEvent",
|
|
"GDB thread event object",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (gdb_exiting,
|
|
"GdbExitingEvent",
|
|
"GDB is about to exit",
|
|
event_object_type);
|
|
|
|
GDB_PY_DEFINE_EVENT_TYPE (connection,
|
|
"ConnectionEvent",
|
|
"GDB connection added or removed object",
|
|
event_object_type);
|