mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-31 10:09:16 +08:00
Fix scripted probe breakpoints
The documentation for make-breakpoint from the Guile API and the `spec' variant of the gdb.Breakpoint constructor from the Python API state that the format acceptable for location strings is the same as that accepted by the break command. However, using the -probe qualifier at the beginning of the location string causes a GDB internal error as it attempts to decode a probe location in the wrong code path. Without this functionality, there doesn't appear to be another way to set breakpoints on probe points from Python or Guile scripts. This patch introduces a new helper function that returns a breakpoint_ops instance appropriate for a parsed location and updates the Guile and Python bindings to use said function, rather than the current hard-coded use of bkpt_breakpoint_ops. Since this logic is duplicated in the handling of the `break' and `trace' commands, those are also updated to call into the new helper function. gdb/ChangeLog: 2019-12-10 George Barrett <bob@bob131.so> Fix scripted probe breakpoints. * breakpoint.c (tracepoint_probe_breakpoint_ops): Move declaration forward. (breakpoint_ops_for_event_location_type) (breakpoint_ops_for_event_location): Add function definitions. (break_command_1, trace_command): Use breakpoint_ops_for_event_location. * breakpoint.h (breakpoint_ops_for_event_location): Add function declarations. * guile/scm-breakpoint.c (gdbscm_register_breakpoint_x): Use breakpoint_ops_for_event_location. * python/py-breakpoint.c (bppy_init): Use breakpoint_ops_for_event_location. gdb/testsuite/ChangeLog: 2019-12-10 George Barrett <bob@bob131.so> Test scripted probe breakpoints. * gdb.guile/scm-breakpoint.c (main): Add probe point. * gdb.python/py-breakpoint.c (main): Likewise. * gdb.guile/scm-breakpoint.exp (test_bkpt_probe): Add probe specifier test. * gdb.python/py-breakpoint.exp (test_bkpt_probe): Likewise.
This commit is contained in:

committed by
Simon Marchi

parent
330f1d3825
commit
bac7c5cf92
@ -1,3 +1,19 @@
|
||||
2019-12-10 George Barrett <bob@bob131.so>
|
||||
|
||||
Fix scripted probe breakpoints.
|
||||
* breakpoint.c (tracepoint_probe_breakpoint_ops): Move
|
||||
declaration forward.
|
||||
(breakpoint_ops_for_event_location_type)
|
||||
(breakpoint_ops_for_event_location): Add function definitions.
|
||||
(break_command_1, trace_command): Use
|
||||
breakpoint_ops_for_event_location.
|
||||
* breakpoint.h (breakpoint_ops_for_event_location): Add function
|
||||
declarations.
|
||||
* guile/scm-breakpoint.c (gdbscm_register_breakpoint_x): Use
|
||||
breakpoint_ops_for_event_location.
|
||||
* python/py-breakpoint.c (bppy_init): Use
|
||||
breakpoint_ops_for_event_location.
|
||||
|
||||
2019-12-09 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
|
||||
|
||||
* gdbtypes.c (rank_one_type): Return INCOMPATIBLE_TYPE_BADNESS
|
||||
|
@ -246,6 +246,9 @@ struct breakpoint_ops bkpt_breakpoint_ops;
|
||||
/* Breakpoints set on probes. */
|
||||
static struct breakpoint_ops bkpt_probe_breakpoint_ops;
|
||||
|
||||
/* Tracepoints set on probes. */
|
||||
static struct breakpoint_ops tracepoint_probe_breakpoint_ops;
|
||||
|
||||
/* Dynamic printf class type. */
|
||||
struct breakpoint_ops dprintf_breakpoint_ops;
|
||||
|
||||
@ -9163,6 +9166,41 @@ decode_static_tracepoint_spec (const char **arg_p)
|
||||
return sals;
|
||||
}
|
||||
|
||||
/* Returns the breakpoint ops appropriate for use with with LOCATION_TYPE and
|
||||
according to IS_TRACEPOINT. */
|
||||
|
||||
static const struct breakpoint_ops *
|
||||
breakpoint_ops_for_event_location_type (enum event_location_type location_type,
|
||||
bool is_tracepoint)
|
||||
{
|
||||
if (is_tracepoint)
|
||||
{
|
||||
if (location_type == PROBE_LOCATION)
|
||||
return &tracepoint_probe_breakpoint_ops;
|
||||
else
|
||||
return &tracepoint_breakpoint_ops;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (location_type == PROBE_LOCATION)
|
||||
return &bkpt_probe_breakpoint_ops;
|
||||
else
|
||||
return &bkpt_breakpoint_ops;
|
||||
}
|
||||
}
|
||||
|
||||
/* See breakpoint.h. */
|
||||
|
||||
const struct breakpoint_ops *
|
||||
breakpoint_ops_for_event_location (const struct event_location *location,
|
||||
bool is_tracepoint)
|
||||
{
|
||||
if (location != nullptr)
|
||||
return breakpoint_ops_for_event_location_type
|
||||
(event_location_type (location), is_tracepoint);
|
||||
return is_tracepoint ? &tracepoint_breakpoint_ops : &bkpt_breakpoint_ops;
|
||||
}
|
||||
|
||||
/* See breakpoint.h. */
|
||||
|
||||
int
|
||||
@ -9344,16 +9382,10 @@ break_command_1 (const char *arg, int flag, int from_tty)
|
||||
enum bptype type_wanted = (flag & BP_HARDWAREFLAG
|
||||
? bp_hardware_breakpoint
|
||||
: bp_breakpoint);
|
||||
struct breakpoint_ops *ops;
|
||||
|
||||
event_location_up location = string_to_event_location (&arg, current_language);
|
||||
|
||||
/* Matching breakpoints on probes. */
|
||||
if (location != NULL
|
||||
&& event_location_type (location.get ()) == PROBE_LOCATION)
|
||||
ops = &bkpt_probe_breakpoint_ops;
|
||||
else
|
||||
ops = &bkpt_breakpoint_ops;
|
||||
const struct breakpoint_ops *ops = breakpoint_ops_for_event_location
|
||||
(location.get (), false /* is_tracepoint */);
|
||||
|
||||
create_breakpoint (get_current_arch (),
|
||||
location.get (),
|
||||
@ -12802,8 +12834,7 @@ tracepoint_decode_location (struct breakpoint *b,
|
||||
|
||||
struct breakpoint_ops tracepoint_breakpoint_ops;
|
||||
|
||||
/* The breakpoint_ops structure to be use on tracepoints placed in a
|
||||
static probe. */
|
||||
/* Virtual table for tracepoints on static probes. */
|
||||
|
||||
static void
|
||||
tracepoint_probe_create_sals_from_location
|
||||
@ -12824,8 +12855,6 @@ tracepoint_probe_decode_location (struct breakpoint *b,
|
||||
return bkpt_probe_decode_location (b, location, search_pspace);
|
||||
}
|
||||
|
||||
static struct breakpoint_ops tracepoint_probe_breakpoint_ops;
|
||||
|
||||
/* Dprintf breakpoint_ops methods. */
|
||||
|
||||
static void
|
||||
@ -14467,15 +14496,10 @@ set_tracepoint_count (int num)
|
||||
static void
|
||||
trace_command (const char *arg, int from_tty)
|
||||
{
|
||||
struct breakpoint_ops *ops;
|
||||
|
||||
event_location_up location = string_to_event_location (&arg,
|
||||
current_language);
|
||||
if (location != NULL
|
||||
&& event_location_type (location.get ()) == PROBE_LOCATION)
|
||||
ops = &tracepoint_probe_breakpoint_ops;
|
||||
else
|
||||
ops = &tracepoint_breakpoint_ops;
|
||||
const struct breakpoint_ops *ops = breakpoint_ops_for_event_location
|
||||
(location.get (), true /* is_tracepoint */);
|
||||
|
||||
create_breakpoint (get_current_arch (),
|
||||
location.get (),
|
||||
|
@ -1352,6 +1352,15 @@ extern void init_catchpoint (struct breakpoint *b,
|
||||
extern void install_breakpoint (int internal, std::unique_ptr<breakpoint> &&b,
|
||||
int update_gll);
|
||||
|
||||
/* Returns the breakpoint ops appropriate for use with with LOCATION and
|
||||
according to IS_TRACEPOINT. Use this to ensure, for example, that you pass
|
||||
the correct ops to create_breakpoint for probe locations. If LOCATION is
|
||||
NULL, returns bkpt_breakpoint_ops (or tracepoint_breakpoint_ops, if
|
||||
IS_TRACEPOINT is true). */
|
||||
|
||||
extern const struct breakpoint_ops *breakpoint_ops_for_event_location
|
||||
(const struct event_location *location, bool is_tracepoint);
|
||||
|
||||
/* Flags that can be passed down to create_breakpoint, etc., to affect
|
||||
breakpoint creation in several ways. */
|
||||
|
||||
|
@ -437,13 +437,15 @@ gdbscm_register_breakpoint_x (SCM self)
|
||||
{
|
||||
case bp_breakpoint:
|
||||
{
|
||||
const breakpoint_ops *ops =
|
||||
breakpoint_ops_for_event_location (eloc.get (), false);
|
||||
create_breakpoint (get_current_arch (),
|
||||
eloc.get (), NULL, -1, NULL,
|
||||
0,
|
||||
0, bp_breakpoint,
|
||||
0,
|
||||
AUTO_BOOLEAN_TRUE,
|
||||
&bkpt_breakpoint_ops,
|
||||
ops,
|
||||
0, 1, internal, 0);
|
||||
break;
|
||||
}
|
||||
|
@ -828,13 +828,16 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
|
||||
location = new_explicit_location (&explicit_loc);
|
||||
}
|
||||
|
||||
const struct breakpoint_ops *ops =
|
||||
breakpoint_ops_for_event_location (location.get (), false);
|
||||
|
||||
create_breakpoint (python_gdbarch,
|
||||
location.get (), NULL, -1, NULL,
|
||||
0,
|
||||
temporary_bp, bp_breakpoint,
|
||||
0,
|
||||
AUTO_BOOLEAN_TRUE,
|
||||
&bkpt_breakpoint_ops,
|
||||
ops,
|
||||
0, 1, internal_bp, 0);
|
||||
break;
|
||||
}
|
||||
|
@ -1,3 +1,12 @@
|
||||
2019-12-10 George Barrett <bob@bob131.so>
|
||||
|
||||
Test scripted probe breakpoints.
|
||||
* gdb.guile/scm-breakpoint.c (main): Add probe point.
|
||||
* gdb.python/py-breakpoint.c (main): Likewise.
|
||||
* gdb.guile/scm-breakpoint.exp (test_bkpt_probe): Add probe
|
||||
specifier test.
|
||||
* gdb.python/py-breakpoint.exp (test_bkpt_probe): Likewise.
|
||||
|
||||
2019-12-09 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
|
||||
|
||||
* gdb.cp/rvalue-ref-overload.cc (g): New function that takes
|
||||
|
@ -15,6 +15,10 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifdef USE_PROBES
|
||||
#include <sys/sdt.h>
|
||||
#endif
|
||||
|
||||
int result = 0;
|
||||
|
||||
int multiply (int i)
|
||||
@ -38,6 +42,9 @@ int main (int argc, char *argv[])
|
||||
{
|
||||
result += multiply (foo); /* Break at multiply. */
|
||||
result += add (bar); /* Break at add. */
|
||||
#ifdef USE_PROBES
|
||||
DTRACE_PROBE1 (test, result_updated, result);
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0; /* Break at end. */
|
||||
|
@ -499,6 +499,28 @@ proc test_bkpt_address {} {
|
||||
".*Breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\."
|
||||
}
|
||||
|
||||
proc test_bkpt_probe {} {
|
||||
global decimal hex testfile srcfile
|
||||
|
||||
if { [prepare_for_testing "failed to prepare" ${testfile}-probes \
|
||||
${srcfile} {additional_flags=-DUSE_PROBES}] } {
|
||||
return -1
|
||||
}
|
||||
|
||||
if ![gdb_guile_runto_main] then {
|
||||
return
|
||||
}
|
||||
|
||||
gdb_scm_test_silent_cmd \
|
||||
"guile (define bp1 (make-breakpoint \"-probe test:result_updated\"))" \
|
||||
"create probe breakpoint"
|
||||
|
||||
gdb_test \
|
||||
"guile (register-breakpoint! bp1)" \
|
||||
"Breakpoint $decimal at $hex" \
|
||||
"register probe breakpoint"
|
||||
}
|
||||
|
||||
test_bkpt_basic
|
||||
test_bkpt_deletion
|
||||
test_bkpt_cond_and_cmds
|
||||
@ -508,3 +530,4 @@ test_bkpt_internal
|
||||
test_bkpt_eval_funcs
|
||||
test_bkpt_registration
|
||||
test_bkpt_address
|
||||
test_bkpt_probe
|
||||
|
@ -15,6 +15,10 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifdef USE_PROBES
|
||||
#include <sys/sdt.h>
|
||||
#endif
|
||||
|
||||
int result = 0;
|
||||
|
||||
namespace foo_ns
|
||||
@ -46,6 +50,9 @@ int main (int argc, char *argv[])
|
||||
{
|
||||
result += multiply (foo); /* Break at multiply. */
|
||||
result += add (bar); /* Break at add. */
|
||||
#ifdef USE_PROBES
|
||||
DTRACE_PROBE1 (test, result_updated, result);
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0; /* Break at end. */
|
||||
|
@ -695,6 +695,25 @@ proc_with_prefix test_bkpt_qualified {} {
|
||||
"-q in spec string and qualified false"
|
||||
}
|
||||
|
||||
proc_with_prefix test_bkpt_probe {} {
|
||||
global decimal hex testfile srcfile
|
||||
|
||||
if { [prepare_for_testing "failed to prepare" ${testfile}-probes \
|
||||
${srcfile} {debug c++ additional_flags=-DUSE_PROBES}] } {
|
||||
return -1
|
||||
}
|
||||
|
||||
if ![runto_main] then {
|
||||
fail "cannot run to main."
|
||||
return 0
|
||||
}
|
||||
|
||||
gdb_test \
|
||||
"python gdb.Breakpoint(\"-probe test:result_updated\")" \
|
||||
"Breakpoint $decimal at $hex" \
|
||||
"-probe in spec string"
|
||||
}
|
||||
|
||||
test_bkpt_basic
|
||||
test_bkpt_deletion
|
||||
test_bkpt_cond_and_cmds
|
||||
@ -708,3 +727,4 @@ test_bkpt_pending
|
||||
test_bkpt_events
|
||||
test_bkpt_explicit_loc
|
||||
test_bkpt_qualified
|
||||
test_bkpt_probe
|
||||
|
Reference in New Issue
Block a user