public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-sergiodj-stap: implement longjmp probes this is still untested
@ 2011-03-17 13:59 tromey
0 siblings, 0 replies; only message in thread
From: tromey @ 2011-03-17 13:59 UTC (permalink / raw)
To: archer-commits
The branch, archer-sergiodj-stap has been updated
via 8fed9947347921e703b14558a062699a1ba8b563 (commit)
from d909b1c3af91be2fe436ed45662a8301cbd6c86d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 8fed9947347921e703b14558a062699a1ba8b563
Author: Tom Tromey <tromey@redhat.com>
Date: Thu Mar 17 07:57:48 2011 -0600
implement longjmp probes
this is still untested
-----------------------------------------------------------------------
Summary of changes:
gdb/breakpoint.c | 31 +++++++++++++++++++++++++++++--
gdb/infrun.c | 31 +++++++++++++------------------
gdb/stap-probe.c | 25 +++++++++++++++++++++++++
gdb/stap-probe.h | 6 ++++++
4 files changed, 73 insertions(+), 20 deletions(-)
First 500 lines of diff:
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 353b051..2126875 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -2113,6 +2113,9 @@ struct breakpoint_objfile_data
/* Minimal symbol(s) for "longjmp", "siglongjmp", etc. (if any). */
struct minimal_symbol *longjmp_msym[NUM_LONGJMP_NAMES];
+ /* SystemTap probe point for longjmp (if any). */
+ const struct stap_probe *longjmp_probe;
+
/* Minimal symbol for "std::terminate()" (if any). */
struct minimal_symbol *terminate_msym;
@@ -2125,6 +2128,9 @@ struct breakpoint_objfile_data
static const struct objfile_data *breakpoint_objfile_key;
+/* SystemTap probe not found sentinel. */
+static const struct stap_probe probe_not_found;
+
/* Minimal symbol not found sentinel. */
static struct minimal_symbol msym_not_found;
@@ -2232,6 +2238,29 @@ create_longjmp_master_breakpoint (void)
bp_objfile_data = get_breakpoint_objfile_data (objfile);
+ if (bp_objfile_data->longjmp_probe != &probe_not_found)
+ {
+ if (bp_objfile_data->longjmp_probe == NULL)
+ bp_objfile_data->longjmp_probe
+ = find_probe_in_objfile (objfile, "libc", "longjmp");
+
+ if (bp_objfile_data->longjmp_probe)
+ {
+ struct breakpoint *b;
+ struct gdbarch *gdbarch = get_objfile_arch (objfile);
+
+ b = create_internal_breakpoint (gdbarch,
+ bp_objfile_data->longjmp_probe->address,
+ bp_longjmp_master);
+ b->addr_string = xstrdup ("probe:libc:longjmp");
+ b->enable_state = bp_disabled;
+
+ continue;
+ }
+ else
+ bp_objfile_data->longjmp_probe = &probe_not_found;
+ }
+
for (i = 0; i < NUM_LONGJMP_NAMES; i++)
{
struct breakpoint *b;
@@ -2328,8 +2357,6 @@ create_std_terminate_master_breakpoint (void)
void
create_exception_master_breakpoint (void)
{
- static struct stap_probe probe_not_found;
-
struct objfile *objfile;
const char *const func_name = "_Unwind_DebugHook";
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 0779215..751c9ef 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -4166,9 +4166,17 @@ process_event_stop_test:
if (what.is_longjmp)
{
- if (!gdbarch_get_longjmp_target_p (gdbarch)
- || !gdbarch_get_longjmp_target (gdbarch,
- frame, &jmp_buf_pc))
+ struct value *arg_value;
+
+ /* If we set the longjmp breakpoint via a SystemTap probe,
+ then use it to extract the arguments. The destination
+ PC is the third argument to the probe. */
+ arg_value = stap_safe_evaluate_at_pc (frame, 2);
+ if (arg_value)
+ jmp_buf_pc = value_as_address (arg_value);
+ else if (!gdbarch_get_longjmp_target_p (gdbarch)
+ || !gdbarch_get_longjmp_target (gdbarch,
+ frame, &jmp_buf_pc))
{
if (debug_infrun)
fprintf_unfiltered (gdb_stdlog,
@@ -5269,27 +5277,14 @@ insert_exception_resume_from_probe (struct thread_info *tp,
struct objfile *objfile,
struct frame_info *frame)
{
- int n_probes;
struct value *arg_value;
CORE_ADDR handler;
struct breakpoint *bp;
- /* This is really a "can't happen", but we are paranoid. */
- if (!objfile->sf || !objfile->sf->sym_probe_fns)
+ arg_value = stap_safe_evaluate_at_pc (frame, 1);
+ if (!arg_value)
return;
- n_probes
- = objfile->sf->sym_probe_fns->sym_get_probe_argument_count (objfile,
- probe);
- if (n_probes < 2)
- return;
-
- /* We are interested in the second argument to the probe. */
- arg_value
- = objfile->sf->sym_probe_fns->sym_evaluate_probe_argument (objfile,
- probe,
- frame,
- 1);
handler = value_as_address (arg_value);
if (debug_infrun)
diff --git a/gdb/stap-probe.c b/gdb/stap-probe.c
index dd86b62..90c6c4f 100644
--- a/gdb/stap-probe.c
+++ b/gdb/stap-probe.c
@@ -1160,6 +1160,31 @@ stap_evaluate_probe_argument (struct objfile *objfile,
return stap_evaluate_probe_argument_1 (objfile, probe, frame, n);
}
+/* See documentation in stap-probe.h. */
+
+struct value *
+stap_safe_evaluate_at_pc (struct frame_info *frame, int n)
+{
+ const struct stap_probe *probe;
+ struct objfile *objfile;
+ int n_probes;
+
+ probe = find_probe_by_pc (get_frame_pc (frame), &objfile);
+ if (!probe)
+ return NULL;
+ gdb_assert (objfile->sf && objfile->sf->sym_probe_fns);
+
+ n_probes
+ = objfile->sf->sym_probe_fns->sym_get_probe_argument_count (objfile,
+ probe);
+ if (n >= n_probes)
+ return NULL;
+
+ return objfile->sf->sym_probe_fns->sym_evaluate_probe_argument (objfile,
+ probe,
+ frame,
+ n);
+}
void
stap_free_parsed_args (struct stap_args_info *parsed_args)
diff --git a/gdb/stap-probe.h b/gdb/stap-probe.h
index a2c9b30..f6e67c2 100644
--- a/gdb/stap-probe.h
+++ b/gdb/stap-probe.h
@@ -86,4 +86,10 @@ extern struct value *stap_evaluate_probe_argument (struct objfile *objfile,
struct frame_info *frame,
int n);
+/* A convenience function that finds a probe at the PC in FRAME and
+ evaluates argument N. If there is no probe at that location, or if
+ the probe does not have enough arguments, this returns NULL. */
+extern struct value *stap_safe_evaluate_at_pc (struct frame_info *frame,
+ int n);
+
#endif /* !defined (STAP_PROBE_H) */
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2011-03-17 13:59 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-03-17 13:59 [SCM] archer-sergiodj-stap: implement longjmp probes this is still untested tromey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).