From patchwork Tue Apr 9 02:55:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 32209 Received: (qmail 72252 invoked by alias); 9 Apr 2019 02:56:05 -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 72242 invoked by uid 89); 9 Apr 2019 02:56:04 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-13.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_SOFTFAIL autolearn=ham version=3.3.1 spammy=HX-Spam-Relays-External:sk:barracu, H*RU:sk:barracu, H*r:sk:barracu, HX-HELO:sk:barracu X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 09 Apr 2019 02:56:02 +0000 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id v9ibuG20xnsIKpJh (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 08 Apr 2019 22:55:59 -0400 (EDT) Received: from simark.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id 1ECEC441B21; Mon, 8 Apr 2019 22:55:59 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH] Use -qualified flag when setting temporary breakpoint in start command Date: Mon, 8 Apr 2019 22:55:57 -0400 Message-Id: <20190409025557.28846-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 X-IsSubscribed: yes From: Simon Marchi When using the "start" command, GDB puts a temporary breakpoint on the "main" symbol (we literally invoke the tbreak command). However, since it does wild matching by default, it also puts a breakpoint on any C++ method or "main" function in a namespace. For example, when debugging GDB, it creates a total of 24 locations: (gdb) start Temporary breakpoint 1 at 0x198c1e9: main. (24 locations) as there are a bunch of methods called main in the selftests, such as selftests::string_view::capacity_1::main() If such method was called in the constructor of a global object, or a function marked with the attribute "constructor", then we would stop at the wrong place. Also, this causes a few extra symtabs (those that contain the "wrong" mains) to be expanded for nothing. The dummiest, most straightforward solution is to add -qualified when invoking tbreak. With this patch, "start" creates a single-location breakpoint, as expected. I changed the start.exp test to use a C++ test file, which contains two main functions. The test now verifies that the output of "start" is the output we get when we set a single-location breakpoint. gdb/ChangeLog: * infcmd.c (run_command_1): Pass -qualified to tbreak when usind the "start" command. gdb/testsuite/ChangeLog: * gdb.base/start.exp: Change test file to start.cpp. Enhance regexp to match output of single-location breakpoint. * gdb.base/start.cpp: New file. --- gdb/infcmd.c | 5 ++++- gdb/testsuite/gdb.base/start.cpp | 31 +++++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/start.exp | 4 ++-- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 gdb/testsuite/gdb.base/start.cpp diff --git a/gdb/infcmd.c b/gdb/infcmd.c index c5977c48a90f..afc59d142649 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -605,7 +605,10 @@ run_command_1 (const char *args, int from_tty, enum run_how run_how) /* Insert temporary breakpoint in main function if requested. */ if (run_how == RUN_STOP_AT_MAIN) - tbreak_command (main_name (), 0); + { + std::string arg = string_printf ("-qualified %s", main_name ()); + tbreak_command (arg.c_str (), 0); + } exec_file = get_exec_file (0); diff --git a/gdb/testsuite/gdb.base/start.cpp b/gdb/testsuite/gdb.base/start.cpp new file mode 100644 index 000000000000..2c99bebb454f --- /dev/null +++ b/gdb/testsuite/gdb.base/start.cpp @@ -0,0 +1,31 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2019 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +namespace foo +{ + +int main () +{ + return 1; +} + +} /* namespace foo */ + +int main() +{ + return foo::main (); +} diff --git a/gdb/testsuite/gdb.base/start.exp b/gdb/testsuite/gdb.base/start.exp index d055c9d0d12f..847e322bf379 100644 --- a/gdb/testsuite/gdb.base/start.exp +++ b/gdb/testsuite/gdb.base/start.exp @@ -14,7 +14,7 @@ # along with this program. If not, see . -standard_testfile +standard_testfile start.cpp if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { return -1 @@ -30,5 +30,5 @@ if { [gdb_start_cmd] < 0 } { } gdb_test "" \ - "main \\(\\) at .*start.c.*" \ + "Temporary breakpoint $decimal at $hex: file.*main \\(\\) at .*start.cpp:.*" \ "start"