From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21605 invoked by alias); 22 Apr 2011 09:34:00 -0000 Received: (qmail 21594 invoked by uid 22791); 22 Apr 2011 09:33:59 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RFC_ABUSE_POST,TW_EV,TW_VP,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-vw0-f41.google.com (HELO mail-vw0-f41.google.com) (209.85.212.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 22 Apr 2011 09:33:34 +0000 Received: by vws4 with SMTP id 4so480918vws.0 for ; Fri, 22 Apr 2011 02:33:33 -0700 (PDT) Received: by 10.220.93.18 with SMTP id t18mr262487vcm.233.1303464813322; Fri, 22 Apr 2011 02:33:33 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.61.6 with HTTP; Fri, 22 Apr 2011 02:33:13 -0700 (PDT) In-Reply-To: References: From: Kevin Pouget Date: Fri, 22 Apr 2011 09:34:00 -0000 Message-ID: Subject: [PATCH] Handle multiple breakpoint hits in Python interface To: gdb-patches@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-04/txt/msg00414.txt.bz2 Hello, following the discussion on http://sourceware.org/ml/gdb/2011-04/msg00131.html, here is a patch which allows Python scripts to know that several breakpoints (with the same PC) where hit during the "stop" event callback. What do you think about it ? Cordially, Kevin -- 2011-04-22=A0 Kevin Pouget=A0 =A0=A0=A0=A0=A0=A0=A0 Handle multiple breakpoint hits in Python interface: =A0=A0=A0=A0=A0=A0=A0 * gdb.texinfo (Events In Python): Indicate that multi= ple breakpoint =A0=A0=A0=A0=A0=A0=A0 may have been hit and rename the variable to breakpoi= nts. 2011-04-22=A0 Kevin Pouget=A0 =A0=A0=A0=A0=A0=A0=A0 Handle multiple breakpoint hits in Python interface: =A0=A0=A0=A0=A0=A0=A0 * python/py-bpevent.c (create_breakpoint_event_object= ): Rename C/Python =A0=A0=A0=A0=A0=A0=A0 variable to breakpoints. =A0=A0=A0=A0=A0=A0=A0 * python/py-stopevent.c (emit_stop_event): Return a P= ython tuple of =A0=A0=A0=A0=A0=A0=A0 bps instead of single breakpoint. Fix some space typo= s. =A0=A0=A0=A0=A0=A0=A0 * python/py-stopevent.c (create_breakpoint_event_obje= ct): Rename =A0=A0=A0=A0=A0=A0=A0 variable to breakpoints. 2011-04-22=A0 Kevin Pouget=A0 =A0=A0=A0=A0=A0=A0=A0 Handle multiple breakpoint hits in Python interface: =A0=A0=A0=A0=A0=A0=A0 * gdb.python/py-events.exp: Set a duplicate breakpoin= t and check its =A0=A0=A0=A0=A0=A0=A0 presence. =A0=A0=A0=A0=A0=A0=A0 * gdb.python/py-events.py (breakpoint_stop_handler): = Browse all the =A0=A0=A0=A0=A0=A0=A0 breakpoint hits. -- diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index edcf5c2..f042001 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -22086,12 +22086,12 @@ the @value{GDBN} command prompt. =A0Also emits=A0 @code{gdb.BreakpointEvent} which extends @code{gdb.StopEve= nt}. -@code{gdb.BreakpointEvent} event indicates that a breakpoint has been hit,= and -has the following attributes: +@code{gdb.BreakpointEvent} event indicates that one or several breakpoints= have +been hit, and has the following attributes: =A0@table @code -@defivar BreakpointEvent breakpoint -A reference to the breakpoint that was hit of type @code{gdb.Breakpoint}. +@defivar BreakpointEvent breakpoints +A tuple containing references to the breakpoints (type @code{gdb.Breakpoint}) that were hit. =A0@xref{Breakpoints In Python}, for details of the @code{gdb.Breakpoint} o= bject. =A0@end defivar =A0@end table diff --git a/gdb/python/py-bpevent.c b/gdb/python/py-bpevent.c index c7f7965..8c9808c 100644 --- a/gdb/python/py-bpevent.c +++ b/gdb/python/py-bpevent.c @@ -24,7 +24,7 @@ static PyTypeObject breakpoint_event_object_type; =A0/* Create and initialize a BreakpointEvent object.=A0 */ =A0PyObject * -create_breakpoint_event_object (PyObject *breakpoint) +create_breakpoint_event_object (PyObject *breakpoints) =A0{ =A0=A0 PyObject *breakpoint_event_obj =3D =A0=A0=A0=A0=A0=A0 create_stop_event_object (&breakpoint_event_object_type); @@ -33,8 +33,8 @@ create_breakpoint_event_object (PyObject *breakpoint) =A0=A0=A0=A0 goto fail; =A0=A0 if (evpy_add_attribute (breakpoint_event_obj, -=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 "breakpoint", -=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 breakpoint) < 0) +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 "breakpoints", +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 breakpoints) < 0) =A0=A0=A0=A0 goto fail; =A0=A0 return breakpoint_event_obj; diff --git a/gdb/python/py-stopevent.c b/gdb/python/py-stopevent.c index 122fe6b..5e28756 100644 --- a/gdb/python/py-stopevent.c +++ b/gdb/python/py-stopevent.c @@ -45,26 +45,37 @@ int =A0emit_stop_event (struct bpstats *bs, enum target_signal stop_signal) =A0{ =A0=A0 PyObject *stop_event_obj =3D NULL; /* Appease GCC warning.=A0 */ +=A0 PyObject *list =3D NULL; +=A0 struct bpstats *current_bs; =A0=A0 if (evregpy_no_listeners_p (gdb_py_events.stop)) =A0=A0=A0=A0 return 0; -=A0 if (bs && bs->breakpoint_at -=A0=A0=A0=A0=A0 && bs->breakpoint_at->py_bp_object) +=A0 /*Add any breakpoint set at this location to the list.=A0 */ +=A0 for (current_bs =3D bs; current_bs !=3D NULL; current_bs =3D current_b= s->next) =A0=A0=A0=A0 { -=A0=A0=A0=A0=A0 stop_event_obj =3D create_breakpoint_event_object ((PyObje= ct *) bs -=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 ->breakpoint_at -=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 ->py_bp_object); +=A0=A0=A0=A0=A0 if (current_bs->breakpoint_at +=A0=A0=A0=A0=A0=A0=A0=A0=A0 && current_bs->breakpoint_at->py_bp_object) +=A0=A0=A0=A0=A0=A0=A0 { +=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (list =3D=3D NULL) +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 list =3D PyList_New (0); + +=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (PyList_Append (list, (PyObject *) current_bs->breakpoint_at->py_bp_object)) +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 goto fail; +=A0=A0=A0=A0=A0=A0=A0 } +=A0=A0=A0 } +=A0 if (list !=3D NULL) +=A0=A0=A0 { +=A0=A0=A0=A0=A0 stop_event_obj =3D create_breakpoint_event_object (list); =A0=A0=A0=A0=A0=A0 if (!stop_event_obj) -=A0=A0=A0 goto fail; +=A0=A0=A0=A0=A0=A0=A0 goto fail; =A0=A0=A0=A0 } =A0=A0 /* Check if the signal is "Signal 0" or "Trace/breakpoint trap".=A0 = */ =A0=A0 if (stop_signal !=3D TARGET_SIGNAL_0 =A0=A0=A0=A0=A0=A0 && stop_signal !=3D TARGET_SIGNAL_TRAP) =A0=A0=A0=A0 { -=A0=A0=A0=A0=A0 stop_event_obj =3D -=A0=A0=A0 =A0 create_signal_event_object (stop_signal); +=A0=A0=A0=A0=A0 stop_event_obj =3D create_signal_event_object (stop_signal= ); =A0=A0=A0=A0=A0=A0 if (!stop_event_obj) =A0=A0=A0=A0 goto fail; =A0=A0=A0=A0 } @@ -75,7 +86,7 @@ emit_stop_event (struct bpstats *bs, enum target_signal stop_signal) =A0=A0=A0=A0 { =A0=A0=A0=A0=A0=A0 stop_event_obj =3D create_stop_event_object (&stop_event= _object_type); =A0=A0=A0=A0=A0=A0 if (!stop_event_obj) -=A0=A0=A0 goto fail; +=A0=A0=A0=A0=A0=A0=A0 goto fail; =A0=A0=A0=A0 } =A0=A0 return evpy_emit_event (stop_event_obj, gdb_py_events.stop); diff --git a/gdb/python/py-stopevent.h b/gdb/python/py-stopevent.h index 52f3511..4633ffd 100644 --- a/gdb/python/py-stopevent.h +++ b/gdb/python/py-stopevent.h @@ -28,7 +28,7 @@ extern void stop_evpy_dealloc (PyObject *self); =A0extern int emit_stop_event (struct bpstats *bs, =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0 enum target_signal stop_signal); -extern PyObject *create_breakpoint_event_object (PyObject *breakpoint); +extern PyObject *create_breakpoint_event_object (PyObject *breakpoints); =A0extern PyObject *create_signal_event_object (enum target_signal stop_sig= nal); diff --git a/gdb/testsuite/gdb.python/py-events.exp b/gdb/testsuite/gdb.python/py-events.exp index e5d6daf..2b7cc08 100644 --- a/gdb/testsuite/gdb.python/py-events.exp +++ b/gdb/testsuite/gdb.python/py-events.exp @@ -45,12 +45,14 @@ if ![runto_main ] then { =A0gdb_test "Test_Events" "Event testers registered." =A0gdb_breakpoint "first" +gdb_breakpoint "first" =A0# Test continue event and breakpoint stop event =A0gdb_test "continue" ".*event type: continue.* =A0.*event type: stop.* =A0.*stop reason: breakpoint.* =A0.*breakpoint number: 2.* +.*breakpoint number: 3.* =A0all threads stopped" =A0#test exited event. diff --git a/gdb/testsuite/gdb.python/py-events.py b/gdb/testsuite/gdb.python/py-events.py index 9f05b9f..fb8f7e4 100644 --- a/gdb/testsuite/gdb.python/py-events.py +++ b/gdb/testsuite/gdb.python/py-events.py @@ -31,7 +31,8 @@ def breakpoint_stop_handler (event): =A0=A0=A0=A0=A0=A0=A0=A0 print "event type: stop" =A0=A0=A0=A0 if (isinstance (event, gdb.BreakpointEvent)): =A0=A0=A0=A0=A0=A0=A0=A0 print "stop reason: breakpoint" -=A0=A0=A0=A0=A0=A0=A0 print "breakpoint number: %s" % (event.breakpoint.nu= mber) +=A0=A0=A0=A0=A0=A0=A0 for bp in event.breakpoints: +=A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0 print "breakpoint number: %s" % (bp.number) =A0=A0=A0=A0=A0=A0=A0=A0 if ( event.inferior_thread is not None) : =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 print "thread num: %s" % (event.inferi= or_thread.num); =A0=A0=A0=A0=A0=A0=A0=A0 else: -- 1.7.4.4