From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 8SkCEUVTiWcHYBEAWB0awg (envelope-from ) for ; Thu, 16 Jan 2025 13:43:17 -0500 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=PiHlyvsa; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 3AF981E100; Thu, 16 Jan 2025 13:43:17 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.0 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id A504C1E05C for ; Thu, 16 Jan 2025 13:43:13 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3307D384D161 for ; Thu, 16 Jan 2025 18:43:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3307D384D161 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=PiHlyvsa Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id CC377384D160 for ; Thu, 16 Jan 2025 18:42:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CC377384D160 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CC377384D160 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1737052938; cv=none; b=G+pO6FMKi6PRbSwLyknGXo4Ngkia0wymaGa8ykKd4+erwj6Ztv78GStEapj6cWnBw4aIMV1c983FEfMsK6SlEnKUDsGS0gwU9cl4su2l6mKsE4+bSPKp+LbDL49etyfnup5vuipPlNDiCx8QKczwHGL5IgOq3F2deQWoIhxw3Rc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1737052938; c=relaxed/simple; bh=MdSIYtI9D+EXY7xT2MZfm17CnbqmV2SNKgkXXZnvCSM=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From; b=tALKpSusWHeh5NNHHr7h7WbeXqySOvPZ+FipjovPKXkel8FphYcti34Xr503FpTf0XNEKfz1Eq/rNhhps1OoqBb9Be4BCjcuMwH5sU+pqA+anqM/QFsOGgXrIHM3rXBxQzV2JWQDg6OFIxrW+VvA7Cj7LVRcSAK+dGX7uu2VqUs= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CC377384D160 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737052938; 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=93xi7tkNQ8W0v4dPZYEpoBo0UoxV7x3FSeLIksFK/yg=; b=PiHlyvsavkJD2QITMANZVafy6bg0k+/II8WDHxbBBIvgDaLbj0xPSaBHR24WeKoIU/l8qY mNn1HHZXuE7mkeYG1YQuSUebnJ0g00tWt25dmlQA+AsPNef84Q2+rly+5LhpFq58teBEvT iX7sL4ng3kGjiazvBTy8jNb3UhbUPOo= Received: from mail-oo1-f69.google.com (mail-oo1-f69.google.com [209.85.161.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-22-_YNkkr0HPZSA9vbLxP5Sfg-1; Thu, 16 Jan 2025 13:42:17 -0500 X-MC-Unique: _YNkkr0HPZSA9vbLxP5Sfg-1 X-Mimecast-MFC-AGG-ID: _YNkkr0HPZSA9vbLxP5Sfg Received: by mail-oo1-f69.google.com with SMTP id 006d021491bc7-5f96d37de7fso1027406eaf.3 for ; Thu, 16 Jan 2025 10:42:17 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737052936; x=1737657736; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=93xi7tkNQ8W0v4dPZYEpoBo0UoxV7x3FSeLIksFK/yg=; b=tAVHbl3v86BEpRE++7ZB1QnBgAbJVilBUMMUadX/hi+bbbteludG5mpvBJd5WDLP8A prrq5uWvUrvi3LM2CQ2muCNDDvL4IuAfDHdIej0cvPfNDEGL/IsRas8vk363HlrOpyhj ue2+p22Sg2CPG0dTdKjWaUgKbSuoSmIgWBRVQyZSjyyF+Ei8CV3KtI/uYU7rAScoxlyi juYn7lehLoD1OkXD+xSN2g2JchhDhE5L9hRB3u107YUaih31XQVbHlHdQqKi8xsOLccn pgqulNa4bmOGXVreucfad369TYJTSPcuinl7Par6l1UJpIAcH/0SqS7vPcJODKN2yPdl zAYw== X-Forwarded-Encrypted: i=1; AJvYcCWJZDwpiQSf9T3c1EoLXf1XTUeR63yeKVkHQSrrv5nnBP4/tpHJwHUoXgDLm7u2DwEErBn+6N629x4vjw==@sourceware.org X-Gm-Message-State: AOJu0Yw0xhs5h0kBZrbyl/oMO2ii6478ZogMvbjiPC5N5o0rSjJk8+Jw 0WEkYpV5YBUixSm5FEGxo9rIxy9dUj8qqn/Xt6kziKpeUFUG3abclZ9OP+1MBBrfGdMa5/owkbf m1YlBj3/nhfOmR30whOHvlq+gKlYx4c+zhi/CW0CRAiK5FyiPL/R331wHYYCj99JDHwA= X-Gm-Gg: ASbGncvhwIVb9eH7GGhgzhcpdqRf5AtphwAwjaYL3pYJ9/9HSYNsEpWJVHGZu2KuILe wW09SDAdCafxMLt6CKOn6AjHnEkpJVpue6aznDy8MsVGRrRYPAbhkD6AWEp52EStyBH8HEl7/rV 6tQ7hZ1UJoi4s5wT1TYc0c9ka3tJecgGbHYDVJK1/bMK5XWlzouCTvJPgXVeaPnn8Im0Yl6eria j35DfyLABjSuoJPqQzmWOKv32CH1lHhMdzsjKC1/J7atzZ8Rj2Q97qWh3NklubxWTe6 X-Received: by 2002:a4a:dd0f:0:b0:5f8:c5ec:c97e with SMTP id 006d021491bc7-5f8c5ecca86mr6915480eaf.8.1737052936220; Thu, 16 Jan 2025 10:42:16 -0800 (PST) X-Google-Smtp-Source: AGHT+IFRcMoXXKQOANiYNRAxxjz7qHYxKWROB8NRQ6lstVOc0cTzTS+OCFOSyPgnk+v3rahizZdzRQ== X-Received: by 2002:a4a:dd0f:0:b0:5f8:c5ec:c97e with SMTP id 006d021491bc7-5f8c5ecca86mr6915469eaf.8.1737052935796; Thu, 16 Jan 2025 10:42:15 -0800 (PST) Received: from ?IPV6:2804:14d:8084:9a69::1000? ([2804:14d:8084:9a69::1000]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-5fa35fe1acfsm207591eaf.30.2025.01.16.10.42.13 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 10:42:15 -0800 (PST) Message-ID: <1e245705-4936-48ac-8ec5-691f945e8766@redhat.com> Date: Thu, 16 Jan 2025 15:42:12 -0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v8 5/5] gdb/testsuite: Test for a backtrace through object without debuginfo To: Andrew Burgess , gdb-patches@sourceware.org Cc: Jan Kratochvil , Thiago Jung Bauermann References: <20241210195115.3046370-1-guinevere@redhat.com> <20241210195115.3046370-6-guinevere@redhat.com> <877c6uq0y9.fsf@redhat.com> From: Guinevere Larsen In-Reply-To: <877c6uq0y9.fsf@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 3mdRw4vD-gOZEIHx5FXQEREhs46pDBLRPCU3hvhKinc_1737052937 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org On 1/16/25 11:37 AM, Andrew Burgess wrote: > Guinevere Larsen writes: > >> Fedora has been carrying this test since back in the Project Archer >> days. A change back then caused GDB to stop being able to backtrace when >> only some of the object files had debug information. Even though the >> changed code never seems to have made its way into the main GDB project, >> I think it makes sense to bring the test along to ensure something like >> this doesn't pass unnoticed. >> >> Co-Authored-By: Jan Kratochvil >> Reviewed-by: Thiago Jung Bauermann >> --- >> .../backtrace-through-cu-nodebug-caller.c | 28 ++++++ >> .../backtrace-through-cu-nodebug-main.c | 32 +++++++ >> .../gdb.base/backtrace-through-cu-nodebug.exp | 95 +++++++++++++++++++ >> 3 files changed, 155 insertions(+) >> create mode 100644 gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-caller.c >> create mode 100644 gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-main.c >> create mode 100644 gdb/testsuite/gdb.base/backtrace-through-cu-nodebug.exp >> >> diff --git a/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-caller.c b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-caller.c >> new file mode 100644 >> index 00000000000..3a63d72a468 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-caller.c >> @@ -0,0 +1,28 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> + Copyright 2005-2024 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 . */ >> + >> +typedef int (*callback_t) (void); >> + >> +int >> +caller (callback_t callback) >> +{ >> + /* Ensure some frame content to push away the return address. */ >> + volatile const long one = 1; >> + >> + /* Modify the return value to prevent any tail-call optimization. */ >> + return (*callback) () - one; >> +} >> diff --git a/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-main.c b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-main.c >> new file mode 100644 >> index 00000000000..3e7ac57a166 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-main.c >> @@ -0,0 +1,32 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> + Copyright 2005-2024 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 . */ >> + >> +typedef int (*callback_t) (void); >> + >> +extern int caller (callback_t callback); >> + >> +int >> +callback (void) >> +{ >> + return 1; >> +} >> + >> +int >> +main (void) >> +{ >> + return caller (callback); >> +} >> diff --git a/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug.exp b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug.exp >> new file mode 100644 >> index 00000000000..c0940b406a8 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug.exp >> @@ -0,0 +1,95 @@ >> +# Copyright 2010-2024 Free Software Foundation, Inc. > Remember to update the copyright year throughout. > >> + >> +# 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 . >> + >> +# Test that GDB can generate accurate backtraces even if some of the stack >> +# trace goes through a function with no debug information. >> + >> +standard_testfile -caller.c -main.c >> +set objmainfile ${testfile}-main.o >> +set objcallerfile ${testfile}-caller.o >> + >> +# recompile the inferior with or without CFI information, then run the >> +# inferior until the point where the important test starts >> +# returns TRUE on an ERROR. > Needs converting to two sentences ('.' after 'starts'). Plus capital > 'R' for each sentence. > > I wonder if it would be better to return TRUE on success, and FALSE on > error, because .... see below ... > >> +proc prepare_test {has_cfi} { >> + global srcdir subdir srcfile srcfile2 objmainfile objcallerfile binfile >> + if {$has_cfi} { >> + set extension "cfi" >> + if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" \ >> + "${srcdir}/${subdir}/${objcallerfile}" \ >> + object [list {additional_flags=-fomit-frame-pointer \ >> + -funwind-tables -fasynchronous-unwind-tables}]] != "" } { >> + untested "couldn't compile with cfi" >> + return true >> + } >> + } else { >> + set extension "no-cfi" >> + if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" \ >> + "${srcdir}/${subdir}/${objcallerfile}" \ >> + object [list {additional_flags=-fomit-frame-pointer \ >> + -fno-unwind-tables \ >> + -fno-asynchronous-unwind-tables}]] != "" } { >> + untested "couldn't compile without cfi" >> + return true >> + } >> + } >> + if {[gdb_compile [list "${srcdir}/${subdir}/${objmainfile}" \ >> + "${srcdir}/${subdir}/${objcallerfile}"] \ >> + "${binfile}-${extension}" binfile {}] != ""} { >> + untested "couldn't link object files" >> + return true >> + } >> + >> + clean_restart "$binfile-${extension}" >> + >> + with_test_prefix "${extension}" { >> + >> + if ![runto callback] then { >> + fail "has_cfi=$has_cfi: Can't run to callback" >> + return true >> + } >> + gdb_test_no_output "maint frame-unwinder disable ARCH" >> + return false >> + } >> +} >> + >> +if {[gdb_compile "${srcdir}/${subdir}/${srcfile2}" \ >> + "${srcdir}/${subdir}/${objmainfile}" \ >> + object {debug}] != "" } { >> + untested "couldn't compile main file" >> + return >> +} >> + >> +if { [prepare_test false] } { >> + untested ${testfile}.exp >> +} else { >> + gdb_test "bt" "Required frame unwinder may have been disabled.*" \ >> + "verify unwind fail without CFI" >> +} > When something goes wrong with the prepare_test call we've already > emitted an 'untested' or 'fail' message, thus I think we can just write: > > if { [prepare_test false] } { > ... perform the test ... > } > > Of course, this assumes that the true/false return value for > prepare_test have been switched. Currently you'd write: > > if { ![prepare_test false] } { > ... perform the test ... > } > > which just seems weird. > > Also, the test here says "verify unwind fail without CFI". And we _do_ > check for the error message about disabled unwinders. But if the `bt` > worked this test would still pass just fine. We should probably be > checking that we only print frame #0. Something like: > > gdb_test "bt" \ > [multi_line \ > "\[^\r\n\]+Required frame unwinder may have been disabled, \[^\r\n\]+" \ > "#0\\s+callback \\(\\) \[^\r\n\]+"] \ > "verify unwind fail without CFI" > > should do the job I think. > >> + >> +if { [prepare_test true] } { >> + untested ${testfile}.exp >> +} else { > Same suggestion here about avoiding the extra 'untested' call. > >> + if { [istarget "arm*-*-*"] } { >> + setup_kfail backtrace/31950 *-*-* >> + } >> + set text {[^\r\n]+} >> + # #0 callback () at ... >> + # #1 0x00000000004004e9 in caller () >> + # #2 0x00000000004004cd in main () at ... >> + gdb_test "bt" \ >> + "#0 +callback $text\r\n#1 $text in caller $text\r\n#2 $text in main $text" \ >> + "verify unwinding works for CFI without DIEs" > The test name here seems weird. Maybe: 'verify unwinding works for CUs > without CFI' would be better? I applied all other suggestions. This naming came directly from the downstream patch, the point is to parse a range described by a CFI but not by debug information. What do you think about this wording: 'Verify unwinding works based only on CFI information' ? > > OK with these fixes. > > Approved-By: Andrew Burgess > > Thanks, > Andrew > >> +} >> -- >> 2.47.0 -- Cheers, Guinevere Larsen She/Her/Hers