From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id E51693858D3C for ; Tue, 4 Jul 2023 14:38:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E51693858D3C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688481514; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=WQpfipvNa+AN6LX8huJaktkyFkoqPD6H9pL+7johtz0=; b=AnHLus5t2EIWOsskcpU9l3lRLQHorAQmDA19OMuS+ff2Q5ARAo3ixHLg5GppsGwsNEQJwf ihWzdcve4nQzCxJSVgFPDznhYvAK3c9Xez04FT8fHnAG0zGOZbTSd9HiXrXJhAt72BtKMa b7X5sq+AW2ZieREgs61tio+UJgzcrgk= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-465-Gd5ia2hwPDyl1om9P-LEdA-1; Tue, 04 Jul 2023 10:38:33 -0400 X-MC-Unique: Gd5ia2hwPDyl1om9P-LEdA-1 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-3f42bcef2acso33153475e9.2 for ; Tue, 04 Jul 2023 07:38:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1688481512; x=1691073512; h=mime-version:message-id:date:references:in-reply-to:subject:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=WQpfipvNa+AN6LX8huJaktkyFkoqPD6H9pL+7johtz0=; b=WtkauyoKgjhTyVYJ/JmH0kfmJRm9IrzwaTCkpMbdJlk1zfD27WM0s9ww6BZ9BAfFow OkV5Vjw+Y64p/bj1N39fxPVv6j3fhdzc9A1TNLPyemz58Gh+5N5LU2QNZk6Ax4tU84Uk 5d9nUSrzQn6k7zsOrKKyUbzxnV2rhiKFOtFvilJgwdhOYy0gwzJsvk+CFri2cLHBvHM3 LL2XyZ57hBGH7Rqt9U4HMQ1emhqXImucT59+2tkOy7Ykk7ZAZRXBY5imMoswKiigTotx eHEtxV9IiMNSQuQcRFR9jKkz7e0ASCRQy/mMCpRxNpyzomalm41yttwGrhNug9kLNmKA Rh1g== X-Gm-Message-State: AC+VfDwaDndw107lMLa8Svy6NXK56lQbIKH6aC4xy0q0+5Mcnyh3Nr0q 1EMEq8z8CHNp94yginxVqoYNYCB+mJYOp7OdjQMvXE+Lnb5H3g1ic2/+bknIDHXbGDtTUyl1bW9 1YcvO4V4+S4kNZOaX5uBBPA== X-Received: by 2002:a05:600c:2148:b0:3fb:a6ee:4cec with SMTP id v8-20020a05600c214800b003fba6ee4cecmr10612474wml.33.1688481512304; Tue, 04 Jul 2023 07:38:32 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7C2u0S0Gki3pKsj28Ne7mdBuKD2OXBt+ZR5QHTgpgUcABYEqvjDDSyjUTqf9mHsGbBuSg00g== X-Received: by 2002:a05:600c:2148:b0:3fb:a6ee:4cec with SMTP id v8-20020a05600c214800b003fba6ee4cecmr10612457wml.33.1688481511911; Tue, 04 Jul 2023 07:38:31 -0700 (PDT) Received: from localhost (2.72.115.87.dyn.plus.net. [87.115.72.2]) by smtp.gmail.com with ESMTPSA id a20-20020a05600c225400b003fbb06af219sm18522143wmm.32.2023.07.04.07.38.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Jul 2023 07:38:31 -0700 (PDT) From: Andrew Burgess To: Matti Puputti , gdb-patches@sourceware.org Subject: Re: [PATCH v4 1/1] gdb, infcmd: Support jump command in multi-inferior case. In-Reply-To: <20230628090037.1690149-1-matti.puputti@intel.com> References: <20230628090037.1690149-1-matti.puputti@intel.com> Date: Tue, 04 Jul 2023 15:38:30 +0100 Message-ID: <87ilazlp21.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Matti Puputti writes: > Fixes the issue where jump failed if multiple inferiors run the same source. > > See the below example > > $ gdb -q ./simple > Reading symbols from ./simple... > (gdb) break 2 > Breakpoint 1 at 0x114e: file simple.c, line 2. > (gdb) run > Starting program: /temp/simple > > Breakpoint 1, main () at simple.c:2 > 2 int a = 42; > (gdb) add-inferior > [New inferior 2] > Added inferior 2 on connection 1 (native) > (gdb) inferior 2 > [Switching to inferior 2 [] ()] > (gdb) info inferiors > Num Description Connection Executable > 1 process 6250 1 (native) /temp/simple > * 2 1 (native) > (gdb) file ./simple > Reading symbols from ./simple... > (gdb) run > Starting program: /temp/simple > > Thread 2.1 "simple" hit Breakpoint 1, main () at simple.c:2 > 2 int a = 42; > (gdb) info inferiors > Num Description Connection Executable > 1 process 6250 1 (native) /temp/simple > * 2 process 6705 1 (native) /temp/simple > (gdb) jump 3 > Unreasonable jump request > (gdb) > > In this example, jump fails because the debugger finds two different > locations, one for each inferior. > Solution is to limit the search to the current program space. I have one last nit... > --- > gdb/infcmd.c | 2 +- > gdb/linespec.c | 3 +- > gdb/linespec.h | 3 +- > gdb/testsuite/gdb.base/jump.exp | 177 +++++++++++++++++--------------- > 4 files changed, 99 insertions(+), 86 deletions(-) > > diff --git a/gdb/infcmd.c b/gdb/infcmd.c > index 15702f84894..96c5feafb1a 100644 > --- a/gdb/infcmd.c > +++ b/gdb/infcmd.c > @@ -1068,7 +1068,7 @@ jump_command (const char *arg, int from_tty) > error_no_arg (_("starting address")); > > std::vector sals > - = decode_line_with_last_displayed (arg, DECODE_LINE_FUNFIRSTLINE); > + = decode_line_with_current_source (arg, DECODE_LINE_FUNFIRSTLINE); > if (sals.size () != 1) > { > /* If multiple sal-objects were found, try dropping those that aren't > diff --git a/gdb/linespec.c b/gdb/linespec.c > index 7d969f37fbf..afa9eb4d3ac 100644 > --- a/gdb/linespec.c > +++ b/gdb/linespec.c > @@ -3220,7 +3220,8 @@ decode_line_with_current_source (const char *string, int flags) > location_spec_up locspec = string_to_location_spec (&string, > current_language); > std::vector sals > - = decode_line_1 (locspec.get (), flags, NULL, cursal.symtab, cursal.line); > + = decode_line_1 (locspec.get (), flags, cursal.pspace, cursal.symtab, > + cursal.line); > > if (*string) > error (_("Junk at end of line specification: %s"), string); > diff --git a/gdb/linespec.h b/gdb/linespec.h > index d5e7334fe2d..c0eef7894d9 100644 > --- a/gdb/linespec.h > +++ b/gdb/linespec.h > @@ -139,7 +139,8 @@ extern std::vector decode_line_with_current_source > (const char *, int); > > /* Given a string, return the line specified by it, using the last displayed > - codepoint's values as defaults, or nothing if they aren't valid. */ > + codepoint's values as defaults, or nothing if they aren't valid. > + Limit the search to given program space, if specified. */ > I think this change to the comment is now incorrect, the arguments to decode_line_with_last_displayed are no longer being changed, so there is never a program space specified. With the comment change reverted: Approved-By: Andrew Burgess Thanks, Andrew > extern std::vector decode_line_with_last_displayed > (const char *, int); > diff --git a/gdb/testsuite/gdb.base/jump.exp b/gdb/testsuite/gdb.base/jump.exp > index 032c4a6279d..4c0d4ed2dbb 100644 > --- a/gdb/testsuite/gdb.base/jump.exp > +++ b/gdb/testsuite/gdb.base/jump.exp > @@ -18,99 +18,110 @@ clear_xfail "*-*-*" > > standard_testfile .c > > -# Build the test case > -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { > - untested "failed to compile" > - return -1 > - } > +if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { > + return -1 > +} > > > -# Start with a fresh gdb > +proc do_tests {} { > + global decimal srcfile > + > + # Set a breakpoint on the statement that we're about to jump to. > + # The statement doesn't contain a function call. > + set non_call_line [gdb_get_line_number "bp-on-non-call"] > + gdb_breakpoint "$non_call_line" > + set bp_on_non_call \ > + [get_integer_valueof "\$bpnum" "INVALID" "bp_on_non_call"] > + > + # Can we jump to the statement? Do we stop there? > + gdb_test "jump $non_call_line" \ > + "Breakpoint ${bp_on_non_call}(\.${decimal})?, .*${srcfile}:$non_call_line.*" \ > + "jump to non-call" > + > + # Set a breakpoint on the statement that we're about to jump to. > + # The statement does contain a function call. > + set call_line [gdb_get_line_number "bp-on-call"] > + gdb_breakpoint "$call_line" > + set bp_on_call [get_integer_valueof "\$bpnum" "INVALID" "bp_on_call"] > + > + # Can we jump to the statement? Do we stop there? > + gdb_test "jump $call_line" \ > + "Breakpoint ${bp_on_call}(\.${decimal})?, .*${srcfile}:$call_line.*" \ > + "jump to call" > + > + # If we disable the breakpoint at the function call, and then > + # if we jump to that statement, do we not stop there, but at > + # the following breakpoint? > + gdb_test_no_output "disable $bp_on_call" "disable breakpoint on call" > + > + gdb_test "jump $call_line" \ > + "Breakpoint ${bp_on_non_call}(\.${decimal})?, .*${srcfile}:$non_call_line.*" \ > + "jump to call with disabled breakpoint" > + > + # Disable the breakpoint at the non-function call, so it won't hit > + # if do_test is called again. > + gdb_test_no_output "disable ${bp_on_non_call}" "disable bp_on_non_call" > + > + # Verify that GDB responds gracefully to the "jump" command without > + # an argument. > + gdb_test "jump" "Argument required .starting address.*" \ > + "jump without argument disallowed" > + > + # Verify that GDB responds gracefully to the "jump" command with > + # trailing junk. > + gdb_test "jump $call_line 100" \ > + "malformed linespec error: unexpected number, \"100\"" \ > + "jump with trailing argument junk" > + > + # Verify that GDB responds gracefully to a request to jump out of > + # the current function. (Note that this will very likely cause the > + # inferior to die. Be prepared to rerun the inferior, if further > + # testing is desired.) > + # Try it both ways: confirming and not confirming the jump. > + set out_line [gdb_get_line_number "out-of-func"] > + gdb_test "jump $out_line" \ > + "Not confirmed.*" \ > + "aborted jump out of current function" \ > + "Line $out_line is not in `main'. Jump anyway.*y or n. $" \ > + "n" > + > + gdb_test "jump $out_line" \ > + "Continuing at.*" \ > + "jump out of current function" \ > + "Line $out_line is not in `main'. Jump anyway.*y or n. $" \ > + "y" > +} > > -clean_restart ${binfile} > > -if {![runto_main]} { > - return -1 > +set inferiors 1 > +if {![use_gdb_stub]} { > + set inferiors 2 > } > > -# Set a breakpoint on the statement that we're about to jump to. > -# The statement doesn't contain a function call. > -# > -set bp_on_non_call 0 > -set non_call_line [gdb_get_line_number "bp-on-non-call"] > -gdb_test_multiple "break $non_call_line" "break before jump to non-call" { > - -re "\[Bb\]reakpoint (${decimal}) at ${hex}: file .*${srcfile}, line $non_call_line.*$gdb_prompt $" { > - set bp_on_non_call $expect_out(1,string) > - pass "break before jump to non-call" > +# Run to main, add inferiors if needed. > +for {set inf 1} {$inf <= $inferiors} {incr inf} { > + if {$inf != 1} { > + # Start a new inferior, and run it with the same executable. > + gdb_test "add-inferior -exec ${binfile}" \ > + "Added inferior ${inf}.*" \ > + "add inferior ${inf} with -exec " > + gdb_test "inferior ${inf}" \ > + "Switching to inferior ${inf} .*" \ > + "switch to inferior ${inf}" > + } > + if {![runto_main]} { > + return -1 > } > } > > -# Can we jump to the statement? Do we stop there? > -# > -gdb_test "jump $non_call_line" "Breakpoint ${decimal}, .*${srcfile}:$non_call_line.*" \ > - "jump to non-call" > - > -# Set a breakpoint on the statement that we're about to jump to. > -# The statement does contain a function call. > -# > -set bp_on_call 0 > -set call_line [gdb_get_line_number "bp-on-call"] > -gdb_test_multiple "break $call_line" "break before jump to call" { > - -re "\[Bb\]reakpoint (${decimal}) at ${hex}: file .*${srcfile}, line $call_line.*$gdb_prompt $" { > - set bp_on_call $expect_out(1,string) > - pass "break before jump to call" > +# Run tests on all inferiors. > +for {set inf 1} {$inf <= $inferiors} {incr inf} { > + with_test_prefix "inferior $inf" { > + # Switch to the target inferior. > + gdb_test "inferior $inf" ".*Switching to inferior $inf .*" > + # Run the tests. > + do_tests > } > } > > -# Can we jump to the statement? Do we stop there? > -# > -gdb_test "jump $call_line" \ > - "Breakpoint ${decimal}, .*${srcfile}:$call_line.*" \ > - "jump to call" > - > -# If we disable the breakpoint at the function call, and then > -# if we jump to that statement, do we not stop there, but at > -# the following breakpoint? > -# > -gdb_test_no_output "disable $bp_on_call" "disable breakpoint on call" > - > -gdb_test "jump $call_line" "Breakpoint ${decimal}, .*${srcfile}:$non_call_line.*" \ > - "jump to call with disabled breakpoint" > - > -# Verify that GDB responds gracefully to the "jump" command without > -# an argument. > -# > -gdb_test "jump" "Argument required .starting address.*" \ > - "jump without argument disallowed" > - > - > -# Verify that GDB responds gracefully to the "jump" command with > -# trailing junk. > -# > -gdb_test "jump $call_line 100" \ > - "malformed linespec error: unexpected number, \"100\"" \ > - "jump with trailing argument junk" > - > - > -# Verify that GDB responds gracefully to a request to jump out of > -# the current function. (Note that this will very likely cause the > -# inferior to die. Be prepared to rerun the inferior, if further > -# testing is desired.) > -# > -# Try it both ways: confirming and not confirming the jump. > -# > - > -set out_line [gdb_get_line_number "out-of-func"] > -gdb_test "jump $out_line" \ > - "Not confirmed.*" \ > - "aborted jump out of current function" \ > - "Line $out_line is not in `main'. Jump anyway.*y or n. $" \ > - "n" > - > -gdb_test "jump $out_line" \ > - "Continuing at.*" \ > - "jump out of current function" \ > - "Line $out_line is not in `main'. Jump anyway.*y or n. $" \ > - "y" > - > gdb_exit > -- > 2.25.1 > > Intel Deutschland GmbH > Registered Address: Am Campeon 10, 85579 Neubiberg, Germany > Tel: +49 89 99 8853-0, www.intel.de > Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva > Chairperson of the Supervisory Board: Nicole Lau > Registered Office: Munich > Commercial Register: Amtsgericht Muenchen HRB 186928