From patchwork Tue Sep 27 17:38:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Buettner X-Patchwork-Id: 16077 Received: (qmail 35895 invoked by alias); 27 Sep 2016 17:38:28 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 35880 invoked by uid 89); 27 Sep 2016 17:38:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.9 required=5.0 tests=BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.2 spammy=cls, H*MI:lan, 1814, hung X-HELO: emailserver1.aplushosting.com Received: from emailserver1.asdf456.com (HELO emailserver1.aplushosting.com) (72.18.207.136) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Tue, 27 Sep 2016 17:38:17 +0000 Received: (qmail 7744 invoked by uid 0); 27 Sep 2016 17:38:15 -0000 Received: from unknown (HELO pinnacle.lan) (70.176.31.165) by emailserver1.asdf456.com with SMTP; Tue, 27 Sep 2016 17:38:15 +0000 Date: Tue, 27 Sep 2016 10:38:14 -0700 From: Kevin Buettner To: gdb-patches@sourceware.org Subject: [PATCH] Extend test gdb.python/py-recurse-unwind.exp Message-ID: <20160927103814.07f6c2d5@pinnacle.lan> MIME-Version: 1.0 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 (ccc): Delete. (ccc0, ccc1, ccc2): New functions. (bbb): Call ccc0, ccc1, and ccc2. * 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/gdb.python/py-recurse-unwind.c | 16 ++++++- gdb/testsuite/gdb.python/py-recurse-unwind.exp | 61 ++++++++++++++++---------- gdb/testsuite/gdb.python/py-recurse-unwind.py | 29 +++++++++--- 3 files changed, 76 insertions(+), 30 deletions(-) diff --git a/gdb/testsuite/gdb.python/py-recurse-unwind.c b/gdb/testsuite/gdb.python/py-recurse-unwind.c index 02a835a..bd0330a 100644 --- a/gdb/testsuite/gdb.python/py-recurse-unwind.c +++ b/gdb/testsuite/gdb.python/py-recurse-unwind.c @@ -18,14 +18,26 @@ /* This is the test program loaded into GDB by the py-recurse-unwind test. */ void -ccc (int arg) +ccc0 (int arg) +{ +} + +void +ccc1 (int arg) +{ +} + +void +ccc2 (int arg) { } void bbb (int arg) { - ccc (789); + ccc0 (789); + ccc1 (789); + ccc2 (789); } void diff --git a/gdb/testsuite/gdb.python/py-recurse-unwind.exp b/gdb/testsuite/gdb.python/py-recurse-unwind.exp index 9629a97..cdb9b38 100644 --- a/gdb/testsuite/gdb.python/py-recurse-unwind.exp +++ b/gdb/testsuite/gdb.python/py-recurse-unwind.exp @@ -45,29 +45,44 @@ 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 func } { + + gdb_breakpoint "$func" + + # We're testing different code paths within the unwinder's sniffer. + # Set the current patch 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 for $tst" + + gdb_continue_to_breakpoint "$func" + + # 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 for $tst" { + "\\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 for $tst" } -# 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" "ccc0" +cont_and_backtrace "check_user_reg_pc" "ccc1" +cont_and_backtrace "check_pae_pc" "ccc2" 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