aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
AgeCommit message (Collapse)AuthorFilesLines
2023-03-20Update python-helper.exp for type allocation changesTom Tromey1-1/+1
The type allocation changes introduced a failure in python-helper.exp that I did not notice. The bug is that, with these patches, arch-allocated integer types have a TYPE_SPECIFIC_INT object attached. This patch updates the test to allow this. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30253
2023-03-20[gdb/testsuite] Handle remotedir in remote_uploadTom de Vries2-3/+16
Dejagnu's remotedir implementation has support in remote_exec and remote_download, but not remote_upload. Consider the following scenario: - downloading an executable to target, - running it, - uploading a file produced by the executable while assuming remote target user remote-target with homedir /home/remote-target and remotedir set to /home/remote-target/tmp. Concretely, it looks like this: ... # binfile == "$outputs/gdb.abc/a.out" set target_binfile [remote_download target $binfile] # target_binfile == "/home/remote-target/tmp/a.out" remote_exec target $target_binfile # Running $target_binfile produced /home/remote-target/tmp/result.txt. set result [remote_upload target /home/remote-target/tmp/result.txt \ $outputs/gdb.abc/result.txt] # result == $outputs/gdb.abc/result.txt. ... Add a remote_upload implementation that also handles remotedir in lib/gdb.exp, overriding dejagnu's remote_upload, such that we can simplify the remote_upload call to: ... set result [remote_upload target result.txt $outputs/gdb.abc/result.txt] ... Tested on x86_64-linux. PR testsuite/30250 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30250
2023-03-20gdb: fix crash during command completionAndrew Burgess4-0/+77
In some cases GDB will fail when attempting to complete a command that involves a rust symbol, the failure can manifest as a crash. The problem is caused by the completion_match_for_lcd object being left containing invalid data during calls to cp_symbol_name_matches_1. The first question to address is why we are calling a C++ support function when handling a rust symbol. That's due to GDB's auto language detection for msymbols, in some cases GDB can't tell if a symbol is a rust symbol, or a C++ symbol. The test application contains symbols for functions which are statically linked in from various rust support libraries. There's no DWARF for these symbols, so all GDB has is the msymbols built from the ELF symbol table. Here's the problematic symbol that leads to our crash: mangled: _ZN4core3str21_$LT$impl$u20$str$GT$5parse17h5111d2d6a50d22bdE demangled: core::str::<impl str>::parse As an msymbol this is initially created with language auto, then GDB eventually calls symbol_find_demangled_name, which loops over all languages calling language_defn::sniff_from_mangled_name, the first language that can demangle the symbol gets assigned as the language for that symbol. Unfortunately, there's overlap in the mangled symbol names, some (legacy) rust symbols can be demangled as both rust and C++, see cplus_demangle in libiberty/cplus-dem.c where this is mentioned. And so, because we check the C++ language before we check for rust, then the msymbol is (incorrectly) given the C++ language. Now it's true that is some cases we might be able to figure out that a demangled symbol is not actually a valid C++ symbol, for example, in our case, the construct '::<impl str>::' is not, I believe, valid in a C++ symbol, we could look for ':<' and '>:' and refuse to accept this as a C++ symbol. However, I'm not sure it is always possible to tell that a demangled symbol is rust or C++, so, I think, we have to accept that some times we will get this language detection wrong. If we accept that we can't fix the symbol language detection 100% of the time, then we should make sure that GDB doesn't crash when it gets the language wrong, that is what this commit addresses. In our test case the user tries to complete a symbol name like this: (gdb) complete break pars This results in GDB trying to find all symbols that match 'pars', eventually we consider our problematic symbol, and we end up with a call stack that looks like this: #0 0x0000000000f3c6bd in strncmp_iw_with_mode #1 0x0000000000706d8d in cp_symbol_name_matches_1 #2 0x0000000000706fa4 in cp_symbol_name_matches #3 0x0000000000df3c45 in compare_symbol_name #4 0x0000000000df3c91 in completion_list_add_name #5 0x0000000000df3f1d in completion_list_add_msymbol #6 0x0000000000df4c94 in default_collect_symbol_completion_matches_break_on #7 0x0000000000658c08 in language_defn::collect_symbol_completion_matches #8 0x0000000000df54c9 in collect_symbol_completion_matches #9 0x00000000009d98fb in linespec_complete_function #10 0x00000000009d99f0 in complete_linespec_component #11 0x00000000009da200 in linespec_complete #12 0x00000000006e4132 in complete_address_and_linespec_locations #13 0x00000000006e4ac3 in location_completer In cp_symbol_name_matches_1 we enter a loop, this loop repeatedly tries to match the demangled problematic symbol name against the user supplied text ('pars'). Each time around the loop another component of the symbol name is stripped off, thus, we check 'pars' against these options: core::str::<impl str>::parse str::<impl str>::parse <impl str>::parse parse As soon as we get a match the cp_symbol_name_matches_1 exits its loop and returns. In our case, when we're looking for 'pars', the match occurs on the last iteration of the loop, when we are comparing to 'parse'. Now the problem here is that cp_symbol_name_matches_1 uses the strncmp_iw_with_mode, and inside strncmp_iw_with_mode we allow for skipping over template parameters. This allows GDB to match the symbol name 'foo<int>(int,int)' if the user supplies 'foo(int,'. Inside strncmp_iw_with_mode GDB will record any template arguments that it has skipped over inside the completion_match_for_lcd object that is passed in as an argument. And so, when GDB tries to match against '<impl str>::parse', the first thing it sees is '<impl str>', GDB assumes this is a template argument and records this as a skipped region within the completion_match_for_lcd object. After '<impl str>' GDB sees a ':' character, which doesn't match with the 'pars' the user supplied, so strncmp_iw_with_mode returns a value indicating a non-match. GDB then removes the '<impl str>' component from the symbol name and tries again, this time comparing to 'parse', which does match. Having found a match, then in cp_symbol_name_matches_1 we record the match string, and the full symbol name within the completion_match_result object, and return. The problem here is that the skipped region, the '<impl str>' that we recorded in the penultimate loop iteration was never discarded, its still there in our returned result. If we look at what the pointers held in the completion_match_result that cp_symbol_name_matches_1 returns, this is what we see: core::str::<impl str>::parse | \________/ | | | '--- completion match string | '---skip range '--- full symbol name When GDB calls completion_match_for_lcd::finish, GDB tries to create a string using the completion match string (parse), but excluding the skip range, as the stored skip range is before the start of the completion match string, then GDB tries to do some weird string creation, which will cause GDB to crash. The reason we don't often see this problem in C++ is that for C++ symbols there is always some non-template text before the template argument. This non-template text means GDB is likely to either match the symbol, or reject the symbol without storing a skip range. However, notice, I did say, we don't often see this problem. Once I understood the issue, I was able to reproduce the crash using a pure C++ example: template<typename S> struct foo { template<typename T> foo (int p1, T a) { s = 0; } S s; }; int main () { foo<int> obj (2.3, 0); return 0; } Then in GDB: (gdb) complete break foo(int The problem here is that the C++ symbol for the constructor looks like this: foo<int>::foo<double>(int, double) When GDB enters cp_symbol_name_matches_1 the symbols it examines are: foo<int>::foo<double>(int, double) foo<double>(int, double) The first iteration of the loop will match the 'foo', then add the '<int>' template argument will be added as a skip range. When GDB find the ':' after the '<int>' the first iteration of the loop fails to match, GDB removes the 'foo<int>::' component, and starts the second iteration of the loop. Again, GDB matches the 'foo', and now adds '<double>' as a skip region. After that the '(int' successfully matches, and so the second iteration of the loop succeeds, but, once again we left the '<int>' in place as a skip region, even though this occurs before the start of our match string, and this will cause GDB to crash. This problem was reported to the mailing list, and a solution discussed in this thread: https://sourceware.org/pipermail/gdb-patches/2023-January/195166.html The solution proposed here is similar to one proposed by the original bug reported, but implemented in a different location within GDB. Instead of placing the fix in strncmp_iw_with_mode, I place the fix in cp_symbol_name_matches_1. I believe this is a better location as it is this function that implements the loop, and it is this loop, which repeatedly calls strncmp_iw_with_mode, that should be resetting the result object state (I believe). What I have done is add an assert to strncmp_iw_with_mode that the incoming result object is empty. I've also added some other asserts in related code, in completion_match_for_lcd::mark_ignored_range, I make some basic assertions about the incoming range pointers, and in completion_match_for_lcd::finish I also make some assertions about how the skip ranges relate to the match pointer. There's two new tests. The original rust example that was used in the initial bug report, and a C++ test. The rust example depends on which symbols are pulled in from the rust libraries, so it is possible that, at some future date, the problematic symbol will disappear from this test program. The C++ test should be more reliable, as this only depends on symbols from within the C++ source code. Since I originally posted this patch to the mailing list, the following patch has been merged: commit 6e7eef72164c00d6a5a7b0bce9fa01f5481f33cb Date: Sun Mar 19 09:13:10 2023 -0600 Use rust_demangle to fix a crash This solves the problem of a rust symbol ending up in the C++ specific code by changing the order languages are sorted. However, this new commit doesn't address the issue in the C++ code which was fixed with this commit. Given that the C++ issue is real, and has a reproducer, I'm still going to merge this fix. I've left the discussion of rust in this commit message as I originally wrote it, but it should be read within the context of GDB prior to commit 6e7eef72164c00d6a5a7. Co-Authored-By: Zheng Zhan <zzlossdev@163.com>
2023-03-20Use rust_demangle to fix a crashTom Tromey1-0/+3
PR rust/30211 points out a crash caused by a particular completion. This turns out to happen because a Rust minsym winds up in a C++-specific path in strncmp_iw_with_mode, which ultimately causes the completer to pass invalid arguments to string::append. This patch fixes the bug by reordering the language constants so that Rust comes before C++, and then using rust_demangle. This ensures that minsyms are correctly marked as "Rust", avoiding this code and thus the crash. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=20367 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30211 Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-03-20gdb: don't use the global thread-id in the saved breakpoints fileAndrew Burgess2-0/+62
I noticed that breakpoint::print_recreate_thread was printing the global thread-id. This function is used to implement the 'save breakpoints' command, and should be writing out suitable CLI commands for recreating the current breakpoints. The CLI does not use global thread-ids, but instead uses the inferior specific thread-ids, e.g. "2.1". After some discussion on the mailing list it was suggested that the most consistent solution would be for the saved breakpoints file to always contain the inferior-qualified thread-id, so the file would include "thread 1.1" instead of just "thread 1", even when there is only a single inferior. So, this commit adds print_full_thread_id, which is just like the existing print_thread_id, only it always prints the inferior-qualified thread-id. I then update the existing print_thread_id to make use of this new function, and finally, I update breakpoint::print_recreate_thread to also use this new function. There's a multi-inferior test that confirms the saved breakpoints file correctly includes the fully-qualified thread-id, and I've also updated the single inferior test gdb.base/save-bp.exp to have it validate that the saved breakpoints file includes the inferior-qualified thread-id, even for this single inferior case.
2023-03-18[gdb/testsuite] Handle unbuffer_output.c for remote hostTom de Vries25-28/+79
Handle $srcdir/lib/unbuffer_output.c using lappend_include_file. Tested on x86_64-linux.
2023-03-18[gdb/testsuite] Handle my-syscalls.h for remote hostTom de Vries2-1/+3
Handle $srcdir/lib/my-syscalls.h using lappend_include_dir. Tested on x86_64-linux.
2023-03-18[gdb/testsuite] Handle attributes.h for remote hostTom de Vries15-25/+81
Handle $srcdir/lib/attributes.h using lappend_include_dir. Tested on x86_64-linux.
2023-03-17PowerPC: fix for gdb.reverse/finish-precsave.exp and ↵Carl Love2-0/+315
gdb.reverse/finish-reverse.exp PPC64 multiple entry points, a normal entry point and an alternate entry point. The alternate entry point is to setup the Table of Contents (TOC) register before continuing at the normal entry point. When the TOC is already valid, the normal entry point is used, this is typically the case. The alternate entry point is typically referred to as the global entry point (GEP) in IBM. The normal entry point is typically referred to as the local entry point (LEP). When GDB is executing the finish command in reverse, the function finish_backward currently sets the break point at the alternate entry point. This issue is if the function, when executing in the forward direction, entered the function via the normal entry point, execution in the reverse direction will never sees the break point at the alternate entry point. In this case, the reverse execution continues until the next break point is encountered thus stopping at the wrong place. This patch adds a new address to struct execution_control_state to hold the address of the alternate entry point (GEP). The finish_backwards function is updated, if the stopping point is between the normal entry point (LEP) and the end of the function, a breakpoint is set at the normal entry point. If the stopping point is between the entry points, a breakpoint is set at the alternate entry point. This ensures that GDB will always stop at the normal entry point. If the function did enter via the alternate entry point, GDB will detect that and continue to execute backwards in the function until the alternate entry point is reached. The patch fixes the behavior of the reverse-finish command on PowerPC to match the behavior of the command on other platforms, specifically X86. The patch does not change the behavior of the command on X86. A new test is added to verify the reverse-finish command on PowerPC correctly stops at the instruction where the function call is made. The patch fixes 11 regression errors in test gdb.reverse/finish-precsave.exp and 11 regression errors in test gdb.reverse/finish-reverse.exp. The patch has been tested on Power 10 and X86 processor with no new regression failures.
2023-03-17Move step_until procedureCarl Love2-55/+41
Procedure step_until from test gdb.reverse/step-indirect-call-thunk.exp is moved to lib/gdb.exp and renamed repeat_cmd_until. The existing procedure gdb_step_until in lib/gdb.exp is simpler variant of the new repeat_cmd_until procedure. The existing procedure gdb_step_until is changed to just call the new repeat_cmd_until procedure with the command set to "step" and an optional CURRENT string. The default CURRENT string is set to "\}" to work with the existing uses of procedure gdb_step_until.
2023-03-17[gdb/testsuite] Fix regexp in gdb.arch/ftrace-insn-reloc.expTom de Vries1-1/+1
With test-case gdb.arch/ftrace-insn-reloc.exp and host board local-remote-host-notty and target board native-gdbserver I run into: ... (gdb) info sharedlibrary^M From To Syms Read Shared Object Library^M $hex $hex Yes /lib64/ld-linux-x86-64.so.2^M $hex $hex Yes /home/remote-host/libinproctrace.so^M $hex $hex Yes /lib64/libm.so.6^M $hex $hex Yes /lib64/libc.so.6^M $hex $hex Yes /lib64/libdl.so.2^M $hex $hex Yes (*) /usr/lib64/libstdc++.so.6^M $hex $hex Yes (*) /lib64/libgcc_s.so.1^M $hex $hex Yes /lib64/libpthread.so.0^M (*): Shared library is missing debugging information.^M (gdb) FAIL: gdb.arch/ftrace-insn-reloc.exp: IPA loaded ... due to trying to match libinproctrace.so using the target path, while the command lists it using the host path. Fix this by making the regexp less strict. Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Handle remote host in gdb_load_shlibTom de Vries2-6/+20
With test-case gdb.arch/ftrace-insn-reloc.exp and host board local-remote-host-notty and target board native-gdbserver I run into: ... (gdb) tstart^M Target returns error code '.In-process agent library not loaded in process. \ Fast and static trace points unavailable.'.^M (gdb) FAIL: gdb.arch/ftrace-insn-reloc.exp: start trace experiment ... Fix this by: - handling remote host in gdb_load_shlib, and - moving the gdb_load_shlib to after the clean_restart, such that the set solib-search-path can take effect. Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Fix gdb.arch/i386-biarch-core.exp for remote hostTom de Vries1-0/+2
Fix test-case gdb.arch/i386-biarch-core.exp using gdb_download_remote host. Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Handle REMOTE_HOST_USERNAME in local-remote-hostTom de Vries2-4/+25
Handle REMOTE_HOST_USERNAME in local-remote-host, similar to how that's done for REMOTE_TARGET_USERNAME in remote-gdbserver-on-localhost. This helps to keep the home dir clean. Since the setup makes $build/gdb/testsuite on build unreadable for the remote host, we run into permission problems for GDB and the data-directory, so fix this (as was done for gdbserver in gdbserver-base.exp) using file normalize. Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Set remotedir by default in some boardsTom de Vries3-16/+77
When doing a gdb_simple_compile, and downloading the resulting exec $obj to target the result $target_obj may be a relative file path, which may give problems when trying to do: ... remote_exec target $target_obj ... Fix/workaround this on some target boards by setting remotedir by default, and add a corresponding test in gdb.testsuite/board-sanity.exp. This doesn't work for host/target board local-remote-host-native, so xfail this. Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Fix have_avx for remote targetTom de Vries1-5/+10
In proc have_avx we compile some source into an exec, resulting in a file $obj on build, and then attempt to execute it on target: ... set result [remote_exec target $obj] ... Fix this by using gdb_remote_download target. Likewise in a few other procs that use "remote_exec target". Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Handle precise-aligned-alloc.c for remote hostTom de Vries5-2/+22
With test-case gdb.arch/i386-sse.exp (and likewise gdb.arch/i386-avx.exp) and host board local-remote-host-notty and target board native-gdbserver I run into: ... gdb compile failed, i386-sse.c:68:10: fatal error: \ ../lib/precise-aligned-alloc.c: No such file or directory #include "../lib/precise-aligned-alloc.c" ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ... Fix this using '#include "precise-aligned-alloc.c"' and making that work with non-remote and remote host. Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Handle remote host in escape_for_hostTom de Vries1-2/+8
With test-case gdb.arch/ftrace-insn-reloc.exp and host board local-remote-host-notty and target board native-gdbserver, I run into: ... FAIL: gdb.arch/ftrace-insn-reloc.exp: IPA loaded ... due to having: ... $ readelf -d ftrace-insn-reloc | grep RUNPATH 0x000000000000001d (RUNPATH) Library runpath: [] ... instead of: ... $ readelf -d ftrace-insn-reloc | grep RUNPATH 0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN] ... Handle this in escape_for_host. Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Add escape_for_hostTom de Vries1-1/+11
In gdb_compile we have: ... lappend new_options "ldflags=-Wl,-rpath,\\\$ORIGIN" ... and we could improve readability by using {} rather than "": ... lappend new_options {ldflags=-Wl,-rpath,\$ORIGIN} ... But rather than manually adding escapes in a string, add a new proc escape_for_host that care of this for us, allowing us to write: ... lappend new_options [escape_for_host {ldflags=-Wl,-rpath,$ORIGIN}] ... Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Declare ada unsupported for remote hostTom de Vries1-0/+4
Currently gdb_ada_compile doesn't support remote host. Make this explicit in allow_ada_tests. Tested on x86_64-linux.
2023-03-17[gdb/testsuite] Fix filename in gdb.debuginfod/crc_mismatch.expTom de Vries1-1/+1
After running test-case gdb.debuginfod/crc_mismatch.exp, I find a dir called '$': ... $ ls $build/gdb/testsuite/ $ config.log gdb.log lib outputs site.exp cache config.status gdb.sum Makefile site.bak temp ... Fix this by removing the stray '$' here: ... set debugfile "$[standard_output_file ${testfile}.debug]" ... Tested on x86_64-linux.
2023-03-16gdb/testsuite: Add support for LoongArch in gdb.base/float.expHui Li1-0/+2
The test results on LoongArch as follows: Without this patch: ``` $ make check-gdb TESTS="gdb.base/float.exp" === gdb Summary === # of expected passes 2 # of unexpected failures 1 ``` With this patch: ``` $ make check-gdb TESTS="gdb.base/float.exp" === gdb Summary === # of expected passes 3 ``` Signed-off-by: Hui Li <lihui@loongson.cn> Reviewed-By: Tom Tromey <tom@tromey.com> Approved-By: Simon Marchi <simon.marchi@efficios.com> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
2023-03-15[gdb/testsuite] Fix re-used exec in gdb.arch/ftrace-insn-reloc.expTom de Vries1-4/+2
In test-case gdb.arch/ftrace-insn-reloc.exp we generate two executables with the same name, which is confusing and known to cause trouble. Fix this by making the executable names unique. Tested on x86_64-linux.
2023-03-15[gdb/testsuite] Fix gdb.arch/amd64-stap-special-operands.exp for remote hostTom de Vries1-2/+3
With test-case gdb.arch/amd64-stap-special-operands.exp and host board local-remote-host-notty and target board native-gdbserver I run into: ... (gdb) break -pstap three_arg^M No probe matching objfile=`<any>', provider=`<any>', name=`three_arg'^M Make breakpoint pending on future shared library load? (y or [n]) n^M (gdb) FAIL: gdb.arch/amd64-stap-special-operands.exp: probe: three_arg: \ gdb_breakpoint: set breakpoint at -pstap three_arg ... due to compiling two executables with the same name, and when uploading the second one from host to build, we run into: ... Upload from 127.0.0.1 failed, \ $outputs/gdb.arch/amd64-stap-special-operands/amd64-stap-special-operands: \ Text file busy. ... Fix this by making the executable names unique. Tested on x86_64-linux.
2023-03-15[gdb/testsuite] Fix gdb.arch/i386-pkru.exp for native-gdbserverTom de Vries1-3/+12
With test-case gdb.arch/i386-pkru.exp and target board native-gdbserver we run into: ... FAIL: gdb.arch/i386-pkru.exp: variable after reading pkru ... This looks similar to the the problem for which there's already an xfail, so fix this by extending the xfail matching. Tested on x86_64-linux. Also tested on openSUSE Tumbleweed, where all tests in the test-case pass.
2023-03-15[gdb/testsuite] Unset DEBUGINFOD_URLS on remote hostTom de Vries1-1/+19
When running test-case gdb.arch/i386-pkru.exp with host board local-remote-host-notty and target board native-gdbserver on openSUSE Tumbleweed (with DEBUGINFOD_URLS set), I run into: ... This GDB supports auto-downloading debuginfo from the following URLs:^M <https://debuginfod.opensuse.org/>^M Enable debuginfod for this session? (y or [n]) ^CQuit^M (gdb) FAIL: gdb.arch/i386-pkru.exp: runto: run to main ... The problem is that the unsetenv for DEBUGINFOD_URLS in default_gdb_init: ... # If DEBUGINFOD_URLS is set, gdb will try to download sources and # debug info for f.i. system libraries. Prevent this. unset -nocomplain ::env(DEBUGINFOD_URLS) ... doesn't work on remote host. Fix this by using "set debuginfod enabled off" for remote host. Tested on x86_64-linux.
2023-03-15[gdb/testsuite] Fix gdb.arch/amd64*.exp with local-remote-host-native.expTom de Vries5-14/+35
There's a number of gdb.arch/amd64*.exp test-cases that fail with host+target board local-remote-host-native.exp because of using a .S file, generated from a .c file. If a test-case compiles the .S file when executing on remote host, the .S file is already copied from build to host, such that it's available for the compiler. But that's not the case for the .c file, which is needed by gdb to show a source line: ... (gdb) continue^M Continuing.^M ^M Breakpoint 2, fn2 (y=y@entry=25, x=x@entry=6) at amd64-entry-value-inline.c:32^M 32 in gdb.arch/amd64-entry-value-inline.c^M (gdb) FAIL: gdb.arch/amd64-entry-value-inline.exp: continue to breakpoint: \ break-here ... Fix this by using "gdb_remote_download host <.c file>". Tested on x86_64-linux, with host+target board local-remote-host-native.
2023-03-14Implement DAP variables, scopes, and evaluate requestsTom Tromey2-0/+136
The DAP code already claimed to implement "scopes" and "evaluate", but this wasn't done completely correctly. This patch implements these and also implements the "variables" request. After this patch, variables and scopes correctly report their sub-structure. This also interfaces with the gdb pretty-printer API, so the output of pretty-printers is available.
2023-03-14[gdb/testsuite] Add gdb.testsuite/board-sanity.expTom de Vries4-42/+124
Add a test-case that tests the sanity of target/host boards. It contains a number of tests related to remote file manipulation, exercising: - remote_upload - remote_download - remote_file exists - remote_file delete which check that these work together as expected. Tested on x86_64-linux, with all relevant gdb/testsuite/boards/*.exp boards. For target board remote-stdio-gdbserver.exp, this revealed a trivial problem with the return value of proc ${board}_file for delete, so fix this. The test-case shows that the proc ${board}_download in local-remote-host-native.exp is broken, so remove it. Likewise for board local-remote-host.exp, so remove proc ${board}_download and associated ${board}_file. Tested on x86_64-linux.
2023-03-13Fix crash in inside_main_funcTom Tromey2-0/+65
gdb 13.1 crashes while running the rust compiler's debugger tests. The crash has a number of causes. First, the rust compiler still uses the C++-like _Z mangling, but with its own twist -- some hex digits added to the end of a symbol. So, while gdb finds the correct name of "main": (top-gdb) p name $13 = 0x292e0c0 "rustc_gdb_1031745::main" It isn't found in the minsyms, because C++ demangling yields: [99] t 0x90c0 _ZN17rustc_gdb_10317454main17h5b5be7fe16a97225E section .text rustc_gdb_1031745::main::h5b5be7fe16a97225 zko06yobckx336v This could perhaps be fixed. I also filed a new PR to suggest preferring the linkage name of the main program. Next, the rust compiler emits both a DW_TAG_subprogram and a DW_TAG_namespace for "main". This happens because the file is named "main.rs" -- i.e., the bug is specific to the source file name. The crash also seems to require the nested function inside of 'main', at least for me. The namespace always is generated, but perhaps this changes the ordering in the DWARF. When inside_main_func looks up the main symbol, it finds the namespace symbol rather than the function. (I filed a bug about fixing gdb's symbol tables -- long overdue.) Meanwhile, as I think it's important to fix this crash sooner rather than later, this patch changes inside_main_func to check that the symbol that is found is LOC_BLOCK. This perhaps should have been done in the first place, anyway. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30158
2023-03-13[gdb/testsuite] Fix gdb.python/tui-window-factory.exp for remote hostTom de Vries1-1/+4
When running gdb.python/tui-window.exp with host board local-remote-host-notty and target board native-gdbserver, I get: ... FAIL: gdb.python/tui-window-factory.exp: msg_2: \ check test_window box (box check: ul corner is l, not +) ... The problem is that the result of Term::prepare_for_tui is not checked. Fix this by adding the missing check. Tested on x86_64-linux.
2023-03-13[gdb/testsuite] Fix gdb.python/tui-window.exp for remote hostTom de Vries1-0/+1
When running gdb.python/tui-window.exp with host board local-remote-host-notty and target board native-gdbserver, I get: ... UNSUPPORTED: gdb.python/tui-window.exp: TUI not supported FAIL: gdb.python/tui-window.exp: test title ... Fix this by adding the missing return after the unsupported. Tested on x86_64-linux.
2023-03-13[gdb/testsuite] Fix gdb.tui/completion.exp for local-remote-host-nottyTom de Vries1-5/+8
When running test-case gdb.tui/completion.exp with host board local-remote-host-notty and target board native-gdbserver, I get: ... FAIL: gdb.tui/completion.exp: completion of layout names: \ tab completion (timeout) ... The test-case contains a few tests that do tab completion, which requires readline, which is unavailable with host board local-remote-host-notty. Fix this by adding the missing check for readline_is_used. Tested on x86_64-linux.
2023-03-13[gdb/testsuite] Fix gdb.tui/tui-layout.exp for remote hostTom de Vries1-0/+4
When running test-case gdb.tui/tui-layout.exp with host board local-remote-host-notty and target board native-gdbserver, I get: ... FAIL: gdb.tui/tui-layout.exp: terminal=dumb: execution=false: layout=asm: \ layout asm (timeout) ... The problem is that the test-case expects that the default "setenv TERM dumb" has effect, which is not the case for remote host. Fix this by skipping the test for remote host. Tested on x86_64-linux.
2023-03-13[gdb/testsuite] Fix gdb.tui/tui-nl-filtered-output.exp for remote hostTom de Vries1-1/+4
When running test-case gdb.tui/tui-nl-filtered-output.exp with host board local-remote-host-notty and target board native-gdbserver, I get: ... FAIL: gdb.tui/tui-nl-filtered-output.exp: check printf output ... The problem is that Term::enter_tui is returning 0, but the test-case doesn't check for this, and consequently runs unsupported tests. Fix this by adding the missing check. Tested on x86_64-linux.
2023-03-13[gdb/testsuite] Require ![is_remote host] for TUITom de Vries1-0/+8
When running test-case gdb.tui/corefile-run.exp with both host and target board local-remote-host-native.exp, we run into: ... FAIL: gdb.tui/corefile-run.exp: load corefile ... while this passes with USE_TUI=0. The problem is that the TUI setup code uses "setenv TERM ansi", which has no effect on remote host. I can confirm this analysis by working around this problem in local-remote-host-native.exp like this: ... - spawn $RSH -t -l $username $remote $cmd + spawn $RSH -t -l $username $remote "export TERM=ansi; $cmd" ... For now, simply make TUI unsupported for remote host, by returning 0 in prepare_for_tui. Tested on x86_64-linux.
2023-03-13[gdb/testsuite] Handle USE_TUI in gdb.tui/corefile-run.expTom de Vries1-3/+15
Once in a while I find myself rewriting a TUI test-case into a non-TUI test-case, to better understand whether the problem I'm looking at is related to the TUI or not. I've got the impression that I've done this sufficiently often that it's worth committing the non-TUI version, so having just written a non-TUI version of gdb.tui/corefile-run.exp, let's commit it. The non-TUI version can be enabled by doing: ... $ make check "RUNTESTFLAGS=gdb.tui/corefile-run.exp USE_TUI=0" ... Also remove hard-coding of a source line number. Tested on x86_64-linux.
2023-03-13[gdb/testsuite] Fix untested message in gdb.tui/corefile-run.expTom de Vries2-6/+22
In test-case gdb.tui/corefile-run.exp, we have this bit: ... require !use_gdb_stub if { [target_info gdb_protocol] == "extended-remote" } { untested "not supported" return } ... So with target board native-gdbserver we get: ... UNSUPPORTED: gdb.tui/corefile-run.exp: require failed: !use_gdb_stub ... and with target board native-extended-gdbserver instead: ... UNTESTED: gdb.tui/corefile-run.exp: not supported ... Fix this by: - adding an optional argument target_description to proc target_can_use_run_cmd - handling the target_description == core && [target_info gdb_protocol] == "extended-remote" case in the proc - using require {target_can_use_run_cmd core} such that now in both cases we have: ... UNSUPPORTED: gdb.tui/corefile-run.exp: require failed: \ target_can_use_run_cmd core ... Tested on x86_64-linux.
2023-03-13[gdb/testsuite] Fix gdb.threads/step-bg-decr-pc-switch-thread.exp for ↵Tom de Vries1-2/+13
native-gdbserver With test-case gdb.threads/step-bg-decr-pc-switch-thread.exp and target board native-gdbserver, I run into: ... (gdb) UNSUPPORTED: gdb.threads/step-bg-decr-pc-switch-thread.exp: \ switch to main thread Remote debugging from host ::1, port 43914^M monitor exit^M Cannot execute this command while the target is running.^M Use the "interrupt" command to stop the target^M and then try again.^M (gdb) WARNING: Timed out waiting for EOF in server after monitor exit ... Fix this by following the advice and issuing an interrupt command, allowing the following monitor exit command to succeed. Tested on x86_64-linux.
2023-03-13[gdb/obvious]: fix python formatting for test gdb.python/py-typeprint.pyBruno Larsen1-3/+8
python black formatter was complaining about the formatting of gdb.python/py-typeprint.py, so this commit corrects it.
2023-03-13gdb/testsuite: add regression test for per-objfile typeprintersBruno Larsen3-3/+32
PR python/17136 reported an unhandled exception when using typeprinters only valid on some objfiles, rather than being a global typeprinter. The fix was accepted without a regression test, and we've been carrying one out-of-tree for a while but I think it's worth upstreaming. The code itself was developed by Jan Kratochvil. Co-Authored-By: Jan Kratochvil <jkratochvil@azul.com> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=17136 Reviewed-By: Andrew Burgess <aburgess@redhat.com> Approved-By: Tom Tromey <tom@tromey.com>
2023-03-10[gdb/testsuite] Fix gdb.python/py-completion.expTom de Vries1-0/+2
With test-case gdb.python/py-completion.exp and target board native-extended-gdbserver I get this warning: ... (gdb) PASS: gdb.python/py-completion.exp: discard #2 completefilecommandcond $outputs/gdb.python/py-completion/py-completion-t^G\ PASS: gdb.python/py-completion.exp: completefilecommandcond completion Remote debugging from host ::1, port 53346^M monitor exit^M not implemented^M (gdb) WARNING: Timed out waiting for EOF in server after monitor exit ... Fix this by adding the missing "discard #3", such that we have instead: ... (gdb) PASS: gdb.python/py-completion.exp: discard #2 completefilecommandcond $outputs/gdb.python/py-completion/py-completion-t^G\ PASS: gdb.python/py-completion.exp: completefilecommandcond completion ^M not implemented^M (gdb) PASS: gdb.python/py-completion.exp: discard #3 Remote debugging from host ::1, port 36278^M monitor exit^M (gdb) ... Tested on x86_64-linux.
2023-03-10[gdb/testsuite] Fix gdb.python/py-cmd.expTom de Vries1-1/+1
[ Using $pp as shorthand for the pagination prompt "--Type <RET> for more, q to quit, c to continue without paging--". ] The test-case gdb.python/py-cmd.exp passes, but the handling of the test_multiline command output looks a bit odd: ... (gdb) test_multiline test_multiline output ... test_multiline output $ppPASS: gdb.python/py-cmd.exp: verify pagination from test_multiline q test_multiline Quit (gdb) test_multiline test_multiline output ... test_multiline output $ppPASS: gdb.python/py-cmd.exp: verify pagination from test_multiline: q ... What happens is: - a test_multiline command is issued - some output is printed, followed by a pagination prompt - the test-case concludes that pagination occurred, and produces a PASS - "q\n" is replied to the pagination prompt - without waiting for response to the "q\n", another test_multiline command is issued - in response to the "q\n" we get "Quit\n(gdb) " - some output is printed, followed by a pagination prompt - the test-case concludes that there's a valid response to the "q\n", and produces a PASS, consuming the second pagination prompt, but without a reply. My conclusion is that the second test_multiline command is unintentional, so fix this by removing it. Without it, we have the more straightforward: ... (gdb) test_multiline test_multiline output ... test_multiline output $ppPASS: gdb.python/py-cmd.exp: verify pagination from test_multiline q Quit (gdb) PASS: gdb.python/py-cmd.exp: verify pagination from test_multiline: q ... This also fixes the following warning with target board native-gdbserver: ... WARNING: Timed out waiting for EOF in server after monitor exit ... Tested on x86_64-linux.
2023-03-10[gdb/testsuite] Fix py-autoloaded-pretty-printers-in-newobjfile-event.exp ↵Tom de Vries1-0/+17
for remote target With test-case gdb.python/py-autoloaded-pretty-printers-in-newobjfile-event.exp and target board remote-gdbserver-on-localhost, I run into: ... FAIL: $exp: runto: run to main ... I can easily fix this using "gdb_load_shlib $binfile_lib", but then run into: ... (gdb) print all_good^M $1 = false^M (gdb) FAIL: $exp: print all_good info pretty-printer^M ... Sysroot is set to "target:", so gdb downloads the shared library from the target (Using $so as shorthand for libpy-autoloaded-pretty-printers-in-newobjfile-event.so): ... Reading /home/remote-target/$so from remote target...^M ... and internally refers to it as "target:/home/remote-target/$so". In load_auto_scripts_for_objfile, gdb gives up trying to auto-load scripts for $so once it checks for is_target_filename. Fix this by declaring auto-load unsupported if sysroot starts with "target:". Tested on x86_64-linux.
2023-03-10[gdb/testsuite] Fix gdb.python/py-event-load.exp for remote targetTom de Vries1-2/+3
Fix test-case gdb.python/py-event-load.exp for target board remote-gdbserver-on-localhost using gdb_download_shlib. Tested on x86_64-linux.
2023-03-10Use require with test_compiler_infoTom Tromey1-4/+1
One spot that checks test_compiler_info can be switched to use 'require'.
2023-03-10More uses of require with istargetTom Tromey9-26/+10
I found a few more spots that check istarget that can be switched to use 'require'.
2023-03-10Use require with gdb_skip_stdio_testTom Tromey1-3/+1
One use of gdb_skip_stdio_test can use 'require'.
2023-03-10Use require with target_infoTom Tromey75-341/+100
This changes many tests to use 'require' when checking target_info. In a few spots, the require is hoisted to the top of the file, to avoid doing any extra work when the test is going to be skipped anyway.
2023-03-09[gdb/testsuite] Fix gdb.threads/pending-fork-event-detach.exp for remote targetTom de Vries1-1/+14
Fix test-case gdb.threads/pending-fork-event-detach.exp for target board remote-gdbserver-on-localhost using gdb_remote_download for $touch_file_bin. Then, fix the test-case for target board remote-stdio-gdbserver with REMOTE_TMPDIR=~/tmp.remote-stdio-gdbserver by creating $touch_file_path on target using remote_download, and using the resulting path. Tested on x86_64-linux.