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 DE7D83858C41 for ; Wed, 16 Aug 2023 08:58:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DE7D83858C41 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=1692176334; 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=KSIphoDZextH3YJ7fVn5kAuz22ZjG7QOdlMh2uNIAiM=; b=NMCBhCHTnrKt0WrTIxBwi3Y0P1Yp2MbL/95PcAPdUdorWbijIHPsoWALQU0PHm65XU4t52 WqlfC22y7zg2cVUWX+wGE+gIKJnJpRQt3UeZJX6T4i/9dmxoBwq24FYaYO77EHVgW/UmS6 sWqV4w0Lmr7TlkGE7l+idnyyKsXJM8s= Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-517-eMpksqtCM5GBSYpShHTOlQ-1; Wed, 16 Aug 2023 04:58:51 -0400 X-MC-Unique: eMpksqtCM5GBSYpShHTOlQ-1 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-99bc8f1290eso376158766b.3 for ; Wed, 16 Aug 2023 01:58:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692176331; x=1692781131; 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=KSIphoDZextH3YJ7fVn5kAuz22ZjG7QOdlMh2uNIAiM=; b=LhnelM6lovwDkNva61aVZPYdxU98oeNjEbzW3TC4g/s4F8WaBFOGrHwsaYOrPPsL8o 2U80IHSGi/WKt3aOk7tOtfPrgbi0sOk1jD0d8kHyg09fe/T8auRPll9UTXEFdImzIDsJ 30dXhmJrn6BdA3dbdPt9m+KLacwWXWf28h+Gs/7+9Fkp86UXo0/0FKXhocPALs6BgnQV I+Iaf+7GU8PTSAsVcKNszbfKEyUFvfwqQ1oqBLWPz500hGQxJID/fFpqiVaN4cssQem5 HUrkToSwqXisgWsPm6WoMucjAvGPNcBVkndWKHdy+L9/gGagPHW05q72OmDs6SvOz7Qc HgPg== X-Gm-Message-State: AOJu0YwQCCDti67gpbnD/1jxNtcbRgCZscd47r6qWW67HXSVak9aCZ+x 3LTgFN3qvNDgz0vhtLaWK+Aabs3WUDK7Ma50N+0Gbz18O7xOyWPbvrFQrEZvmRWr79P8XllbM7D RB9HZ74fjQ6XgQNuGU8630A== X-Received: by 2002:a17:906:7c83:b0:98e:933:28fe with SMTP id w3-20020a1709067c8300b0098e093328femr811755ejo.66.1692176330722; Wed, 16 Aug 2023 01:58:50 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFw9oJhekH6I675saa2zZMECN9nowA63f18iawGu7fkYBOArhC3z7ppv+RG1AmDTJg4ebeWQQ== X-Received: by 2002:a17:906:7c83:b0:98e:933:28fe with SMTP id w3-20020a1709067c8300b0098e093328femr811741ejo.66.1692176330242; Wed, 16 Aug 2023 01:58:50 -0700 (PDT) Received: from localhost ([31.111.84.232]) by smtp.gmail.com with ESMTPSA id g6-20020a170906348600b0099c157cba46sm8094443ejb.119.2023.08.16.01.58.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Aug 2023 01:58:49 -0700 (PDT) From: Andrew Burgess To: Matti Puputti , gdb-patches@sourceware.org Subject: Re: [PATCH v6 1/1] gdb, infcmd: Support jump command in multi-inferior case. In-Reply-To: <20230726122915.212016-1-matti.puputti@intel.com> References: <20230726122915.212016-1-matti.puputti@intel.com> Date: Wed, 16 Aug 2023 09:58:48 +0100 Message-ID: <87bkf7cqif.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.9 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 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: > From: "Puputti, Matti" > > Fixes the issue where jump failed if multiple inferiors run the same > source. Thanks for the latest update. I took another look through, this looks great, so I have pushed this to master. I did add a new comment to the 'do_test' proc in the test script, and extended the description of the fix in the commit message. Thanks, Andrew > > 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. > --- > gdb/infcmd.c | 2 +- > gdb/linespec.c | 3 +- > gdb/testsuite/gdb.base/jump.exp | 180 +++++++++++++++++--------------- > 3 files changed, 98 insertions(+), 87 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/testsuite/gdb.base/jump.exp b/gdb/testsuite/gdb.base/jump.exp > index 032c4a6279d..77765db15ef 100644 > --- a/gdb/testsuite/gdb.base/jump.exp > +++ b/gdb/testsuite/gdb.base/jump.exp > @@ -18,99 +18,109 @@ 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]} { > + 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 num_inferiors 1 > +if {![use_gdb_stub]} { > + set num_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. > +if {![runto_main]} { > + return -1 > +} > +for {set inf 2} {$inf <= $num_inferiors} {incr inf} { > + # 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 <= $num_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