]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/testsuite: fail less catastrophically in gdb.base/style.exp
authorSimon Marchi <simon.marchi@efficios.com>
Tue, 11 Mar 2025 19:02:46 +0000 (15:02 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Thu, 13 Mar 2025 16:09:28 +0000 (12:09 -0400)
On Debian 12, with gcc 12 and ld 2.40, I get some failures when running:

    $ make check TESTS="gdb.base/style.exp" RUNTESTFLAGS="--target_board=fission"

I think I stumble on this bug [1], preventing to do the
disassembling that the test needs:

    $ ./gdb -nx -q --data-directory=data-directory testsuite/outputs/gdb.base/style/style
    Reading symbols from testsuite/outputs/gdb.base/style/style...
    (gdb) x/1i *main
    DW_FORM_strp pointing outside of .debug_str section [in module /home/smarchi/build/binutils-gdb/gdb/testsuite/outputs/gdb.base/style/style]
    (gdb)

The regexp in get_single_disassembled_insn fails to match, the insn
variable doesn't get set, and we get one of those unreadable TCL stack
traces:

    ERROR: tcl error sourcing /home/smarchi/src/binutils-gdb/gdb/testsuite/gdb.base/style.exp.
    ERROR: tcl error code TCL READ VARNAME
    ERROR: can't read "insn": no such variable
        while executing
    "return $insn"
        (procedure "get_single_disassembled_insn" line 4)
        invoked from within
    "get_single_disassembled_insn"
        ("uplevel" body line 18)
        invoked from within
    "uplevel 1 $body"
        invoked from within
    ...

Check the return value of the regexp call, return an empty string on
failure.  Log a failure, so that we have a trace that something went
wrong, in case the tests done by the caller happen to pass by change.

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111409

Change-Id: I5123d4cc0034da85a093a8531a22e972c10d94ca
Approved-By: Tom Tromey <tom@tromey.com>
gdb/testsuite/gdb.base/style.exp

index 571cb0f1a1582025b9bc74b2e3ade7856ad570d1..f63dedc756756d4a3e86ff93c7c8a720c49ddbf2 100644 (file)
@@ -431,7 +431,13 @@ proc test_disable_disassembler_styling { } {
 # disassembled instruction part.
 proc get_single_disassembled_insn {} {
     set disasm_line [capture_command_output "x/1i *main" ""]
-    regexp "^\[^:\]+:\\s*(.*)$" $disasm_line whole_match insn
+    set ret [regexp "^\[^:\]+:\\s*(.*)$" $disasm_line whole_match insn]
+
+    if { $ret == 0 } {
+       fail "failed to disassemble main"
+       return ""
+    }
+
     return $insn
 }
 
@@ -463,7 +469,10 @@ proc test_disassembler_error_handling { } {
 
        # Disassemble a single instruction and ensure that the output
        # has styling markers in it.
-       set insn_before [get_single_disassembled_insn]
+       with_test_prefix "before" {
+           set insn_before [get_single_disassembled_insn]
+       }
+
        gdb_assert { [regexp "\033" $insn_before] } \
            "have style markers when Pygments is working fine"
 
@@ -481,7 +490,10 @@ proc test_disassembler_error_handling { } {
            "setup replacement colorize_disasm function" \
            true
 
-       set insn_after [get_single_disassembled_insn]
+       with_test_prefix "after" {
+           set insn_after [get_single_disassembled_insn]
+       }
+
        gdb_assert { ![regexp "\033" $insn_after] } \
            "have no style markers when Pygments is broken"
     }