Skip to content

Commit 6839b47

Browse files
author
Kevin Pouget
committed
2011-09-15 Kevin Pouget <[email protected]>
Handle multiple breakpoint hits in Python interface: * python/py-bpevent.c (create_breakpoint_event_object): Rename C/Python variable to breakpoints. * python/py-stopevent.c (emit_stop_event): Return a Python tuple of bps instead of single breakpoint. Fix some space typos. * python/py-stopevent.c (create_breakpoint_event_object): Rename variable to breakpoints. testsuite: * gdb.python/py-events.exp: Set a duplicate breakpoint and check its presence. * gdb.python/py-events.py (breakpoint_stop_handler): Browse all the breakpoint hits. doc: * gdb.texinfo (Events In Python): New function documentation: gdb.BreakpointEvent.breakpoints. Indicate that gdb.BreakpointEvent.breakpoint is now deprecated.
1 parent 672f9b6 commit 6839b47

10 files changed

Lines changed: 85 additions & 17 deletions

File tree

gdb/ChangeLog

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
2011-09-15 Kevin Pouget <[email protected]>
2+
3+
Handle multiple breakpoint hits in Python interface:
4+
* python/py-bpevent.c (create_breakpoint_event_object): Rename C/Python
5+
variable to breakpoints.
6+
* python/py-stopevent.c (emit_stop_event): Return a Python tuple of
7+
bps instead of single breakpoint. Fix some space typos.
8+
* python/py-stopevent.c (create_breakpoint_event_object): Rename
9+
variable to breakpoints.
10+
111
2011-09-15 Kevin Pouget <[email protected]>
212

313
* breakpoint.c (describe_other_breakpoints): Do not write 'duplicate'

gdb/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838

3939
** Symbols now provide the "type" attribute, the type of the symbol.
4040

41+
** The "gdb.breakpoint" function has been deprecated in favor of
42+
"gdb.breakpoints".
43+
4144
* libthread-db-search-path now supports two special values: $sdir and $pdir.
4245
$sdir specifies the default system locations of shared libraries.
4346
$pdir specifies the directory where the libpthread used by the application

gdb/doc/ChangeLog

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
2011-09-15 Kevin Pouget <[email protected]>
2+
3+
Handle multiple breakpoint hits in Python interface:
4+
* gdb.texinfo (Events In Python): New function documentation:
5+
gdb.BreakpointEvent.breakpoints. Indicate that
6+
gdb.BreakpointEvent.breakpoint is now deprecated.
7+
18
2011-09-04 Joel Brobecker <[email protected]>
29

310
* gdb.texinfo: Set EDITION to "Tenth" and change ISBN.

gdb/doc/gdb.texinfo

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22317,14 +22317,19 @@ the @value{GDBN} command prompt.
2231722317

2231822318
Also emits @code{gdb.BreakpointEvent} which extends @code{gdb.StopEvent}.
2231922319

22320-
@code{gdb.BreakpointEvent} event indicates that a breakpoint has been hit, and
22321-
has the following attributes:
22320+
@code{gdb.BreakpointEvent} event indicates that one or more breakpoints have
22321+
been hit, and has the following attributes:
2232222322

2232322323
@table @code
22324-
@defivar BreakpointEvent breakpoint
22325-
A reference to the breakpoint that was hit of type @code{gdb.Breakpoint}.
22324+
@defivar BreakpointEvent breakpoints
22325+
A sequence containing references to all the breakpoints (type
22326+
@code{gdb.Breakpoint}) that were hit.
2232622327
@xref{Breakpoints In Python}, for details of the @code{gdb.Breakpoint} object.
2232722328
@end defivar
22329+
@defivar BreakpointEvent breakpoint
22330+
A reference to the first breakpoint that was hit.
22331+
This function is maintained for backward compatibility and is now deprecated
22332+
in favor of the @code{gdb.BreakpointEvent.breakpoints} function.
2232822333
@end table
2232922334

2233022335
@end table

gdb/python/py-bpevent.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ static PyTypeObject breakpoint_event_object_type;
2424
/* Create and initialize a BreakpointEvent object. */
2525

2626
PyObject *
27-
create_breakpoint_event_object (PyObject *breakpoint)
27+
create_breakpoint_event_object (PyObject *breakpoint_list, PyObject *first_bp)
2828
{
2929
PyObject *breakpoint_event_obj =
3030
create_stop_event_object (&breakpoint_event_object_type);
@@ -34,7 +34,11 @@ create_breakpoint_event_object (PyObject *breakpoint)
3434

3535
if (evpy_add_attribute (breakpoint_event_obj,
3636
"breakpoint",
37-
breakpoint) < 0)
37+
first_bp) < 0)
38+
goto fail;
39+
if (evpy_add_attribute (breakpoint_event_obj,
40+
"breakpoints",
41+
breakpoint_list) < 0)
3842
goto fail;
3943

4044
return breakpoint_event_obj;

gdb/python/py-stopevent.c

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,42 @@ int
4545
emit_stop_event (struct bpstats *bs, enum target_signal stop_signal)
4646
{
4747
PyObject *stop_event_obj = NULL; /* Appease GCC warning. */
48+
PyObject *list = NULL;
49+
PyObject *first_bp = NULL;
50+
struct bpstats *current_bs;
4851

4952
if (evregpy_no_listeners_p (gdb_py_events.stop))
5053
return 0;
5154

52-
if (bs && bs->breakpoint_at
53-
&& bs->breakpoint_at->py_bp_object)
55+
/* Add any breakpoint set at this location to the list. */
56+
for (current_bs = bs; current_bs != NULL; current_bs = current_bs->next)
5457
{
55-
stop_event_obj = create_breakpoint_event_object ((PyObject *) bs
56-
->breakpoint_at
57-
->py_bp_object);
58+
if (current_bs->breakpoint_at
59+
&& current_bs->breakpoint_at->py_bp_object)
60+
{
61+
PyObject *current_py_bp =
62+
(PyObject *) current_bs->breakpoint_at->py_bp_object;
63+
64+
if (list == NULL)
65+
{
66+
list = PyList_New (0);
67+
if (!list)
68+
goto fail;
69+
}
70+
71+
if (PyList_Append (list, current_py_bp))
72+
goto fail;
73+
74+
if (first_bp == NULL)
75+
first_bp = current_py_bp;
76+
}
77+
}
78+
79+
if (list != NULL)
80+
{
81+
stop_event_obj = create_breakpoint_event_object (list, first_bp);
5882
if (!stop_event_obj)
59-
goto fail;
83+
goto fail;
6084
}
6185

6286
/* Check if the signal is "Signal 0" or "Trace/breakpoint trap". */
@@ -75,13 +99,14 @@ emit_stop_event (struct bpstats *bs, enum target_signal stop_signal)
7599
{
76100
stop_event_obj = create_stop_event_object (&stop_event_object_type);
77101
if (!stop_event_obj)
78-
goto fail;
102+
goto fail;
79103
}
80104

81105
return evpy_emit_event (stop_event_obj, gdb_py_events.stop);
82106

83-
fail:
84-
return -1;
107+
fail:
108+
Py_XDECREF (list);
109+
return -1;
85110
}
86111

87112
GDBPY_NEW_EVENT_TYPE (stop,

gdb/python/py-stopevent.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ extern void stop_evpy_dealloc (PyObject *self);
2828
extern int emit_stop_event (struct bpstats *bs,
2929
enum target_signal stop_signal);
3030

31-
extern PyObject *create_breakpoint_event_object (PyObject *breakpoint);
31+
extern PyObject *create_breakpoint_event_object (PyObject *breakpoint_list,
32+
PyObject *first_bp);
3233

3334
extern PyObject *create_signal_event_object (enum target_signal stop_signal);
3435

gdb/testsuite/ChangeLog

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
2011-04-30 Kevin Pouget <[email protected]>
2+
3+
Handle multiple breakpoint hits in Python interface:
4+
* gdb.python/py-events.exp: Set a duplicate breakpoint and check its
5+
presence.
6+
* gdb.python/py-events.py (breakpoint_stop_handler): Browse all the
7+
breakpoint hits.
8+
19
2011-09-13 Sami Wagiaalla <[email protected]>
210
Jan Kratochvil <[email protected]>
311

gdb/testsuite/gdb.python/py-events.exp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,16 @@ if ![runto_main ] then {
3939

4040
gdb_test "Test_Events" "Event testers registered."
4141

42+
gdb_breakpoint "first"
4243
gdb_breakpoint "first"
4344

4445
# Test continue event and breakpoint stop event
4546
gdb_test "continue" ".*event type: continue.*
4647
.*event type: stop.*
4748
.*stop reason: breakpoint.*
49+
.*first breakpoint number: 2.*
4850
.*breakpoint number: 2.*
51+
.*breakpoint number: 3.*
4952
all threads stopped"
5053

5154
#test exited event.

gdb/testsuite/gdb.python/py-events.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ def breakpoint_stop_handler (event):
3131
print "event type: stop"
3232
if (isinstance (event, gdb.BreakpointEvent)):
3333
print "stop reason: breakpoint"
34-
print "breakpoint number: %s" % (event.breakpoint.number)
34+
print "first breakpoint number: %s" % (event.breakpoint.number)
35+
for bp in event.breakpoints:
36+
print "breakpoint number: %s" % (bp.number)
3537
if ( event.inferior_thread is not None) :
3638
print "thread num: %s" % (event.inferior_thread.num);
3739
else:

0 commit comments

Comments
 (0)