• R/O
  • HTTP
  • SSH
  • HTTPS

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

GNU Binutils with patches for OS216


Commit MetaInfo

修订版3bd7e5b7ee5ea0b3bbb4030ca841f66faad74f0f (tree)
时间2015-09-02 13:13:06
作者Sergio Durigan Junior <sergiodj@redh...>
CommiterSergio Durigan Junior

Log Message

Catching errors on probes-based dynamic linker interface

This patch is intended to make the interaction between the
probes-based dynamic linker interface and the SystemTap SDT probe code
on GDB more robust. It does that by wrapping the calls to the probe
API with TRY...CATCH'es, so that any exception thrown will be caught
and handled properly.

The idea for this patch came from
<https://bugzilla.redhat.com/show_bug.cgi?id=1196181>, which is a bug
initially filed against Fedora GDB (but now under Fedora GLIBC). This
bug happens on armhfp (although it could happen on other targets as
well), and is triggered because GCC generates a strange argument for
one of the probes used by GDB in the dynamic linker interface. As can
be seen in the bug, this argument is "-4@.L1052".

I don't want to discuss the reasons for this argument to be there
(this discussion belongs to the bug, or to another thread), but GDB
could definitely do a better error handling here. Currently, one sees
the following message when there is an error in the probes-based
dynamic linker interface:

(gdb) run
Starting program: /bin/inferior
warning: Probes-based dynamic linker interface failed.
Reverting to original interface.
Cannot parse expression .L976 4@r4'.
(gdb)

Which means that one needs to explicitly issue a "continue" command to
make GDB continue running the inferior, even though this error is not
fatal and GDB will fallback to the old interface automatically.

This is where this patch helps: it makes GDB still print the necessary
warnings or error messages, but it *also* does not stop the inferior
unnecessarily.

I have tested this patch on the systems where this error happens, but
I could not come up with a way to create a testcase for it.
Nevertheless, it should be straightforward to see that this patch does
improve the current situation.

gdb/ChangeLog:
2015-09-01 Sergio Durigan Junior <sergiodj@redhat.com>

* solib-svr4.c (solib_event_probe_action): Call
get_probe_argument_count using TRY...CATCH.
(svr4_handle_solib_event): Likewise, for evaluate_probe_argument.

更改概述

差异

--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
11 2015-09-01 Sergio Durigan Junior <sergiodj@redhat.com>
22
3+ * solib-svr4.c (solib_event_probe_action): Call
4+ get_probe_argument_count using TRY...CATCH.
5+ (svr4_handle_solib_event): Likewise, for evaluate_probe_argument.
6+
7+2015-09-01 Sergio Durigan Junior <sergiodj@redhat.com>
8+
39 * probe.h (struct probe_ops) <get_probe_argument_count,
410 evaluate_probe_argument, enable_probe, disable_probe>: Mention in
511 the comment that the function can throw an exception.
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1786,7 +1786,23 @@ solib_event_probe_action (struct probe_and_action *pa)
17861786 arg0: Lmid_t lmid (mandatory)
17871787 arg1: struct r_debug *debug_base (mandatory)
17881788 arg2: struct link_map *new (optional, for incremental updates) */
1789- probe_argc = get_probe_argument_count (pa->probe, frame);
1789+ TRY
1790+ {
1791+ probe_argc = get_probe_argument_count (pa->probe, frame);
1792+ }
1793+ CATCH (ex, RETURN_MASK_ERROR)
1794+ {
1795+ exception_print (gdb_stderr, ex);
1796+ probe_argc = 0;
1797+ }
1798+ END_CATCH
1799+
1800+ /* If get_probe_argument_count throws an exception, probe_argc will
1801+ be set to zero. However, if pa->probe does not have arguments,
1802+ then get_probe_argument_count will succeed but probe_argc will
1803+ also be zero. Both cases happen because of different things, but
1804+ they are treated equally here: action will be set to
1805+ PROBES_INTERFACE_FAILED. */
17901806 if (probe_argc == 2)
17911807 action = FULL_RELOAD;
17921808 else if (probe_argc < 2)
@@ -1940,7 +1956,17 @@ svr4_handle_solib_event (void)
19401956 usm_chain = make_cleanup (resume_section_map_updates_cleanup,
19411957 current_program_space);
19421958
1943- val = evaluate_probe_argument (pa->probe, 1, frame);
1959+ TRY
1960+ {
1961+ val = evaluate_probe_argument (pa->probe, 1, frame);
1962+ }
1963+ CATCH (ex, RETURN_MASK_ERROR)
1964+ {
1965+ exception_print (gdb_stderr, ex);
1966+ val = NULL;
1967+ }
1968+ END_CATCH
1969+
19441970 if (val == NULL)
19451971 {
19461972 do_cleanups (old_chain);
@@ -1971,7 +1997,18 @@ svr4_handle_solib_event (void)
19711997
19721998 if (action == UPDATE_OR_RELOAD)
19731999 {
1974- val = evaluate_probe_argument (pa->probe, 2, frame);
2000+ TRY
2001+ {
2002+ val = evaluate_probe_argument (pa->probe, 2, frame);
2003+ }
2004+ CATCH (ex, RETURN_MASK_ERROR)
2005+ {
2006+ exception_print (gdb_stderr, ex);
2007+ do_cleanups (old_chain);
2008+ return;
2009+ }
2010+ END_CATCH
2011+
19752012 if (val != NULL)
19762013 lm = value_as_address (val);
19772014