From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2a07:de40:b251:101:10:150:64:2]) by sourceware.org (Postfix) with ESMTPS id 338533858CD1 for ; Wed, 1 May 2024 08:34:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 338533858CD1 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 338533858CD1 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:2 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714552459; cv=none; b=HcynbDPMsoJ0ZOT5pLGyZ/ZOaFPLOCXHEISOxTLeqSvQMlziAPcPljA661KE4G2QvedM3c9jQOOGicCXTvfFSEBkexiczcKKxOJl7O6Yx9DeXkTt6at/w0pBWr9WcVib8gjN/NjmuIMkRuFyauWWQaDTvrXClRb/mhmEYOImOaI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714552459; c=relaxed/simple; bh=Naagbr3I2sEee6TQqr7ZN4uKmU0cEh9w9pzBmc+yEm4=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-Id:MIME-Version; b=X2JiJbg9AFtdtrQn/oLLmYCh7ab9XxoC3cmTAbhL8AOphZX1OaC2w0CLo01app3FfkNEAIbOeWSd+z6EvYj6N752RBfjbP875X2BFf+yQ925RO5AtsejSlB8UdzIs4BgdWdwY242hXjRMfws7wCzdza43W7z8vTroy+OYt33cww= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id BE5971F846 for ; Wed, 1 May 2024 08:34:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1714552455; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=az/VZUqQsabPBBQvdLjp7TZYeoPbWNGbSKQNSHe5PaA=; b=qDp+qdCfxA+fvhqyVXeicBT2OnrzX8HQXzguMzl4y6ukUW4cFyQfZ5K6ZPiEfqvk2JyfFW IL3BPDT6po8/zMRB8GsGIx2XRtj1UK2SCe4YNAcUbCBRc4WvDG4TyF8t70OisqINuolrX2 oU5L1kgIHNjxNHp7ndq+1F7h7lCtERc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1714552455; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=az/VZUqQsabPBBQvdLjp7TZYeoPbWNGbSKQNSHe5PaA=; b=mSGwXTX3WA9xAaZMwtn4fI3/ZWzR77Ijt3ehMe/jP83MvLlw4x7V9h0ebr4wBSm86taH40 mZqK2ordR5BhX0Ag== Authentication-Results: smtp-out2.suse.de; dkim=pass header.d=suse.de header.s=susede2_rsa header.b=toMnZHQX; dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=0Y7llC4W DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1714552454; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=az/VZUqQsabPBBQvdLjp7TZYeoPbWNGbSKQNSHe5PaA=; b=toMnZHQXEyAftZz8U9JtRtudJsTT8qyZ0O6WOGDTtQXK+S1lufUVhyJypVZhvPqrg2cM4Y THtDmkw7Ekp56gRZ/VkPGVeo3Rv0UQ6/DHWXYM7hLuBaghyKQlxevRBTfk8KrHa9E5h6dY nQ9uz7CO5sqiHZ8H5ZHp9J5gTvukpp8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1714552454; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=az/VZUqQsabPBBQvdLjp7TZYeoPbWNGbSKQNSHe5PaA=; b=0Y7llC4WGbE5C4hcOoB27bo/3CUJphorSKAq46YYF8misvmGqEPB5LWLTLBObmfhjKG9KU vtmKBwPKWpi1qyDw== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id A30A4137BA for ; Wed, 1 May 2024 08:34:14 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id pg/jJYb+MWbZbQAAD6G6ig (envelope-from ) for ; Wed, 01 May 2024 08:34:14 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH v2] [gdb/testsuite] Handle ptrace operation not permitted in can_spawn_for_attach Date: Wed, 1 May 2024 10:34:33 +0200 Message-Id: <20240501083433.19966-1-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -3.01 X-Rspamd-Action: no action X-Rspamd-Queue-Id: BE5971F846 X-Spam-Level: X-Rspamd-Server: rspamd2.dmz-prg2.suse.org X-Spamd-Result: default: False [-3.01 / 50.00]; BAYES_HAM(-3.00)[100.00%]; NEURAL_HAM_LONG(-1.00)[-1.000]; MID_CONTAINS_FROM(1.00)[]; R_MISSING_CHARSET(0.50)[]; R_DKIM_ALLOW(-0.20)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; MX_GOOD(-0.01)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; RBL_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:104:10:150:64:97:from]; RCVD_COUNT_TWO(0.00)[2]; ARC_NA(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; FROM_HAS_DN(0.00)[]; MIME_TRACE(0.00)[0:+]; FROM_EQ_ENVFROM(0.00)[]; FUZZY_BLOCKED(0.00)[rspamd.com]; DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:helo,imap1.dmz-prg2.suse.org:rdns,suse.de:dkim]; TO_MATCH_ENVRCPT_ALL(0.00)[]; TO_DN_NONE(0.00)[]; RCVD_TLS_ALL(0.00)[]; PREVIOUSLY_DELIVERED(0.00)[gdb-patches@sourceware.org]; SPAMHAUS_XBL(0.00)[2a07:de40:b281:104:10:150:64:97:from]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; DKIM_TRACE(0.00)[suse.de:+] X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,SPF_HELO_NONE,SPF_PASS,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: When running the testsuite on a system with kernel.yama.ptrace_scope set to 1, we run into attach failures. Fix this by recognizing "ptrace: Operation not permitted" in can_spawn_for_attach. Tested on aarch64-linux and x86_64-linux. --- gdb/testsuite/gdb.base/break-interp.exp | 4 + gdb/testsuite/gdb.base/dprintf-detach.exp | 2 +- .../run-control-while-bg-execution.exp | 3 + .../gdb.multi/attach-while-running.exp | 2 +- .../gdb.threads/attach-into-signal.exp | 3 +- .../gdb.threads/attach-slow-waitpid.exp | 3 +- gdb/testsuite/gdb.threads/attach-stopped.exp | 3 +- .../gdb.threads/check-libthread-db.exp | 42 +++---- gdb/testsuite/lib/gdb.exp | 112 +++++++++++++++--- 9 files changed, 135 insertions(+), 39 deletions(-) diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp index addacde552d..d7f84db4770 100644 --- a/gdb/testsuite/gdb.base/break-interp.exp +++ b/gdb/testsuite/gdb.base/break-interp.exp @@ -318,6 +318,10 @@ proc test_attach_gdb {file pid displacement prefix} { } proc test_attach {file displacement {relink_args ""}} { + if { ![can_spawn_for_attach] } { + return + } + global board_info global exec diff --git a/gdb/testsuite/gdb.base/dprintf-detach.exp b/gdb/testsuite/gdb.base/dprintf-detach.exp index 550d319a895..b4184d698df 100644 --- a/gdb/testsuite/gdb.base/dprintf-detach.exp +++ b/gdb/testsuite/gdb.base/dprintf-detach.exp @@ -21,7 +21,7 @@ load_lib gdbserver-support.exp # The test relies on "detach/attach". -require !use_gdb_stub +require can_spawn_for_attach standard_testfile set escapedbinfile [string_to_regexp ${binfile}] diff --git a/gdb/testsuite/gdb.base/run-control-while-bg-execution.exp b/gdb/testsuite/gdb.base/run-control-while-bg-execution.exp index f1cbd9351d3..380047ae854 100644 --- a/gdb/testsuite/gdb.base/run-control-while-bg-execution.exp +++ b/gdb/testsuite/gdb.base/run-control-while-bg-execution.exp @@ -110,6 +110,9 @@ proc do_test { action1 action2 } { foreach_with_prefix action1 { kill detach add none } { foreach_with_prefix action2 { start run attach } { + if { $action2 == "attach" && ![can_spawn_for_attach] } { + continue + } do_test $action1 $action2 } } diff --git a/gdb/testsuite/gdb.multi/attach-while-running.exp b/gdb/testsuite/gdb.multi/attach-while-running.exp index eade8b42a18..ca4fa635467 100644 --- a/gdb/testsuite/gdb.multi/attach-while-running.exp +++ b/gdb/testsuite/gdb.multi/attach-while-running.exp @@ -36,7 +36,7 @@ standard_testfile -require !use_gdb_stub +require can_spawn_for_attach if { [build_executable "failed to prepare" ${testfile} ${srcfile}] } { return diff --git a/gdb/testsuite/gdb.threads/attach-into-signal.exp b/gdb/testsuite/gdb.threads/attach-into-signal.exp index 87e34070548..91da960e09a 100644 --- a/gdb/testsuite/gdb.threads/attach-into-signal.exp +++ b/gdb/testsuite/gdb.threads/attach-into-signal.exp @@ -17,7 +17,8 @@ # This file was created by Jan Kratochvil . # This test only works on Linux -require !use_gdb_stub isnative +require can_spawn_for_attach +require isnative require {!is_remote host} require {istarget *-linux*} diff --git a/gdb/testsuite/gdb.threads/attach-slow-waitpid.exp b/gdb/testsuite/gdb.threads/attach-slow-waitpid.exp index dc3e62a7b7e..28d70daad8c 100644 --- a/gdb/testsuite/gdb.threads/attach-slow-waitpid.exp +++ b/gdb/testsuite/gdb.threads/attach-slow-waitpid.exp @@ -37,7 +37,8 @@ # during the attach phase. # This test only works on Linux -require !use_gdb_stub isnative +require can_spawn_for_attach +require isnative require {!is_remote host} require {istarget *-linux*} diff --git a/gdb/testsuite/gdb.threads/attach-stopped.exp b/gdb/testsuite/gdb.threads/attach-stopped.exp index 78e194c992f..0421ffc3794 100644 --- a/gdb/testsuite/gdb.threads/attach-stopped.exp +++ b/gdb/testsuite/gdb.threads/attach-stopped.exp @@ -18,7 +18,8 @@ # This file was updated by Jan Kratochvil . # This test only works on Linux -require !use_gdb_stub isnative +require can_spawn_for_attach +require isnative require {!is_remote host} require {istarget *-linux*} diff --git a/gdb/testsuite/gdb.threads/check-libthread-db.exp b/gdb/testsuite/gdb.threads/check-libthread-db.exp index 5662eeda077..6976fe6f83b 100644 --- a/gdb/testsuite/gdb.threads/check-libthread-db.exp +++ b/gdb/testsuite/gdb.threads/check-libthread-db.exp @@ -102,25 +102,27 @@ with_test_prefix "automated load-time check" { } # Automated load-time check with NPTL fully operational. - with_test_prefix "libpthread.so fully initialized" { - clean_restart ${binfile} - - gdb_test_no_output "maint set check-libthread-db 1" - gdb_test_no_output "set debug libthread-db 1" - - set test_spawn_id [spawn_wait_for_attach $binfile] - set testpid [spawn_id_get_pid $test_spawn_id] - - gdb_test_sequence "attach $testpid" \ - "check debug libthread-db output" { - "\[\r\n\]+Running libthread_db integrity checks:" - "\[\r\n\]+\[ \]+Got thread 0x\[1-9a-f\]\[0-9a-f\]+ => \[0-9\]+ => 0x\[1-9a-f\]\[0-9a-f\]+ ... OK" - "\[\r\n\]+\[ \]+Got thread 0x\[1-9a-f\]\[0-9a-f\]+ => \[0-9\]+ => 0x\[1-9a-f\]\[0-9a-f\]+ ... OK" - "\[\r\n\]+libthread_db integrity checks passed." - "\[\r\n\]+[Thread debugging using libthread_db enabled]" - } - - gdb_exit - kill_wait_spawned_process $test_spawn_id + if { [can_spawn_for_attach] } { + with_test_prefix "libpthread.so fully initialized" { + clean_restart ${binfile} + + gdb_test_no_output "maint set check-libthread-db 1" + gdb_test_no_output "set debug libthread-db 1" + + set test_spawn_id [spawn_wait_for_attach $binfile] + set testpid [spawn_id_get_pid $test_spawn_id] + + gdb_test_sequence "attach $testpid" \ + "check debug libthread-db output" { + "\[\r\n\]+Running libthread_db integrity checks:" + "\[\r\n\]+\[ \]+Got thread 0x\[1-9a-f\]\[0-9a-f\]+ => \[0-9\]+ => 0x\[1-9a-f\]\[0-9a-f\]+ ... OK" + "\[\r\n\]+\[ \]+Got thread 0x\[1-9a-f\]\[0-9a-f\]+ => \[0-9\]+ => 0x\[1-9a-f\]\[0-9a-f\]+ ... OK" + "\[\r\n\]+libthread_db integrity checks passed." + "\[\r\n\]+[Thread debugging using libthread_db enabled]" + } + + gdb_exit + kill_wait_spawned_process $test_spawn_id + } } } diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index d092258a9e5..7019f38eb15 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -6155,8 +6155,54 @@ proc gdb_exit { } { catch default_gdb_exit } +# Helper function for can_spawn_for_attach. Try to spawn and attach, and +# return 0 only if we cannot attach because it's unsupported. + +gdb_caching_proc can_spawn_for_attach_1 {} { + # Assume yes. + set res 1 + + set me "can_spawn_for_attach" + set src { + #include + + int + main (void) + { + sleep (600); + return 0; + } + } + if {![gdb_simple_compile $me $src executable]} { + return $res + } + + set test_spawn_id [spawn_wait_for_attach_1 $obj] + remote_file build delete $obj + + gdb_start + + set test_pid [spawn_id_get_pid $test_spawn_id] + set attaching_re "Attaching to process $test_pid" + gdb_test_multiple "attach $test_pid" "can spawn for attach" { + -re -wrap "$attaching_re\r\n.*ptrace: Operation not permitted\\." { + # Not permitted. + set res 0 + } + -re -wrap "" { + # Don't know, keep assuming yes. + } + } + + gdb_exit + + kill_wait_spawned_process $test_spawn_id + + return $res +} + # Return true if we can spawn a program on the target and attach to -# it. +# it. Calls gdb_exit for the first call in a test-case. proc can_spawn_for_attach { } { # We use exp_pid to get the inferior's pid, assuming that gives @@ -6175,8 +6221,39 @@ proc can_spawn_for_attach { } { return 0 } - # Assume yes. - return 1 + # The normal sequence to use for a runtime test like + # can_spawn_for_attach_1 is: + # - gdb_exit (don't use a running gdb, we don't know what state it is in), + # - gdb_start (start a new gdb), and + # - gdb_exit (cleanup). + # + # By making can_spawn_for_attach_1 a gdb_caching_proc, we make it + # unpredictable which test-case will call it first, and consequently a + # test-case may pass in say a full test run, but fail when run + # individually, due to a can_spawn_for_attach call in location where a + # gdb_exit (as can_spawn_for_attach_1 does) breaks things. + # To avoid this, we move the initial gdb_exit out of + # can_spawn_for_attach_1, guaranteeing that we end up in the same state + # regardless of whether can_spawn_for_attach_1 is called. However, that + # is only necessary for the first call in a test-case, so cache the result + # in a global (which should be reset after each test-case) to keep track + # of that. + # + # In summary, we distinguish between three cases: + # - first call in first test-case. Executes can_spawn_for_attach_1. + # Calls gdb_exit, gdb_start, gdb_exit. + # - first call in following test-cases. Uses cached result of + # can_spawn_for_attach_1. Calls gdb_exit. + # - rest. Use cached result in cache_can_spawn_for_attach_1. Calls no + # gdb_start or gdb_exit. + global cache_can_spawn_for_attach_1 + if { [info exists cache_can_spawn_for_attach_1] } { + return $cache_can_spawn_for_attach_1 + } + gdb_exit + + set cache_can_spawn_for_attach_1 [can_spawn_for_attach_1] + return $cache_can_spawn_for_attach_1 } # Centralize the failure checking of "attach" command. @@ -6289,20 +6366,12 @@ proc spawn_id_get_pid { spawn_id } { return $testpid } -# Start a set of programs running and then wait for a bit, to be sure -# that they can be attached to. Return a list of processes spawn IDs, -# one element for each process spawned. It's a test error to call -# this when [can_spawn_for_attach] is false. +# Helper function for spawn_wait_for_attach and can_spawn_for_attach_1. As +# spawn_wait_for_attach, but doesn't check for can_spawn_for_attach. -proc spawn_wait_for_attach { executable_list } { +proc spawn_wait_for_attach_1 { executable_list } { set spawn_id_list {} - if ![can_spawn_for_attach] { - # The caller should have checked can_spawn_for_attach itself - # before getting here. - error "can't spawn for attach with this target/board" - } - foreach {executable} $executable_list { # Note we use Expect's spawn, not Tcl's exec, because with # spawn we control when to wait for/reap the process. That @@ -6316,6 +6385,21 @@ proc spawn_wait_for_attach { executable_list } { return $spawn_id_list } +# Start a set of programs running and then wait for a bit, to be sure +# that they can be attached to. Return a list of processes spawn IDs, +# one element for each process spawned. It's a test error to call +# this when [can_spawn_for_attach] is false. + +proc spawn_wait_for_attach { executable_list } { + if ![can_spawn_for_attach] { + # The caller should have checked can_spawn_for_attach itself + # before getting here. + error "can't spawn for attach with this target/board" + } + + return [spawn_wait_for_attach_1 $executable_list] +} + # # gdb_load_cmd -- load a file into the debugger. # ARGS - additional args to load command. base-commit: 7320840f1998547b4428c58d1b39ca41febad83a -- 2.35.3