aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Hayward <alan.hayward@arm.com>2019-08-21 15:36:37 +0100
committerAlan Hayward <alan.hayward@arm.com>2019-09-02 14:00:42 +0100
commitd90b8f2632cded4792f18d8bb92bacc21d93eb0a (patch)
treedb5986705da30adea805e4f0fae61d0631458260
parentUse gdbarch for probe::get_argument_count (diff)
downloadbinutils-gdb-d90b8f2632cded4792f18d8bb92bacc21d93eb0a.tar.gz
binutils-gdb-d90b8f2632cded4792f18d8bb92bacc21d93eb0a.tar.bz2
binutils-gdb-d90b8f2632cded4792f18d8bb92bacc21d93eb0a.zip
Check arguments for all probes before using them
There is a long standing bug in the Arm toolchain where invalid stap probes get created due to the probes referring to symbols which have been resolved away. More details are here: https://bugzilla.redhat.com/show_bug.cgi?id=1196181 When these invalid probes are present, GDB will create the breakpoints and then fail to stop. The errors are only spotted the first time GDB stops, which is too late. The solution is to ensure the arguments for all the probes are resolved before using them. This fixes >100 timeouts when running break-interp.exp when using bad probes. gdb/ChangeLog: * solib-svr4.c (svr4_find_and_create_probe_breakpoints): Check all probe arguments.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/solib-svr4.c18
2 files changed, 19 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d0e4258c4f7..08615f462e1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
2019-09-02 Alan Hayward <alan.hayward@arm.com>
+ * solib-svr4.c (svr4_find_and_create_probe_breakpoints): Check all
+ probe arguments.
+
+2019-09-02 Alan Hayward <alan.hayward@arm.com>
+
* break-catch-throw.c (fetch_probe_arguments): Use gdbarch.
* dtrace-probe.c (dtrace_probe::get_argument_count): Likewise.
* probe.c (probe_safe_evaluate_at_pc) (compute_probe_arg)
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 2a44dd69858..ffae26bfc5f 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -2071,7 +2071,6 @@ svr4_find_and_create_probe_breakpoints (svr4_info *info,
bool with_prefix)
{
std::vector<probe *> probes[NUM_PROBES];
- bool checked_can_use_probe_arguments = false;
for (int i = 0; i < NUM_PROBES; i++)
{
@@ -2102,12 +2101,23 @@ svr4_find_and_create_probe_breakpoints (svr4_info *info,
return false;
/* Ensure probe arguments can be evaluated. */
- if (!checked_can_use_probe_arguments)
+ for (probe *p : probes[i])
{
- probe *p = probes[i][0];
if (!p->can_evaluate_arguments ())
return false;
- checked_can_use_probe_arguments = true;
+ /* This will fail if the probe is invalid. This has been seen on Arm
+ due to references to symbols that have been resolved away. */
+ try
+ {
+ p->get_argument_count (gdbarch);
+ }
+ catch (const gdb_exception_error &ex)
+ {
+ exception_print (gdb_stderr, ex);
+ warning (_("Initializing probes-based dynamic linker interface "
+ "failed.\nReverting to original interface."));
+ return false;
+ }
}
}