aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2023-04-28gdb: make set/show cwd work with $_gdb_setting_strAndrew Burgess2-10/+14
The previous commit fixed set/show args when used with $_gdb_setting_str, this commit fixes set/show cwd. Instead of using a scratch variable which is then pushed into the current inferior from a set callback, move to the API that allows for getters and setters, and store the value directly within the current inferior. Update the existing test to check the cwd setting.
2023-04-28gdb: make set/show args work with $_gdb_setting_strAndrew Burgess3-21/+142
I noticed that $_gdb_setting_str was not working with 'args', e.g.: $ gdb -q --args /tmp/hello.x arg1 arg2 arg3 Reading symbols from /tmp/hello.x... (gdb) show args Argument list to give program being debugged when it is started is "arg1 arg2 arg3". (gdb) print $_gdb_setting_str("args") $1 = "" This is because the 'args' setting is implemented using a scratch variable ('inferior_args_scratch') which is updated when the user does 'set args ...'. There is then a function 'set_args_command' which is responsible for copying the scratch area into the current inferior. However, when the user sets the arguments via the command line the scratch variable is not updated, instead the arguments are pushed straight into the current inferior. There is a second problem, when the current inferior changes the scratch area is not updated, which means that the value returned will only ever reflect the last call to 'set args ...' regardless of which inferior is currently selected. Luckily, the fix is pretty easy, set/show variables have an alternative API which requires we provide some getter and setter functions. With this done the scratch variable can be removed and the value returned will now always reflect the current inferior. While working on set/show args I also rewrote show_args_command to remove the use of deprecated_show_value_hack. Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-28gdb: cleanup command creation in infcmd.cAndrew Burgess1-38/+31
In infcmd.c, in order to add command completion to some of the 'set' commands, we are currently creating the command, then looking up the command by calling lookup_cmd. This is no longer necessary, we already return the relevant cmd_list_element object when the set/show command is created, and we can use that to set the command completion callback. I don't know if there's actually any tests for completion of these commands, but I manually checked, and each command still appears to offer the expected filename completion. There should be no user visible changes after this commit. Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-28gdb/record-full: disable range stepping when resuming threadsSimon Marchi1-0/+7
I see these failures, when running with the native-gdbserver of native-extended-gdbserver boards: Running /home/smarchi/src/binutils-gdb/gdb/testsuite/gdb.reverse/finish-reverse-next.exp ... FAIL: gdb.reverse/finish-reverse-next.exp: reverse next 1 LEP from function body FAIL: gdb.reverse/finish-reverse-next.exp: reverse next 2 at b = 5, from function body FAIL: gdb.reverse/finish-reverse-next.exp: reverse next 1 GEP call from function body FAIL: gdb.reverse/finish-reverse-next.exp: reverse next 2 at b = 50 from function body Let's use this simpler program to illustrate the problem: int main() { int a = 362; a = a * 17; return a; } It compiles down to: int a = 362; 401689: c7 45 fc 6a 01 00 00 movl $0x16a,-0x4(%rbp) a = a * 17; 401690: 8b 55 fc mov -0x4(%rbp),%edx 401693: 89 d0 mov %edx,%eax 401695: c1 e0 04 shl $0x4,%eax 401698: 01 d0 add %edx,%eax 40169a: 89 45 fc mov %eax,-0x4(%rbp) return a; 40169d: 8b 45 fc mov -0x4(%rbp),%eax When single stepping these lines, debugging locally, while recording, these are the recorded instructions (basically one for each instruction shown above): (gdb) maintenance print record-instruction 0 4 bytes of memory at address 0x00007fffffffdc5c changed from: 6a 01 00 00 Register rip changed: (void (*)()) 0x40169a <main+21> (gdb) maintenance print record-instruction -1 Register rax changed: 5792 Register eflags changed: [ PF AF IF ] Register rip changed: (void (*)()) 0x401698 <main+19> (gdb) maintenance print record-instruction -2 Register rax changed: 362 Register eflags changed: [ PF ZF IF ] Register rip changed: (void (*)()) 0x401695 <main+16> (gdb) maintenance print record-instruction -3 Register rax changed: 4200069 Register rip changed: (void (*)()) 0x401693 <main+14> (gdb) maintenance print record-instruction -4 Register rdx changed: 140737488346696 Register rip changed: (void (*)()) 0x401690 <main+11> (gdb) maintenance print record-instruction -5 4 bytes of memory at address 0x00007fffffffdc5c changed from: 00 00 00 00 Register rip changed: (void (*)()) 0x401689 <main+4> (gdb) maintenance print record-instruction -6 Not enough recorded history But when debugging remotely: (gdb) maintenance print record-instruction 0 Register rdx changed: 140737488346728 Register rip changed: (void (*)()) 0x401690 <main+11> (gdb) maintenance print record-instruction -1 4 bytes of memory at address 0x00007fffffffdc7c changed from: 00 00 00 00 Register rip changed: (void (*)()) 0x401689 <main+4> (gdb) maintenance print record-instruction -2 Not enough recorded history In this list, we only have entries for the beginning of each line. This is because of the remote target's support for range stepping. The record-full layer can only record instructions when the underlying process target reports a stop. With range stepping, the remote target single-steps multiple instructions at a time, so the record-full target doesn't get to see and record them all. Fix this by making the record-full layer disable range-stepping before handing the resume request to the beneath layer, forcing the remote target to report stops for each instruction. Change-Id: Ia95ea62720bbcd0b6536a904360ffbf839eb823d
2023-04-28Allow strings with printf/evalKeith Seitz3-2/+43
PR 13098 explains that if a user attempts to use a string with either `printf' (or `eval'), gdb returns an error (inferior not running): (gdb) printf "%s\n", "hello" evaluation of this expression requires the target program to be active However, the parser can certainly handle this case: (gdb) p "hello" $1 = "hello" This discrepancy occurs because printf_c_string does not handle this specific case. The passed-in value that we are attempting to print as a string is TYPE_CODE_ARRAY but it's lval type is not_lval. printf_c_string will only attempt to print a string from the value's contents when !TYPE_CODE_PTR, lval is lval_internalvar, and the value's type is considered a string type: if (value->type ()->code () != TYPE_CODE_PTR && value->lval () == lval_internalvar && c_is_string_type_p (value->type ())) { ... } Otherwise, it attempts to read the value of the string from the target's memory (which is what actually generates the "evaluation of this ..." error message).
2023-04-28Move find_minimal_symbol_address to minsyms.cTom Tromey2-80/+78
I found find_minimal_symbol_address in parse.c, but it seems to me that it belongs in minsyms.c. Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-04-28Do not change type in get_discrete_low_boundTom Tromey1-4/+0
get_discrete_low_bound has this code: /* Set unsigned indicator if warranted. */ if (low >= 0) type->set_is_unsigned (true); It's bad to modify a type in a getter like this, so this patch removes this code. FWIW I looked and this code has been there since at least 1999 (it was in the initial sourceware import). Types in general would benefit from const-ification, which would probably reveal more code like this, but I haven't attempted that. Regression tested on x86-64 Fedora 36. Reviewed-by: Kevin Buettner <kevinb@redhat.com>
2023-04-28Remove @var from @defun in Python documentationTom Tromey1-25/+25
Eli pointed out that @var isn't needed in @defun in Texinfo. This patch removes the cases I found in python.texi. I also renamed some variables in one spot, because "-" isn't valid in a Python variable name.
2023-04-28gdb/testsuite: additional test fixes after gdb_test changesAndrew Burgess8-123/+102
After this commit: commit e2f620135d92f7cd670af4e524fffec7ac307666 Date: Thu Mar 30 13:26:25 2023 +0100 gdb/testsuite: change newline patterns used in gdb_test There were some regressions in gdb.trace/*.exp tests when run with the native-gdbserver board. This commit fixes these regressions. All the problems are caused by unnecessary trailing newline characters included in the patterns passed to gdb_test. After the above commit the testsuite is stricter when matching trailing newlines, and so the additional trailing newline characters are now causing the test to fail. Fix by removing all the excess trailing newline characters. In some cases this cleanup means we should use gdb_test_no_output, I've done that where appropriate. In a couple of other places I've made use of multi_line to better build the expected output pattern.
2023-04-28Fix a typo in gdb.texinfo.Eli Zaretskii1-1/+1
2023-04-27Avoid some compiler warnings in gdb.adaTom Tromey2-4/+4
Running gdb.ada/verylong.exp shows a warning from the Ada compiler: prog.adb:16:11: warning: file name does not match unit name, should be "main.adb" [enabled by default] This patch fixes the problem, and another similar one in unchecked_union.exp.
2023-04-27gdb/doc: extend the documentation of the jump commandAndrew Burgess1-0/+8
This commit addresses PR gdb/7946. While checking for bugs relating to the jump command I noticed a long standing bug that points out a deficiency with GDB's documentation of the jump command. The bug points out that 'jump 0x...' is not always the same as 'set $pc = 0x...' and then 'continue'. Writing directly to the $pc register does not update any auxiliary state, e.g. $npc on SPARC, while using 'jump' does. It felt like this would be an easy issue to address by adding a paragraph to the docs, so I took a stab at writing something suitable. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=7946 Approved-By: Eli Zaretskii <eliz@gnu.org>
2023-04-27gdb/testsuite: special case '^' in gdb_test patternAndrew Burgess17-58/+109
In this commit I propose that we add special handling for the '^' when used at the start of a gdb_test pattern. Consider this usage: gdb_test "some_command" "^command output pattern" I think the intention here is pretty clear - run 'some_command', and the output from the command should be exactly 'command output pattern'. After the previous commit which tightened up how gdb_test matches the final newline and prompt we know that the only thing after the output pattern will be a single newline and prompt, and the leading '^' ensures that there's no output before 'command output pattern', so this will do what I want, right? ... except it doesn't. The command itself will also needs to be matched, so I should really write: gdb_test "some_command" "^some_command\r\ncommand output pattern" which will do what I want, right? Well, that's fine until I change the command and include some regexp character, then I have to write: gdb_test "some_command" \ "^[string_to_regexp some_command]\r\ncommand output pattern" but this all gets a bit verbose, so in most cases I simply don't bother anchoring the output with a '^', and a quick scan of the testsuite would indicate that most other folk don't both either. What I propose is this: the *only* thing that can appear immediately after the '^' is the command converted into a regexp, so lets do that automatically, moving the work into gdb_test. Thus, when I write: gdb_test "some_command" "^command output pattern" Inside gdb_test we will spot the leading '^' in the pattern, and inject the regexp version of the command after the '^', followed by a '\r\n'. My hope is that given this new ability, folk will be more inclined to anchor their output patterns when this makes sense to do so. This should increase our ability to catch any unexpected output from GDB that appears as a result of running a particular command. There is one problem case we need to consider, sometime people do this: gdb_test "" "^expected output pattern" In this case no command is sent to GDB, but we are still expecting some output from GDB. This might be a result of some asynchronous event for example. As there is no command sent to GDB (from the gdb_test) there will be no command text to parse. In this case my proposed new feature injects the command regexp, which is the empty string (as the command itself is empty), but still injects the '\r\n' after the command regexp, thus we end up with this pattern: ^\r\nexpected output pattern This extra '\r\n' is not what we should expected here, and so there is a special case inside gdb_test -- if the command is empty then don't add anything after the '^' character. There are a bunch of tests that do already use '^' followed by the command, and these can all be simplified in this commit. I've tried to run all the tests that I can to check this commit, but I am certain that there will be some tests that I manage to miss. Apologies for any regressions this commit causes, hopefully fixing the regressions will not be too hard. Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-27gdb/testsuite: change newline patterns used in gdb_testAndrew Burgess39-241/+264
This commit makes two changes to how we match newline characters in the gdb_test proc. First, for the newline pattern between the command output and the prompt, I propose changing from '[\r\n]+' to an explicit '\r\n'. The old pattern would spot multiple newlines, and so there are a few places where, as part of this commit, I've needed to add an extra trailing '\r\n' to the pattern in the main test file, where GDB's output actually includes a blank line. But I think this is a good thing. If a command produces a blank line then we should be checking for it, the current gdb_test doesn't do that. But also, with the current gdb_test, if a blank line suddenly appears in the output, this is going to be silently ignored, and I think this is wrong, the test should fail in that case. Additionally, the existing pattern will happily match a partial newline. There are a strangely large number of tests that end with a random '.' character. Not matching a literal period, but matching any single character, this is then matching half of the trailing newline sequence, while the \[\r\n\]+ in gdb_test is matching the other half of the sequence. I can think of no reason why this would be intentional, I suspect that the expected output at one time included a period, which has since been remove, but I haven't bothered to check on this. In this commit I've removed all these unneeded trailing '.' characters. The basic rule of gdb_test after this is that the expected pattern needs to match everything up to, but not including the newline sequence immediately before the GDB prompt. This is generally how the proc is used anyway, so in almost all cases, this commit represents no significant change. Second, while I was cleaning up newline matching in gdb_test, I've also removed the '[\r\n]*' that was added to the start of the pattern passed to gdb_test_multiple. The addition of this pattern adds no value. If the user pattern matches at the start of a line then this would match against the newline sequence. But, due to the '*', if the user pattern doesn't match at the start of a line then this group doesn't care, it'll happily match nothing. As such, there's no value to it, it just adds more complexity for no gain, so I'm removing it. No tests will need updating as a consequence of this part of the patch. Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-27gdb/testsuite: use 'return' in gdb_test_no_outputAndrew Burgess2-9/+17
A TCL proc will return the return value of the last command executed within the proc's body if there is no explicit return call, so gdb_test_no_output is already returning the return value of gdb_test_multiple. However, I'm not a fan of (relying on) this implicit return value behaviour -- I prefer to be explicit about what we are doing. So in this commit I have extended the comment on gdb_test_no_output to document the possible return values (just as gdb_test does), and explicitly call return. This should make no different to our testing, but I think it's clearer now what the gdb_test_no_output proc is expected to do. The two tests gdb.base/auxv.exp and gdb.base/list.exp both rely on the return value of gdb_test_no_output, and continue to pass after this change. I also spotted that gdb.base/watchpoint.exp could be updated to make use of gdb_test_no_output, so I did that. Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-27gdb: remove some trailing newlines from warning messagesAndrew Burgess2-6/+6
While working on a later patch in this series, which tightens up some of our pattern matching when using gdb_test, I ran into some failures caused by some warnings having a trailing newline character. The warning function already adds a trailing newline, and it is my understanding that we should not be adding a second by including a newline at the end of any warning message. The problem cases I found were in language.c and remote.c, in this patch I fix the cases I hit, but I also checked all the other warning calls in these two files and removed any additional trailing newlines I found. In remote.c the warning actually had a newline character in the middle of the warning message (in addition to the trailing newline), which I've removed. I don't think it's helpful to forcibly split a warning as was done here -- in the middle of a sentence. Additionally, the message isn't even that long (71 characters), so I think removing this newline is an improvement. None of the expected test result need updating with this commit, currently the patterns in gdb_test will match one or more newline sequences, so the tests are as happy with one newline (after this commit) as they are with two newlines (before this commit). A later commit will change gdb_test so that it is not so forgiving, and these warnings would have caused some failures. Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-27gdb/testsuite: fix occasional failure in gdb.base/clear_non_user_bp.expAndrew Burgess1-1/+1
I noticed that the gdb.base/clear_non_user_bp.exp test would sometimes fail when run from a particular directory. The test tries to find the number of the first internal breakpoint using this proc: proc get_first_maint_bp_num { } { gdb_test_multiple "maint info break" "find first internal bp num" { -re -wrap "(-\[0-9\]).*" { return $expect_out(1,string) } } return "" } The problem is, at the time we issue 'maint info break' there are both internal breakpoint and non-internal (user created) breakpoints in place. The user created breakpoints include the path to the source file. Sometimes, I'll be working from a directory that includes a number, like '/tmp/blah-1/gdb/etc', in which case the pattern above actually matches the '-1' from 'blah-1'. In this case there's no significant problem as it turns out that -1 is the number of the first internal breakpoint. Sometimes my directory name might be '/tmp/blah-4/gdb/etc', in which case the above pattern patches '-4' from 'blah-4'. It turns out this is also not a problem -- the test doesn't actually need the first internal breakpoint number, it just needs the number of any internal breakpoint. But sometimes my directory name might be '/tmp/blah-0/gdb/etc', in which case the pattern above matches '-0' from 'blah-0', and in this case the test fails - there is no internal breakpoint '-0'. Fix this by spotting that the internal breakpoint numbers always occurs after a '\r\n', and that they never start with a 0. Our pattern becomes: -re -wrap "\r\n(-\[1-9\]\[0-9\]*).*" { return $expect_out(1,string) } After this I'm no longer seeing any failures. Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-27gdb, doc: add index entry for the $_inferior_thread_count convenience varTankut Baris Aktemur1-0/+1
Add a marker in the documentation for indexing the $_inferior_thread_count variable. Approved-By: Eli Zaretskii <eliz@gnu.org>
2023-04-26[gdb/tui] Fix length of status line stringTom de Vries1-4/+7
In commit 5d10a2041eb ("gdb: add string_file::release method") this was added: ... + std::string string_val = string.release (); ... without updating subsequent uses of string.size (), which returns 0 after the string.release () call. Fix this by: - using string_val.size () instead of string.size (), and - adding an assert that would have caught this regression. Tested on x86_64-linux. Reviewed-By: Simon Marchi <simon.marchi@efficios.com> PR tui/30389 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30389
2023-04-26Rewrite gdb_mpz::operator==Tom Tromey1-25/+19
Simon pointed out that the recent changes to gdb_mpz caused a build failure on amd64 macOS. It turns out to be somewhat difficult to overload a method in a way that will work "naturally" for all integer types; especially in a case like gdb_mpz::operator==, where it's desirable to special case all integer types that are no wider than 'long'. After a false start, I came up with this patch, which seems to work. It applies the desirable GMP special cases directly in the body, rather than via overloads. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2023-04-26Updated debug architecture version checks for fbsdLuis Machado1-0/+2
There are two new debug architecture version entries. I updated the code for Linux, but fbsd also needs updating. This patch does this, and should be pretty straightforward. I can't test this on native fbsd, but I'm fairly confident it should work. Signed-off-by: Luis Machado <luis.machado@arm.com>
2023-04-26Add new debug architecture versionLuis Machado2-0/+4
Teach gdb about a new debug architecture version for AArch64 (0x11). No user-visible changes. Regression-tested on aarch64-linux Ubuntu 20.04/22.04. Signed-off-by: Luis Machado <luis.machado@arm.com>
2023-04-25Use scoped_restore in varobj.cTom Tromey1-3/+2
One spot in varobj.c should use scoped_restore to save and restore input_radix. Note that the current code may fail to restore it on error, so this patch fixes a latent bug. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2023-04-25Remove some "goto"s from parse.cTom Tromey1-14/+12
parser_state::push_dollar has some unnecessary "goto"s. Replacing them cleans up the code. Regression tested on x86-64 Fedora 36. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2023-04-25[gdb/testsuite] Fix timeout in gdb.tui/empty.expTom de Vries1-2/+2
In test-case gdb.tui/empty.exp we run into: ... WARNING: timeout in accept_gdb_output PASS: gdb.tui/empty.exp: src: 90x40: box 1 ... We timeout here in Term::resize: ... # Due to the strange column resizing behavior, and because we # don't care about this intermediate resize, we don't check # the size here. wait_for "@@ resize done $_resize_count" ... because the string we're trying to match is split over two lines: ... 25 -----------------------------------------------------------------------------+No 26 ne No process In: L?? PC: ?? @@ 27 resize done 0, size = 79x40 28 (gdb) ... Fix this by dropping the "@@ " prefix. Tested on x86_64-linux.
2023-04-25[gdb/testsuite] Fix timeout in gdb.tui/completion.expTom de Vries1-1/+1
With test-case gdb.tui/completion.exp, we run into: ... WARNING: timeout in accept_gdb_output PASS: gdb.tui/completion.exp: check focus completions ... The timeout happens in this command: ... Term::command "layout src" ... which waits for: - "(gdb) layout src", and then - "(gdb) ". Because the "layout src" command enables the TUI there's just a prompt. Fix this by using Term::command_no_prompt_prefix. Tested on x86_64-linux.
2023-04-25[gdb/testsuite] Fix timeout in gdb.tui/new-layout.expTom de Vries1-1/+1
In test-case gdb.tui/new-layout.exp we run into: ... WARNING: timeout in accept_gdb_output PASS: gdb.tui/new-layout.exp: layout=cmd_only {cmd 1} {} {}: \ bottom of cmd window is blank ... The timeout happens here: ... Term::command "layout src" ... Before the "layout src" command we have: ... Screen Dump (size 80 columns x 24 rows, cursor at column 46, row 7): 0 +-tui-layout.c-------------------------+(gdb) layout example3 1 | 20 { |(gdb) layout src 2 | 21 return 0; |(gdb) winheight cmd 8 3 | 22 } |(gdb) layout example4 4 | 23 |(gdb) layout src 5 | 24 |(gdb) winheight cmd 8 6 | 25 |(gdb) layout example5 7 | 26 |(gdb) 8 | 27 | 9 | 28 | 10 | 29 | 11 | 30 | 12 | 31 | 13 | 32 | 14 | 33 | 15 | 34 | 16 | 35 | 17 | 36 | 18 | 37 | 19 | 38 | 20 | 39 | 21 | 40 | 22 +--------------------------------------+ 23 exec No process In: L?? PC: ?? ... and after: ... Screen Dump (size 80 columns x 24 rows, cursor at column 6, row 16): 0 +-tui-layout.c-----------------------------------------------------------------+ 1 | 20 { | 2 | 21 return 0; | 3 | 22 } | 4 | 23 | 5 | 24 | 6 | 25 | 7 | 26 | 8 | 27 | 9 | 28 | 10 | 29 | 11 | 30 | 12 | 31 | 13 | 32 | 14 +------------------------------------------------------------------------------+ 15 exec No process In: L?? PC: ?? 16 (gdb) 17 18 19 20 21 22 23 ... The Term::command "layout src" is waiting to match: - "(gdb) layout src", and then - "(gdb) ". The first part fails to match on a line: ... | 26 |(gdb) layout src ... because it expects the prompt at the start of the line. Fix this by allowing the prompt at the start of a window as well. Tested by x86_64-linux.
2023-04-25[gdb/testsuite] Fix timeout in gdb.tui/main.expTom de Vries1-1/+2
With test-case gdb.tui/main.exp we run into: ... WARNING: timeout in accept_gdb_output PASS: gdb.tui/main.exp: show main after file ... The problem is that this command: ... Term::command "file [standard_output_file $testfile]" ... tries to match "(gdb) $cmd", but due to the long file name, $cmd is split up over two lines: ... 16 (gdb) file /data/vries/gdb/leap-15-4/build/gdb/testsuite/outputs/gdb.tui/main/ma 17 in 18 Reading symbols from /data/vries/gdb/leap-15-4/build/gdb/testsuite/outputs/gdb.t 19 ui/main/main... 20 (gdb) ... Fix this by matching "Reading symbols from" instead. Tested on x86_64-linux.
2023-04-25[gdb/testsuite] Fix timeout in gdb.tui/corefile-run.expTom de Vries1-1/+2
With test-case gdb.tui/corefile-run.exp we run into: ... WARNING: timeout in accept_gdb_output PASS: gdb.tui/corefile-run.exp: load corefile ... The timeout happens in this command: ... Term::command "core-file $core" ... because it tries to match "(gdb) $cmd" but $cmd is split over two lines: ... 16 (gdb) core-file /data/vries/gdb/leap-15-4/build/gdb/testsuite/outputs/gdb.tui/co 17 refile-run/corefile-run.core 18 [New LWP 5370] 19 Core was generated by `/data/vries/gdb/leap-15-4/build/gdb/testsuite/outputs/gdb 20 .tui/corefile-run/coref'. 21 Program terminated with signal SIGTRAP, Trace/breakpoint trap. 22 #0 main () at tui-layout.c:21 23 (gdb) ... Fix this by using send_gdb "$cmd\n" and wait_for "Program terminated" instead. Tested on x86_64-linux.
2023-04-25[gdb/testsuite] Add debug prints in Term::wait_forTom de Vries1-0/+21
The semantics of wait_for are non-trivial, and a bit hard to understand sometimes. Add some debug prints in wait_for that make it clear: - what regexps we're trying to match, - what strings we compare to the regexps, and - whether there's a match or mismatch. I've added this ad-hoc a couple of times, and it seems that it's worth having readily available. The debug prints are enabled by adding DEBUG_TUI_MATCHING=1 to the RUNTESTFLAGS: ... $ make check RUNTESTFLAGS="gdb.tui/empty.exp DEBUG_TUI_MATCHING=1" ... Tested on x86_64-linux.
2023-04-25[gdb/testsuite] Add warning for timeout in accept_gdb_outputTom de Vries1-0/+2
In accept_gdb_output we have: ... timeout { # Assume a timeout means we somehow missed the # expected result, and carry on. return 0 } ... The timeout is silent, and though in some places the return value is checked, this is not done consistently, and consequently there are silent timeouts when running the TUI testsuite (gdb.tui/*.exp and gdb.python/tui*.exp). Each timeout is 10 seconds, and there are 5 in total in the TUI tests, taking 50 seconds overall: ... real 1m0.275s user 0m10.440s sys 0m1.343s ... With an entire testsuite run taking about 30 minutes, that is about 2.5% of the time spent waiting in TUI tests. Let's make the timeouts visible using a warning, such that they can be fixed. Tested on x86_64-linux.
2023-04-24[gdb/testsuite] Fix auto-indent in gdb.gdb/python-helper.expTom de Vries1-10/+10
When editing gdb.gdb/python-helper.exp, auto-indent is broken in my editor (emacs). The problem is that this: ... if { 1 } { foo "{" "}"<ENTER>bar } ... produces this: ... if { 1 } { foo "{" "}" bar } ... Note that this doesn't happen for "{}". Fix this by using "\{" and "\}". Tested on x86_64-linux.
2023-04-24[gdb/testsuite] Fix gdb.gdb/python-helper.exp with -O2 -fltoTom de Vries1-19/+58
On openSUSE Leap 15.4, with gcc 7.5.0, when building gdb with -O2 -g -flto=auto, I run into: ... FAIL: gdb.gdb/python-helper.exp: hit breakpoint in outer gdb FAIL: gdb.gdb/python-helper.exp: print integer from DWARF info FAIL: gdb.gdb/python-helper.exp: print *type->main_type ... Fix the first two FAILs by using $bkptno_numopt_re. The last FAIL is due to: ... (outer-gdb) print *type->main_type^M A syntax error in expression, near `->main_type'.^M (outer-gdb) FAIL: gdb.gdb/python-helper.exp: print *type->main_type ... because: ... (outer-gdb) print type^M Attempt to use a type name as an expression^M ... Fix this by making the test unresolved if "print type" or "print type->main_type" doesn't succeed. On openSUSE Tumbleweed, with gcc 13.0.1, when building gdb with -O2 -g -flto=auto, I run into timeouts due to the breakpoint in c_print_type not hitting. Fix this by detecting the situation and bailing out. Tested on x86_64-linux.
2023-04-24[gdb/testsuite] Fix -wrap in presence of -prompt in gdb_test_multipleTom de Vries2-1/+12
While writing a gdb_test_multiple call in a test-case I tried to use -wrap in combination with -prompt and found out that it doesn't work, because -wrap uses "$gdb_prompt $" instead of $prompt_regexp. Fix this by making -wrap use $prompt_regexp. Tested on x86_64-linux.
2023-04-24gdb: remove end_stepping_range observableSimon Marchi6-57/+0
I noticed that this observable was never notified, which means we can probably safely remove it. The notification was removed in: commit 243a925328f8e3184b2356bee497181049c0174f Author: Pedro Alves <palves@redhat.com> Date: Wed Sep 9 18:23:24 2015 +0100 Replace "struct continuation" mechanism by something more extensible print_end_stepping_range_reason in turn becomes unused, so remote it as well. Change-Id: If5da5149276c282d2540097c8c4327ce0f70431a
2023-04-24[gdb/testsuite] Use -std=gnu99 for gdb.server/attach-flag.expTom de Vries1-1/+1
When using a compiler defaulting to -std=gnu90, we run into: ... Running gdb.server/attach-flag.exp ... gdb compile failed, attach-flag.c: In function 'main': attach-flag.c:22:3: error: 'for' loop initial declarations are only allowed \ in C99 or C11 mode for (int i = 0; i < NTHREADS; i++) ^~~ attach-flag.c:22:3: note: use option -std=c99, -std=gnu99, -std=c11 or \ -std=gnu11 to compile your code ... Fix this by using -std=gnu99. Tested on x86_64-linux.
2023-04-24[gdb/testsuite] Require GCC >= 5.x.x in gdb.base/utf8-identifiers.expTom de Vries1-0/+5
Test-case gdb.base/utf8-identifiers.exp compiles starting with GCC 5, so require this. Tested on x86_64-linux.
2023-04-24[gdb/testsuite] Fix gdb.multi/multi-arch.exp on powerpc64leTom de Vries2-0/+16
When running test-case gdb.multi/multi-arch.exp on powerpc64le-linux, I run into: ... Running gdb/testsuite/gdb.multi/multi-arch.exp ... gdb compile failed, In file included from /usr/include/features.h:399:0, from /usr/include/stdio.h:27, from gdb/testsuite/gdb.multi/hangout.c:18: /usr/include/gnu/stubs.h:8:27: fatal error: gnu/stubs-32.h: \ No such file or directory # include <gnu/stubs-32.h> ^ compilation terminated. ... The problem is that the test-case attempts to use gcc -m32 to produce an executable while that's not available. Fix this by: - introduce a new caching proc have_compile_and_link_flag, and - using have_compile_and_link_flag in test-case gdb.multi/multi-arch.exp. Tested on: - x86_64-linux (openSUSE Leap 15.4), and - powerpc64le-linux (CentOS-7).
2023-04-24[gdb/testsuite] Add basic lmap for tcl < 8.6Tom de Vries2-0/+35
With test-case gdb.dwarf2/dw2-abs-hi-pc.exp and tcl 8.5, I run into: ... ERROR: tcl error sourcing gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp. ERROR: invalid command name "lmap" while executing "::gdb_tcl_unknown lmap i {dw2-abs-hi-pc.c dw2-abs-hi-pc-hello.c \ dw2-abs-hi-pc-world.c} { expr { "$srcdir/$subdir/$i" } }" ... Fix this by adding basic lmap support for tcl version < 8.6. Tested on x86_64-linux.
2023-04-24[gdb/testsuite] Don't use string cat in gdb.dwarf2/dw2-abs-hi-pc.expTom de Vries1-1/+2
Test-case gdb.dwarf2/dw2-abs-hi-pc.exp uses string cat: ... set sources [lmap i $sources { string cat "${srcdir}/${subdir}/" $i }] ... but that's only supported starting tcl 8.6. Fix this by using "expr" instead: ... set sources [lmap i $sources { expr { "$srcdir/$subdir/$i" } }] ... Tested on x86_64-linux.
2023-04-24[gdb/testsuite] Skip dap tests for tcl 8.5Tom de Vries2-0/+7
When running the dap tests on a system with tcl 8.5, we run into: ... ERROR: tcl error sourcing gdb/testsuite/gdb.dap/memory.exp. ERROR: bad class "entier": must be alnum, alpha, ascii, control, boolean, \ digit, double, false, graph, integer, list, lower, print, punct, space, \ true, upper, wideinteger, wordchar, or xdigit while executing "string is entier $num" (procedure "num" line 16) invoked from within ... Fix this by: - requiring tcl 8.6 in allow_dap_tests, and - adding the missing require allow_dap_tests in gdb.dap/memory.exp. Tested on x86_64-linux.
2023-04-22[gdb/testsuite] Remove debug prints in gdb_find_gdcTom de Vries1-2/+1
When running the gdb.dlang test-cases, and forcing gdb_find_gdc to be used rather than dejagnu's copy (mimicing what happens with an older dejagnu without find_gdc), I run into these debug prints: ... Tool Root: /data/vries/gdb/leap-15-4/build CC: gdc ... Remove these. Tested on x86_64-linux.
2023-04-22gdb: Fix false match issue in skip_prologue_using_linetableWANG Rui3-1/+149
[ Changes in v2: - rebase on trunk Changes in v3: - add test-case ] We should exclude matches to the ending PC to prevent false matches with the next function, as prologue_end is located at the end PC. <fun1>: 0x00: ... <-- start_pc 0x04: ... 0x08: ... <-- breakpoint 0x0c: ret <fun2>: 0x10: ret <-- end_pc | prologue_end of fun2 Tested on x86_64-linux. Co-Authored-By: WANG Rui <r@hev.cc> (fix, tiny change [1]) Co-Authored-By: Tom de Vries <tdevries@suse.de> (test-case) Approved-by: Kevin Buettner <kevinb@redhat.com> [1] https://www.gnu.org/prep/maintain/html_node/Legally-Significant.html PR symtab/30369 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30369
2023-04-21gdb: remove language_autoSimon Marchi7-104/+49
I think that the language_auto enumerator and the auto_language class can be removed. There isn't really an "auto" language, it's only a construct of the "set language" command to say "pick the appropriate language automatically". But "auto" is never the current language. The `current_language` points to the current effective language, and the fact that we're in "auto language" mode is noted by the language_mode global. - Change set_language to handle the "auto" (and "local", which is a synonym) early, instead of in the for loop. I think it makes the two cases (auto vs explicit language) more clearly separated anyway. - Adjust add_set_language_command to hard-code the "auto" string, instead of using the "auto" language definition. - Remove auto_language, rename auto_or_unknown_language to unknown_language and move the bits of the existing unknown_language in there. - Remove the set_language at the end of _initialize_language. I think it's not needed, because we call set_language in gdb_init, after all _initialize functions are called. There is some chance that an _initialize function that runs after _initialize_language implicitly depends on current_language being set, but my testsuite runs haven't found anything like that. - Use language_unknown instead of language_auto when creating a minimal symbol (minimal_symbol_reader::record_full). I think that this value is used to indicate that we don't know the symbol of the minimal symbol (yet), so language_unknown makes sense to me. Update a condition accordingly in ada-lang.c. symbol_find_demangled_name also appears to "normalize" this value from "unknown" to "auto", remove that part and update the condition to just check for language_unknown. Change-Id: I47bcd6c15f607d9818f2e6e413053c2dc8ec5034 Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-21gdb: switch "set language" to getter/setterSimon Marchi1-9/+19
The `language` global variable is mostly a scratch variable used for the setting. The source of truth is really current_language and language_mode (auto vs manual), which are set by the set_language_command callback. Switch the setting to use the add_setshow_enum_cmd overload that takes a value getter and setter. Change-Id: Ief5b2f93fd7337eed7ec96023639ae3dfe62250b Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-21gdb: remove return value of set_languageSimon Marchi2-14/+5
set_language returns the previous language, but nothing uses it. Remove the return value. This lets us remove the assignment to current_language, in _initialize_language. Change-Id: Ifccf9b488434c1addf4626130a74e159a37d8c17 Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-21[gdb/testsuite] Add make-check-all.shTom de Vries1-0/+329
Directory gdb/testsuite/boards contains a number of host/target boards, which run a test-case (or test-cases) in a different way. The benefits of using these boards are: - improving test coverage of gdb, - making the testsuite more robust, and - making sure the test-cases work for non-native and remote setups, if possible. Each board is slightly different, and developers need to learn how to use each one, what parameters to pass and how, and which ones can be used in combination with each other. This is a threshold to start using them. And then there quite a few, so I suppose typically only a few will be used by each developer. Add script gdb/testsuite/make-check-all.sh, that's intended to function as a drop-in replacement of make check, while excercising all host/target boards in gdb/testsuite/boards. An example of make-check-all.sh for one test-case is: ... $ ~/gdb/src/gdb/testsuite/make-check-all.sh gdb.base/advance.exp LOCAL: # of expected passes 8 TARGET BOARD: cc-with-gdb-index # of expected passes 8 ... HOST BOARD: local-remote-host-notty, TARGET BOARD: remote-stdio-gdbserver # of expected passes 8 HOST/TARGET BOARD: local-remote-host-native # of expected passes 8 ... Shell-checked and tested on x86_64-linux. Co-Authored-By: Simon Marchi <simon.marchi@efficios.com> Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-04-21[gdb/cli] Add maint info screenTom de Vries2-2/+75
While working on PRs tui/30337 and cli/30346 I came across various notions of width in gdb, as reported by gdb, readline, curses and the environment variables. As for gdb, readline and the environment variables, the way things work is: - Gdb asks readline to detect screen size, - readline sets the actual screen size in the environment variables COLUMNS and LINES, - readline reports back a screen size to gdb, which may have one column less than the actual screen size, to deal with lack of auto-wrap. This becomes gdb's notion of screen size (in other words the point where we can expect the gdb command line to wrap), - Gdb then explicitly sets readline's screen size, which readline itself may adjust to deal with lack of auto-wrap. This becomes readlines notion of screen size (well, internally the unadjusted one, but it'll report back the adjusted one). Add a command "maint info screen" that prints these notions, both for width and height. For TERM=xterm we have: ... $ TERM=xterm gdb -ex "maint info screen" Number of characters gdb thinks are in a line is 118. Number of characters readline reports are in a line is 118. Number of characters curses thinks are in a line is 118. Number of characters environment thinks are in a line is 118 (COLUMNS). Number of lines gdb thinks are in a page is 27. Number of lines readline reports are in a page is 27. Number of lines curses thinks are in a page is 27. Number of lines environment thinks are in a page is 27 (LINES). ... And for TERM=ansi: ... $ TERM=ansi gdb -ex "maint info screen" Number of characters gdb thinks are in a line is 117. Number of characters readline reports are in a line is 116. Number of characters curses thinks are in a line is 118. Number of characters environment thinks are in a line is 118 (COLUMNS). Number of lines gdb thinks are in a page is 27. Number of lines readline reports are in a page is 27. Number of lines curses thinks are in a page is 27. Number of lines environment thinks are in a page is 27 (LINES). ... [ The fact that we have "characters readline reports are in a line is 116" is is due to gdb making readline adjust twice for the lack of auto-wrap, this is PR cli/30346. Likewise we can detect tui/30337 by doing a resize in TUI mode and doing "maint info screen": ... Number of characters characters curses thinks are in a line is 110. Number of characters environment thinks are in a line is 111 (COLUMNS). ] And for TERM=ansi, with width and heigth set to 0: ... Number of characters gdb thinks are in a line is 4294967295 (unlimited). Number of characters readline reports are in a line is 32766 (unlimited - 1). Number of characters curses thinks are in a line is 118. Number of characters environment thinks are in a line is 118 (COLUMNS). Number of lines gdb thinks are in a page is 4294967295 (unlimited). Number of lines readline reports are in a page is 32767 (unlimited). Number of lines curses thinks are in a page is 27. Number of lines environment thinks are in a page is 27 (LINES). ... [ Note that when doing a resize by say maximizing or de-maximizing a terminal, all reported values are updated, except for curses when not in TUI mode. Maybe that means there's a bug. If not, then maybe we should not print the curses lines unless in TUI mode, or annotate those lines such that it's clear that the values may be not up-to-date. ] I'd like to use this command in the regression test for PR cli/30346. Tested on x86_64-linux. Reviewed-By: Eli Zaretskii <eliz@gnu.org> Reviewed-By: Tom Tromey <tom@tromey.com>
2023-04-21Use entry values for 32-bit PPC struct returnTom Tromey3-5/+5
AdaCore has a local patch for PPC "finish", but last year, Ulrich Weigand pointed out that this patch was incorrect. It may work for simple functions like the one in the internal test, but nothing guarantees that r3 will be preserved by the callee, so checking r3 on exit is not always correct. This patch fixes the problem using the same approach as PPC64: use the entry value of r3, if available. Ulrich confirmed this matches the PPC32 ABI.
2023-04-21Handle erroneous DW_AT_call_return_pcTom Tromey6-0/+90
On PPC64, with the test case included in an earlier patch, we found that "finish" would still not correctly find the return value via entry values. The issue is simple. The compiler emits: 0x00000000100032b8 <+28>: bl 0x1000320c <pck__create_large> 0x00000000100032bc <+32>: nop 0x00000000100032c0 <+36>: li r9,42 ... but the DWARF says: <162a> DW_AT_call_return_pc: 0x100032c0 That is, the declared return PC is one instruction past the actual return PC. This patch adds a new arch hook to handle this scenario, and implements it for PPC64. Some care is taken so that GDB will continue to work if this compiler bug is fixed. A GCC patch is here: https://gcc.gnu.org/pipermail/gcc-patches/2023-March/613336.html No check for 'nop' is done, as subsequent discussion revealed that the linker might replace this with another instruction.