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 C1409385AF88 for ; Thu, 13 Jul 2023 10:24:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C1409385AF88 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=1689243868; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MglaCZkLLtqBPVaDCvl56pnU6PSm9mffQ5PPGQGf0vE=; b=P4VNapFeEUeQbYibgavpULxzVtAvAkUygNSfuED7DUHe+WS3sLPZ0zccqyzhLh9nj+liTj 9yLHFoTfjtT3R7dwZXatnFK+O8vILtp2ZcGuWyNeAxCf7NA+h5FZU8F9phDuP3bE2TKW4p W0op4gz7NYQ3BSJO/1JLjeo0kBXB508= Received: from mimecast-mx02.redhat.com (66.187.233.73 [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-219-XRhHV8VfO_yA9M0-qApbGw-1; Thu, 13 Jul 2023 06:24:24 -0400 X-MC-Unique: XRhHV8VfO_yA9M0-qApbGw-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id CB13D3C0BE2F for ; Thu, 13 Jul 2023 10:24:23 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.45.226.146]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 54F2B40C2063; Thu, 13 Jul 2023 10:24:23 +0000 (UTC) From: Bruno Larsen To: gdb-patches@sourceware.org Cc: Bruno Larsen Subject: [PATCH v4 2/4] gdb/cli: add '.' as an argument for 'list' command Date: Thu, 13 Jul 2023 12:24:09 +0200 Message-ID: <20230713102411.2279542-3-blarsen@redhat.com> In-Reply-To: <20230713102411.2279542-1-blarsen@redhat.com> References: <20230713102411.2279542-1-blarsen@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true 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: Currently, after the user has used the list command once, there is no self-contained way to ask GDB to print the location where the inferior is stopped. The current best options require either using a separate command to scope out where the inferior is stopped, or using "list *$pc" requiring knowledge of GDB standard registers. This commit adds a way to do that using '.' as a new argument for the 'list' command. If the inferior isn't running, the command prints around the main function. Because this necessitated having the inferior running and the test was (seemingly unnecessarily) using printf in a non-essential way and it would make the resulting log harder to read for no benefit, it was replaced by a differen t statement. --- gdb/NEWS | 4 ++++ gdb/cli/cli-cmds.c | 31 ++++++++++++++++++++++++-- gdb/doc/gdb.texinfo | 5 +++++ gdb/testsuite/gdb.base/list.exp | 39 +++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/list1.c | 2 +- 5 files changed, 78 insertions(+), 3 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index b924834d3d7..eef440a5242 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -84,6 +84,10 @@ is 64k. To print longer strings you should increase 'max-value-size'. +* The 'list' command now accepts '.' as an argument, which tells GDB to + print the location where the inferior is stopped. If the inferior hasn't + started yet, the command will print around the main function. + * New commands maintenance print record-instruction [ N ] diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 00977bc2ee3..1c459afdc97 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1234,14 +1234,14 @@ list_command (const char *arg, int from_tty) const char *p; /* Pull in the current default source line if necessary. */ - if (arg == NULL || ((arg[0] == '+' || arg[0] == '-') && arg[1] == '\0')) + if (arg == NULL || ((arg[0] == '+' || arg[0] == '-' || arg[0] == '.') && arg[1] == '\0')) { set_default_source_symtab_and_line (); symtab_and_line cursal = get_current_source_symtab_and_line (); /* If this is the first "list" since we've set the current source line, center the listing around that line. */ - if (get_first_line_listed () == 0) + if (get_first_line_listed () == 0 && (arg == nullptr || arg[0] != '.')) { list_around_line (arg, cursal); } @@ -1263,6 +1263,32 @@ list_command (const char *arg, int from_tty) print_source_lines (cursal.symtab, range, 0); } + /* "l ." lists the default location again. */ + else if (arg[0] == '.') + { + try + { + /* Find the current line by getting the PC of the currently + selected frame, and finding the line associated to it. */ + frame_info_ptr frame = get_selected_frame (nullptr); + CORE_ADDR curr_pc = get_frame_pc (frame); + cursal = find_pc_line (curr_pc, 0); + } + catch (const gdb_exception &e) + { + /* If there was an exception above, it means the inferior + is not running, so reset the current source location to + the default. */ + clear_current_source_symtab_and_line (); + set_default_source_symtab_and_line (); + cursal = get_current_source_symtab_and_line (); + } + list_around_line (arg, cursal); + /* Advance argument so just pressing "enter" after using "list ." + will print the following lines instead of the same lines again. */ + arg++; + } + return; } @@ -2770,6 +2796,7 @@ and send its output to SHELL_COMMAND.")); = add_com ("list", class_files, list_command, _("\ List specified function or line.\n\ With no argument, lists ten more lines after or around previous listing.\n\ +\"list .\" lists ten lines arond where the inferior is stopped.\n\ \"list -\" lists the ten lines before a previous ten-line listing.\n\ One argument specifies a line, and ten lines are listed around that line.\n\ Two arguments with comma between specify starting and ending lines to list.\n\ diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index b10c06ae91f..7619efe3de9 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -9148,6 +9148,11 @@ Stack}), this prints lines centered around that line. @item list - Print lines just before the lines last printed. + +@item list . +Print the lines surrounding the location that is where the inferior +is stopped. If the inferior is not running, print around the main +function instead. @end table @cindex @code{list}, how many lines to display diff --git a/gdb/testsuite/gdb.base/list.exp b/gdb/testsuite/gdb.base/list.exp index 18ecd13ac0f..ed178a1dd95 100644 --- a/gdb/testsuite/gdb.base/list.exp +++ b/gdb/testsuite/gdb.base/list.exp @@ -400,6 +400,42 @@ proc test_list_invalid_args {} { "second use of \"list +INVALID\"" } +proc test_list_current_location {} { + global binfile + # If the first "list" command that GDB runs is "list ." GDB may be + # unable to recognize that the inferior isn't running, so we should + # reload the inferior to test that condition. + clean_restart + gdb_file_cmd ${binfile} + + # Ensure that we are printing 10 lines + if {![set_listsize 10]} { + return + } + + # First guarantee that GDB prints around the main function correctly + gdb_test "list ." \ + "1.*\r\n2\[ \t\]+\r\n3\[ \t\]+int main \[)(\]+.*5\[ \t\]+int x;.*" \ + "list . with inferior not running" + + if {![runto_main]} { + warning "couldn't start inferior" + return + } + + # Walk forward some lines + gdb_test "until 15" ".*15.*foo.*" + + # Test that the correct location is printed and that + # using just "list" will print the following lines. + gdb_test "list ." ".*" "list current line after starting" + gdb_test "list" ".*" "confirm we are printing the following lines" + + # Test that list . will reset to current location + gdb_test "list ." ".*" "list around current line again" + gdb_test " " ".*" "testing repeated invocations with GDB's auto-repeat" +} + clean_restart gdb_file_cmd ${binfile} @@ -519,4 +555,7 @@ test_list "list -" 10 2 "7-8" "5-6" # the current line. test_list "list -" 10 1 "7" "6" +# Test printing the location where the inferior is stopped. +test_list_current_location + remote_exec build "rm -f list0.h" diff --git a/gdb/testsuite/gdb.base/list1.c b/gdb/testsuite/gdb.base/list1.c index d694495c3fb..9297f958f46 100644 --- a/gdb/testsuite/gdb.base/list1.c +++ b/gdb/testsuite/gdb.base/list1.c @@ -7,7 +7,7 @@ void bar (int x) - - */ { - printf ("%d\n", x); + x++; long_line (); } -- 2.41.0