This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH v2 1/5] Extend test gdb.python/py-recurse-unwind.exp
On Wednesday, November 16 2016, Kevin Buettner wrote:
>> Otherwise, LGTM.
>
> Thanks again for the review.
>
> This is what I've pushed...
Heya,
While checking some BuildBot logs, I noticed a few new FAILures
introduced by this commit. You can see them at:
<https://sourceware.org/ml/gdb-testers/2016-q4/msg03062.html>
Cheers,
> commit 1a2f3d7ff1d79b1290704e48c71e905b987393a6
> Author: Kevin Buettner <kevinb@redhat.com>
> Date: Mon Sep 26 15:00:37 2016 -0700
>
> Extend test gdb.python/py-recurse-unwind.exp
>
> This patch modifies the unwinder (sniffer) defined in
> py-recurse-unwind.py so that, depending upon the value of one of its
> class variables, it will take different paths through the code,
> testing different functionality.
>
> The original test attempted to obtain the value of an undefined
> symbol.
>
> This somewhat expanded test checks to see if 'pc' can be read via
> gdb.PendingFrame.read_register() and also via gdb.parse_and_eval().
>
> gdb/testsuite/ChangeLog:
>
> * gdb.python/py-recurse-unwind.c (main): Add loop.
> * gdb.python/py-recurse-unwind.py (TestUnwinder): Add calls
> to read_register() and gdb.parse_and_eval(). Make each code
> call a separate case that can be individually tested.
> * gdb.python/py-recurse-unwind.exp (cont_and_backtrace): New
> proc. Call cont_and_backtrace for each of the code paths that
> we want to test in the unwinder.
> ---
> gdb/testsuite/ChangeLog | 10 ++++
> gdb/testsuite/gdb.python/py-recurse-unwind.c | 6 ++-
> gdb/testsuite/gdb.python/py-recurse-unwind.exp | 63 ++++++++++++++++----------
> gdb/testsuite/gdb.python/py-recurse-unwind.py | 29 ++++++++++--
> 4 files changed, 79 insertions(+), 29 deletions(-)
>
> diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
> index d9e61f4..82126c0 100644
> --- a/gdb/testsuite/ChangeLog
> +++ b/gdb/testsuite/ChangeLog
> @@ -1,3 +1,13 @@
> +2016-11-16 Kevin Buettner <kevinb@redhat.com>
> +
> + * gdb.python/py-recurse-unwind.c (main): Add loop.
> + * gdb.python/py-recurse-unwind.py (TestUnwinder): Add calls
> + to read_register() and gdb.parse_and_eval(). Make each code
> + call a separate case that can be individually tested.
> + * gdb.python/py-recurse-unwind.exp (cont_and_backtrace): New
> + proc. Call cont_and_backtrace for each of the code paths that
> + we want to test in the unwinder.
> +
> 2016-11-15 Andreas Arnez <arnez@linux.vnet.ibm.com>
>
> * gdb.dwarf2/bitfield-parent-optimized-out.exp: Fix DWARF code for
> diff --git a/gdb/testsuite/gdb.python/py-recurse-unwind.c b/gdb/testsuite/gdb.python/py-recurse-unwind.c
> index 02a835a..77acec1 100644
> --- a/gdb/testsuite/gdb.python/py-recurse-unwind.c
> +++ b/gdb/testsuite/gdb.python/py-recurse-unwind.c
> @@ -37,6 +37,10 @@ aaa (int arg)
> int
> main ()
> {
> - aaa (123);
> + int i;
> +
> + for (i = 0; i < 10; i++)
> + aaa (123);
> +
> return 0;
> }
> diff --git a/gdb/testsuite/gdb.python/py-recurse-unwind.exp b/gdb/testsuite/gdb.python/py-recurse-unwind.exp
> index 9629a97..97c69f7 100644
> --- a/gdb/testsuite/gdb.python/py-recurse-unwind.exp
> +++ b/gdb/testsuite/gdb.python/py-recurse-unwind.exp
> @@ -45,29 +45,46 @@ if ![runto_main] then {
> return 0
> }
>
> -gdb_breakpoint "ccc"
>
> -gdb_continue_to_breakpoint "ccc"
> -
> -# If the unwinder is active, the usage count will increment while
> -# running to the breakpoint. Reset it prior to doing the backtrace.
> -gdb_test_no_output "python TestUnwinder.reset_count()"
> -
> -# The python based unwinder should be called a number of times while
> -# generating the backtrace, but its sniffer always returns None. So
> -# it doesn't really contribute to generating any of the frames below.
> -#
> -# But that's okay. Our goal here is to make sure that GDB doesn't
> -# get hung up in potentially infinite recursion when invoking the
> -# Python-based unwinder.
> -
> -gdb_test_sequence "bt" "backtrace" {
> - "\\r\\n#0 .* ccc \\(arg=789\\) at "
> - "\\r\\n#1 .* bbb \\(arg=456\\) at "
> - "\\r\\n#2 .* aaa \\(arg=123\\) at "
> - "\\r\\n#3 .* main \\(.*\\) at"
> +proc cont_and_backtrace { tst } {
> +
> + with_test_prefix $tst {
> + gdb_breakpoint "ccc"
> +
> + # We're testing different code paths within the unwinder's sniffer.
> + # Set the current path to be tested here.
> + gdb_test_no_output "python TestUnwinder.set_test(\"$tst\")" \
> + "set code path within python unwinder to $tst"
> +
> + # If the unwinder is active, the usage count will increment while
> + # running to the breakpoint. Reset it prior to doing the backtrace.
> + gdb_test_no_output "python TestUnwinder.reset_count()" \
> + "reset count"
> +
> + gdb_continue_to_breakpoint "ccc"
> +
> + # The python based unwinder should be called a number of times while
> + # generating the backtrace, but its sniffer always returns None. So
> + # it doesn't really contribute to generating any of the frames below.
> + #
> + # But that's okay. Our goal here is to make sure that GDB doesn't
> + # get hung up in potentially infinite recursion when invoking the
> + # Python-based unwinder.
> +
> + gdb_test_sequence "bt" "backtrace" {
> + "\\r\\n#0 .* ccc \\(arg=789\\) at "
> + "\\r\\n#1 .* bbb \\(arg=456\\) at "
> + "\\r\\n#2 .* aaa \\(arg=123\\) at "
> + "\\r\\n#3 .* main \\(.*\\) at"
> + }
> +
> + # Test that the python-based unwinder / sniffer was actually called
> + # during generation of the backtrace.
> + gdb_test "python print(TestUnwinder.count > 0)" "True" \
> + "python unwinder called"
> + }
> }
>
> -# Test that the python-based unwinder / sniffer was actually called
> -# during generation of the backtrace.
> -gdb_test "python print(TestUnwinder.count > 0)" "True"
> +cont_and_backtrace "check_undefined_symbol"
> +cont_and_backtrace "check_user_reg_pc"
> +cont_and_backtrace "check_pae_pc"
> diff --git a/gdb/testsuite/gdb.python/py-recurse-unwind.py b/gdb/testsuite/gdb.python/py-recurse-unwind.py
> index 1da7aca..5eb87bb 100644
> --- a/gdb/testsuite/gdb.python/py-recurse-unwind.py
> +++ b/gdb/testsuite/gdb.python/py-recurse-unwind.py
> @@ -40,13 +40,18 @@ class TestUnwinder(Unwinder):
> def inc_count (cls):
> cls.count += 1
>
> + test = 'check_undefined_symbol'
> +
> + @classmethod
> + def set_test (cls, test) :
> + cls.test = test
> +
> def __init__(self):
> Unwinder.__init__(self, "test unwinder")
> self.recurse_level = 0
>
> def __call__(self, pending_frame):
>
> -
> if self.recurse_level > 0:
> gdb.write("TestUnwinder: Recursion detected - returning early.\n")
> return None
> @@ -54,11 +59,25 @@ class TestUnwinder(Unwinder):
> self.recurse_level += 1
> TestUnwinder.inc_count()
>
> - try:
> - val = gdb.parse_and_eval("undefined_symbol")
> + if TestUnwinder.test == 'check_user_reg_pc' :
> +
> + pc = pending_frame.read_register('pc')
> + pc_as_int = int(pc.cast(gdb.lookup_type('int')))
> + # gdb.write("In unwinder: pc=%x\n" % pc_as_int)
> +
> + elif TestUnwinder.test == 'check_pae_pc' :
> +
> + pc = gdb.parse_and_eval('$pc')
> + pc_as_int = int(pc.cast(gdb.lookup_type('int')))
> + # gdb.write("In unwinder: pc=%x\n" % pc_as_int)
> +
> + elif TestUnwinder.test == 'check_undefined_symbol' :
> +
> + try:
> + val = gdb.parse_and_eval("undefined_symbol")
>
> - except Exception as arg:
> - pass
> + except Exception as arg:
> + pass
>
> self.recurse_level -= 1
--
Sergio
GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36
Please send encrypted e-mail if possible
http://sergiodj.net/