diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/solib-svr4.c | 18 |
2 files changed, 19 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d0e4258..08615f4 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 2a44dd6..ffae26b 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; + } } } |