From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id AB24F3858D39 for ; Wed, 8 Feb 2023 14:48:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AB24F3858D39 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id D9D671F8B4; Wed, 8 Feb 2023 14:48:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1675867717; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WOzlnVD+Gi79ZZd1zykxSvgy9IvQaPRUv9fiYrLBJeA=; b=bt1WEJwf/0QP0LiLHk5Vbdd8yprcTyBKJWi5e/rINLDX8Y5qmuLQGhUifmVQOTGYcrUseV mOPZyInl/jaLdnHkXp+XXl/JaI6CimRXKAnRj7Uq2ZHkFhO9ZG1OhpfhN9kSFOpfcg8Bbf J3r/8sb8gmSredSIX6IqH3q8CS+V62Q= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1675867717; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WOzlnVD+Gi79ZZd1zykxSvgy9IvQaPRUv9fiYrLBJeA=; b=Et99Z0uROVCnJcbieamJA3+tmki6UrBJj9H7RKhANafap+pHGlZJk7V4wrl9j+T32Cmxsr 3G8bk96rUhESN3Dg== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id BEA0513425; Wed, 8 Feb 2023 14:48:37 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id HrFdLUW242MFLwAAMHmgww (envelope-from ); Wed, 08 Feb 2023 14:48:37 +0000 Message-ID: <23f68beb-39c5-33c8-2d2d-f076192d2648@suse.de> Date: Wed, 8 Feb 2023 15:48:36 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: [pushed] [gdb/testsuite] Use maint ignore-probes in gdb.base/longjmp.exp Content-Language: en-US To: Luis Machado , gdb-patches@sourceware.org References: <20230208124652.29570-1-tdevries@suse.de> From: Tom de Vries In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,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: On 2/8/23 14:27, Luis Machado wrote: > Hi Tom, > > Is the entire test supposed to PASS? I'm seeing the following on my > aarch64/Ubuntu 22.04 setup: > > FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 2: next over > call_longjmp (the program is no longer running) > FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 2: next over setjmp > (the program is no longer running) > FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 2: setup: breakpoint > at pattern start (got interactive prompt) > FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 2: setup: breakpoint > at safety net (got interactive prompt) > FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 2: setup: continue to > breakpoint at pattern start (the program exited) > FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 3: next over pattern > (the program is no longer running) > FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 3: setup: breakpoint > at pattern start (got interactive prompt) > FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 3: setup: continue to > breakpoint at pattern start (the program is no longer running) > > Maybe something is genuinely broken for aarch64 though, or I'm missing > some packages/debuginfo. Hi, I just ran this test-case on openSUSE Leap 15.4 aarch64, no problems found. > > This part in particular seems a bit off: > > (gdb) break 63 > No line 63 in the current file. > Make breakpoint pending on future shared library load? (y or [n]) n > (gdb) FAIL: gdb.base/longjmp.exp: with_probes=0: pattern 2: setup: > breakpoint at pattern start (got interactive prompt) > I'd focus on the first FAIL. Why is the safety net breakpoint not triggering? Thanks, - Tom > On 2/8/23 12:46, Tom de Vries via Gdb-patches wrote: >> Test-case gdb.base/longjmp.exp handles both the case that there is a libc >> longjmp probe, and the case that there isn't. >> >> However, it only tests one of the two cases. >> >> Use maint ignore-probes to test both cases, if possible. >> >> Tested on x86_64-linux. >> --- >>   gdb/testsuite/gdb.base/longjmp.exp | 295 +++++++++++++++-------------- >>   1 file changed, 157 insertions(+), 138 deletions(-) >> >> diff --git a/gdb/testsuite/gdb.base/longjmp.exp >> b/gdb/testsuite/gdb.base/longjmp.exp >> index 27a60bc4502..96d9c1c8059 100644 >> --- a/gdb/testsuite/gdb.base/longjmp.exp >> +++ b/gdb/testsuite/gdb.base/longjmp.exp >> @@ -25,181 +25,200 @@ if  { [gdb_compile >> "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb >>        return -1 >>   } >> -clean_restart ${binfile} >> +proc do_test { with_probes } { >> +    clean_restart ${::binfile} >> -if {![runto_main]} { >> -   return 0 >> -} >> +    if { !$with_probes } { >> +    gdb_test "maint ignore-probes libc ^longjmp$" >> +    } >> -# With a libc with probes, all tests should pass. >> -# >> -# Without probes, we can still set a break on longjmp, but getting >> the longjmp >> -# target may not work, in the following cases: >> -# - gdbarch_get_longjmp_target_p (gdbarch) == 0: not implemented. >> -# - gdbarch_get_longjmp_target (gdbarch) == 0: for instance on amd64 if >> -#   tdep->jb_pc_offset == -1. >> -# - gdbarch_get_longjmp_target (gdbarch) != 0: if we have a glibc with >> -#   pointer mangling ( >> https://sourceware.org/glibc/wiki/PointerEncryption ) >> -#   then we retrieve a mangled longjmp target that needs to be >> demangled. >> -#   For instance on amd64 with target board unix/-m32. >> -# >> -# Pointer demangling is currently not implemented for any target. >> -# For the amd64 case, this would require copying for instance this: >> -#   48 c1 ca 11             ror    $0x11,%rdx >> -#   64 48 33 14 25 30 00    xor    %fs:0x30,%rdx >> -# into a scratch space, save the register set, set %rdx to the mangled >> -# longjmp target, displaced-step through the two insn and read the >> -# demangled longjmp target from %rdx, and restore the register set. >> -# >> -# The failure mode in the first two cases is that the next degrades >> into a >> -# continue.  The failure mode in the latter case is a failure to set a >> -# breakpoint (matched by re_cannot_insert_bp) and a stop in longjmp. >> -# >> -# We detect the different failure modes and kfail these. >> +    if {![runto_main]} { >> +    return 0 >> +    } >> -set have_longjmp_probe 0 >> -gdb_test_multiple "info probes stap libc ^longjmp$" "" { >> -    -re -wrap "No probes matched\\." { >> -    pass $gdb_test_name >> +    # With a libc with probes, all tests should pass. >> +    # >> +    # Without probes, we can still set a break on longjmp, but >> getting the longjmp >> +    # target may not work, in the following cases: >> +    # - gdbarch_get_longjmp_target_p (gdbarch) == 0: not implemented. >> +    # - gdbarch_get_longjmp_target (gdbarch) == 0: for instance on >> amd64 if >> +    #   tdep->jb_pc_offset == -1. >> +    # - gdbarch_get_longjmp_target (gdbarch) != 0: if we have a glibc >> with >> +    #   pointer mangling ( >> https://sourceware.org/glibc/wiki/PointerEncryption ) >> +    #   then we retrieve a mangled longjmp target that needs to be >> demangled. >> +    #   For instance on amd64 with target board unix/-m32. >> +    # >> +    # Pointer demangling is currently not implemented for any target. >> +    # For the amd64 case, this would require copying for instance this: >> +    #   48 c1 ca 11             ror    $0x11,%rdx >> +    #   64 48 33 14 25 30 00    xor    %fs:0x30,%rdx >> +    # into a scratch space, save the register set, set %rdx to the >> mangled >> +    # longjmp target, displaced-step through the two insn and read the >> +    # demangled longjmp target from %rdx, and restore the register set. >> +    # >> +    # The failure mode in the first two cases is that the next >> degrades into a >> +    # continue.  The failure mode in the latter case is a failure to >> set a >> +    # breakpoint (matched by re_cannot_insert_bp) and a stop in longjmp. >> +    # >> +    # We detect the different failure modes and kfail these. >> + >> +    set have_longjmp_probe 0 >> +    gdb_test_multiple "info probes stap libc ^longjmp$" "" { >> +    -re -wrap "No probes matched\\." { >> +        pass $gdb_test_name >> +    } >> +    -re -wrap "\r\nstap\[ \t\]+libc\[ \t\]+longjmp\[ \t\]+.*" { >> +        pass $gdb_test_name >> +        set have_longjmp_probe 1 >> +    } >>       } >> -    -re -wrap "\r\nstap\[ \t\]+libc\[ \t\]+longjmp\[ \t\]+.*" { >> -    pass $gdb_test_name >> -    set have_longjmp_probe 1 >> + >> +    if { $with_probes } { >> +    if { !$have_longjmp_probe } { >> +        unsupported "longjmp probe required" >> +        return >> +    } >> +    } else { >> +    gdb_assert { !$have_longjmp_probe } >>       } >> -} >> -set bp_miss_step_1 [gdb_get_line_number "miss_step_1"] >> -set bp_miss_step_2 [gdb_get_line_number "miss_step_2"] >> +    set bp_miss_step_1 [gdb_get_line_number "miss_step_1"] >> +    set bp_miss_step_2 [gdb_get_line_number "miss_step_2"] >> -set bp_start_test_1 [gdb_get_line_number "patt1"] >> -set bp_start_test_2 [gdb_get_line_number "patt2"] >> -set bp_start_test_3 [gdb_get_line_number "patt3"] >> +    set bp_start_test_1 [gdb_get_line_number "patt1"] >> +    set bp_start_test_2 [gdb_get_line_number "patt2"] >> +    set bp_start_test_3 [gdb_get_line_number "patt3"] >> -set re_cannot_insert_bp \ >> -    [multi_line \ >> -     "Warning:" \ >> -     "Cannot insert breakpoint $decimal\\." \ >> -     "Cannot access memory at address $hex"] >> +    set re_cannot_insert_bp \ >> +    [multi_line \ >> +         "Warning:" \ >> +         "Cannot insert breakpoint $::decimal\\." \ >> +         "Cannot access memory at address $::hex"] >> -# >> -# Pattern 1 - simple longjmp. >> -# >> +    # >> +    # Pattern 1 - simple longjmp. >> +    # >> -with_test_prefix "pattern 1" { >> +    with_test_prefix "pattern 1" { >> -    with_test_prefix setup { >> -    delete_breakpoints >> +    with_test_prefix setup { >> +        delete_breakpoints >> -    gdb_test "break $bp_start_test_1" \ >> -        "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_1.*" \ >> -        "breakpoint at pattern start" >> -    gdb_test "continue" "patt1.*" "continue to breakpoint at pattern >> start" >> +        gdb_test "break $bp_start_test_1" \ >> +        "Breakpoint.*at.* file .*$::srcfile, line.*$bp_start_test_1.*" \ >> +        "breakpoint at pattern start" >> +        gdb_test "continue" "patt1.*" "continue to breakpoint at >> pattern start" >> -    # set safe-net break >> -    gdb_test "break $bp_miss_step_1" \ >> -        "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_1.*" \ >> -        "breakpoint at safety net" >> -    } >> +        # set safe-net break >> +        gdb_test "break $bp_miss_step_1" \ >> +        "Breakpoint.*at.* file .*$::srcfile, line.*$bp_miss_step_1.*" \ >> +        "breakpoint at safety net" >> +    } >> -    gdb_test "next" "longjmps\\+\\+;.*" "next over setjmp" >> -    gdb_test "next" "longjmp \\(env, 1\\);.*" "next to longjmp" >> +    gdb_test "next" "longjmps\\+\\+;.*" "next over setjmp" >> +    gdb_test "next" "longjmp \\(env, 1\\);.*" "next to longjmp" >> -    set msg "next over longjmp" >> -    gdb_test_multiple "next" $msg { >> -    -re ".*patt1.*$gdb_prompt $" { >> -        pass $msg >> -        gdb_test "next" "resumes\\+\\+.*" "next into else block" >> -        gdb_test "next" "miss_step_1.*" "next into safety net" >> -    } >> -    -re "miss_step_1.*$gdb_prompt $" { >> -        if { $have_longjmp_probe } { >> -        fail $gdb_test_name >> -        } else { >> -        kfail $gdb_test_name "gdb/26967" >> +    set msg "next over longjmp" >> +    gdb_test_multiple "next" $msg { >> +        -re ".*patt1.*$::gdb_prompt $" { >> +        pass $msg >> +        gdb_test "next" "resumes\\+\\+.*" "next into else block" >> +        gdb_test "next" "miss_step_1.*" "next into safety net" >>           } >> -    } >> -    -re -wrap "\r\n$re_cannot_insert_bp\r\n.*" { >> -        if { $have_longjmp_probe } { >> -        fail $gdb_test_name >> -        } else { >> -        kfail $gdb_test_name "gdb/26967" >> +        -re "miss_step_1.*$::gdb_prompt $" { >> +        if { $have_longjmp_probe } { >> +            fail $gdb_test_name >> +        } else { >> +            kfail $gdb_test_name "gdb/26967" >> +        } >> +        } >> +        -re -wrap "\r\n$re_cannot_insert_bp\r\n.*" { >> +        if { $have_longjmp_probe } { >> +            fail $gdb_test_name >> +        } else { >> +            kfail $gdb_test_name "gdb/26967" >> +        } >>           } >>       } >>       } >> -} >> -# >> -# Pattern 2 - longjmp from an inner function. >> -# >> +    # >> +    # Pattern 2 - longjmp from an inner function. >> +    # >> -with_test_prefix "pattern 2" { >> +    with_test_prefix "pattern 2" { >> -    with_test_prefix setup { >> -    delete_breakpoints >> +    with_test_prefix setup { >> +        delete_breakpoints >> -    gdb_test "break $bp_start_test_2" \ >> -        "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_2.*" \ >> -        "breakpoint at pattern start" >> -    gdb_test "continue" "patt2.*" "continue to breakpoint at pattern >> start" >> +        gdb_test "break $bp_start_test_2" \ >> +        "Breakpoint.*at.* file .*$::srcfile, line.*$bp_start_test_2.*" \ >> +        "breakpoint at pattern start" >> +        gdb_test "continue" "patt2.*" "continue to breakpoint at >> pattern start" >> -    # set safe-net break >> -    gdb_test "break $bp_miss_step_2" \ >> -        "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_2.*" \ >> -        "breakpoint at safety net" >> -    } >> +        # set safe-net break >> +        gdb_test "break $bp_miss_step_2" \ >> +        "Breakpoint.*at.* file .*$::srcfile, line.*$bp_miss_step_2.*" \ >> +        "breakpoint at safety net" >> +    } >> -    gdb_test "next" "call_longjmp.*" "next over setjmp" >> +    gdb_test "next" "call_longjmp.*" "next over setjmp" >> -    set msg "next over call_longjmp" >> -    gdb_test_multiple "next" $msg { >> -    -re ".*patt2.*$gdb_prompt $" { >> -        pass $msg >> +    set msg "next over call_longjmp" >> +    gdb_test_multiple "next" $msg { >> +        -re ".*patt2.*$::gdb_prompt $" { >> +        pass $msg >> -        gdb_test "next" "resumes\\+\\+.*" "next into else block" >> -        gdb_test "next" "miss_step_2.*" "next into safety net" >> -    } >> -    -re "miss_step_2.*$gdb_prompt $" { >> -        if { $have_longjmp_probe } { >> -        fail $gdb_test_name >> -        } else { >> -        kfail $gdb_test_name "gdb/26967" >> +        gdb_test "next" "resumes\\+\\+.*" "next into else block" >> +        gdb_test "next" "miss_step_2.*" "next into safety net" >>           } >> -    } >> -    -re -wrap "\r\n$re_cannot_insert_bp\r\n.*" { >> -        if { $have_longjmp_probe } { >> -        fail $gdb_test_name >> -        } else { >> -        kfail $gdb_test_name "gdb/26967" >> +        -re "miss_step_2.*$::gdb_prompt $" { >> +        if { $have_longjmp_probe } { >> +            fail $gdb_test_name >> +        } else { >> +            kfail $gdb_test_name "gdb/26967" >> +        } >> +        } >> +        -re -wrap "\r\n$re_cannot_insert_bp\r\n.*" { >> +        if { $have_longjmp_probe } { >> +            fail $gdb_test_name >> +        } else { >> +            kfail $gdb_test_name "gdb/26967" >> +        } >>           } >>       } >>       } >> -} >> -# >> -# Pattern 3 - setjmp/longjmp inside stepped-over function. >> -# >> +    # >> +    # Pattern 3 - setjmp/longjmp inside stepped-over function. >> +    # >> -with_test_prefix "pattern 3" { >> +    with_test_prefix "pattern 3" { >> -    with_test_prefix setup { >> -    delete_breakpoints >> +    with_test_prefix setup { >> +        delete_breakpoints >> -    gdb_test "break $bp_start_test_3" \ >> -        "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_3.*" \ >> -        "breakpoint at pattern start" >> -    gdb_test "continue" "patt3.*" "continue to breakpoint at pattern >> start" >> -    } >> - >> -    gdb_test_multiple "next" "next over pattern" { >> -    -re -wrap "longjmp caught.*" { >> -        pass $gdb_test_name >> +        gdb_test "break $bp_start_test_3" \ >> +        "Breakpoint.*at.* file .*$::srcfile, line.*$bp_start_test_3.*" \ >> +        "breakpoint at pattern start" >> +        gdb_test "continue" "patt3.*" "continue to breakpoint at >> pattern start" >>       } >> -    -re -wrap "\r\n$re_cannot_insert_bp\r\n.*" { >> -        if { $have_longjmp_probe } { >> -        fail $gdb_test_name >> -        } else { >> -        kfail $gdb_test_name "gdb/26967" >> + >> +    gdb_test_multiple "next" "next over pattern" { >> +        -re -wrap "longjmp caught.*" { >> +        pass $gdb_test_name >> +        } >> +        -re -wrap "\r\n$re_cannot_insert_bp\r\n.*" { >> +        if { $have_longjmp_probe } { >> +            fail $gdb_test_name >> +        } else { >> +            kfail $gdb_test_name "gdb/26967" >> +        } >>           } >>       } >>       } >>   } >> + >> +foreach_with_prefix with_probes { 0 1 } { >> +    do_test $with_probes >> +} >> >> base-commit: 0ab9328277ce12014ce05ff139eba7a6230516fd >