aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2025-08-20gdb/MAINTAINERS - ADD Gopi Kumar Bulusu gopi@sankhya.comGopi Kumar Bulusu1-0/+1
Signed-off-by: Gopi Kumar Bulusu <gopi@sankhya.com>
2025-08-19Remove autoconf macro AC_HEADER_STDCPietro Monteiro2-225/+0
Stop using AC_HEADER_STDC since it is no longer supported in autoconf 2.72+. We require a C++ compiler that supports c++17, it's probably safe to assume that the C compiler fully supports C89. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-08-19gdb: remove unused includes in inferior.hSimon Marchi5-2/+4
gdbsupport/common-inferior.h was needed by a few .c files, so move it there. Change-Id: Ia3ab8c30b529a1eda09862c8faea9e8c1c8123b5
2025-08-19gdb: remove some unnecessary watchpoint_addr_within_range overridesAndrew Burgess3-25/+0
While looking at the watchpoint code, I realised that AArch64, ARM, and Loongarch all override watchpoint_addr_within_range with an implementation that is the same as the default (but with the logic written slightly differently). Compare the deleted functions to default_watchpoint_addr_within_range in target.c. The only other targets that override watchpoint_addr_within_range are ppc_linux_nat_target and remote_target, in both cases the implementation is different to the default. Lets remove these unnecessary overrides, and just use the default. There should be no user visible changes after this commit. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-08-19gdb: rename address_class -> location_classSimon Marchi48-342/+331
The enum address_class and related fields and methods seem misnamed to me. Generalize it to "location_class". The enumerators in address_class are already prefixed with LOC, so the new name seems logical to me. Rename related fields and methods as well. Plus, address_class could easily be mistaken for other unrelated things named "address class" in GDB or DWARF. Tested by rebuilding. Change-Id: I0dca3738df412b350715286c608041b08e9b4d82 Approved-by: Kevin Buettner <kevinb@redhat.com>
2025-08-19gdb: rename gdbarch_software_single_step -> gdbarch_get_next_pcsSimon Marchi36-59/+57
I spotted this while reviewing a patch adding a new gdbarch_software_single_step implementation. I find the name "software_single_step" a bit misleading or unclear. It makes it sounds as if the function executed a single step. In reality, this function returns the possible next PCs for current instructions. We have a similar concept in GDBserver: linux_process_target::low_get_next_pcs. I like that name, it's clear and straight to the point. Rename gdbarch_software_single_step to gdbarch_get_next_pcs. I find this name more indicative of what happens. There is some code for ARM shared between GDB and GDBserver to implement both sides, also called "get next pcs", so I think it all fits well together. Tested by rebuilding. Change-Id: Ide74011a5034ba11117b7e7c865a093ef0b1dece Approved-by: Kevin Buettner <kevinb@redhat.com> Acked-by: Luis Machado <luis.machado.foss@gmail.com>
2025-08-19gdb/testsuite: fix invalid assumption about TUI src windowAndrew Burgess1-2/+3
Fix a failing test introduced by this commit: commit e53b88b40ed38651b50f954dfe76066822094c15 Date: Wed Aug 13 15:29:38 2025 +0100 gdb: fix forward/reverse search, when no lines are printed The TUI test added in this commit assumed that the opening '{' of main would be the first statement line (in DWARF terms), and so, would be the initial focus of the TUI src window. This is true for some targets (e.g. x86), but not others (e.g. AArch64), and so gdb.tui/source-search.exp was seen failing on at least some AArch64 targets. Fix this by adding a 'list' command to the test, which forces the initial window contents to be as needed for the rest of the test. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33290 Approved-By: Tom de Vries <tdevries@suse.de>
2025-08-18[gdb/testsuite] Fix gdb.tui/tui-mode-switch.exp on aarch64Tom de Vries1-4/+9
On aarch64-linux, occasionally I run into these warnings: ... PASS: gdb.tui/tui-mode-switch.exp: set style enabled off WARNING: timeout in accept_gdb_output PASS: gdb.tui/tui-mode-switch.exp: no boo WARNING: timeout in accept_gdb_output ... The first in more detail: ... Box Dump (40 x 1) @ (0, 11): 11 b(gdb) b WARNING: timeout in accept_gdb_output ... Fix this by waiting for a prompt after leaving TUI before sending "b". Also, while we're at it generate a few more passes. Tested on aarch64-linux.
2025-08-17[gdb/testsuite] Use regexp to match $_gdb_{major,minor}Tom de Vries1-2/+12
Every time we update the gdb version number, test-case gdb.base/default.exp needs updating because it matches the values of convenience variables $_gdb_{major,minor} using hardcoded expected values: ... {$_gdb_major = 17} \ {$_gdb_minor = 1} \ ... I'm assuming the values were hardcoded because gdb_test_list_exact was used. Since the previous patch, that's not longer the case, so use regexps instead, getting rid of this annoyance [1]. Tested on x86_64-linux. [1] https://sourceware.org/pipermail/gdb-patches/2019-October/160935.html
2025-08-17[gdb/testsuite] Handle remote host in some test-casesTom de Vries6-46/+89
I ran test-case gdb.base/default.exp with make-check-all.sh, and noticed a FAIL with host/target board local-remote-host-native: ... FAIL: $exp: show convenience ($_colorsupport = "monochrome" not found) ... The problem is that part of the test-case relies on "setenv TERM dumb", and setenv, which is a tcl command (which runs on build), only has effect in gdb (which runs on host), if build == host, in other words, local host. I grepped for test-cases using setenv, and ran them with the host/target board, and fixed the FAILs I saw. All FAILs have the same cause as I described above, except for proc test_data_directory in gdb.python/py-parameter.exp, which handles files assuming local host. I chose to leave it that way, and bail out but add a comment. Implementationwise, the change to test-case gdb.base/default.exp is the most intrusive: it replaces a use of proc gdb_test_list_exact with a use of proc gdb_get_lines_no_pass, because it allows specifying a regexp match. In the process, I found out gdb_test_list_exact has a bug, filed as PR33038. Because of this bug, I had to add matching of convenience variable $_tbl. Tested on x86_64-linux.
2025-08-16[gdb/testsuite] Fix TUI tests on freebsdTom de Vries1-10/+16
While re-testing the TUI tests on x86_64-freebsd, I found that commit 06a53717f7c ("[gdb/testsuite] Handle unrecognized escape sequences better in tuiterm") broke most test-cases. Fix this by rewriting this gdb_test_multiple clause: ... -re "^($re_csi_prefix?)($re_csi_args*)($re_csi_cmd)" { ... into: ... -re "^($re_csi_cmd)" { ... -re "^($re_csi_args*)($re_csi_cmd)" { ... -re "^($re_csi_prefix?)($re_csi_args*)($re_csi_cmd)" { ... Tested on x86_64-linux and x86_64-freebsd.
2025-08-16[gdb/testsuite] Handle unrecognized escape sequences better in tuitermTom de Vries3-17/+114
When encountering an unrecognized escape sequence in Term::accept_gdb_output, a warning is issued: ... WARNING: timeout in accept_gdb_output ... and 0 is returned. Subsequent calls run into the same problem, so matching doesn't progress. Consequently, figuring out what the unrecognized escape sequence actually is depends on analyzing gdb's output as echoed into gdb.log. In the test added in this commit, gdb (well, a script gdb.tcl emulating gdb) outputs escape sequence "ESC ( B", which doesn't show up in recognizable form in gdb.log: ... foo^M^M ... and as mentioned the tuiterm screen only show: ... foo ... because matching doesn't progress beyond the unrecognized sequence. Fix this by rewriting accept_gdb_output to match gdb output using a phased approach that echoes unmatched escape sequences, giving us instead on the tuiterm screen: ... foo^[(B ... [ Since "ESC ( B" is now supported, the test-case has been updated to use "ESC ( % 5" instead. ] Tested on x86_64-linux. PR testsuite/33218 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33218
2025-08-16[gdb/testsuite] Move setting of Term::_last_char to Term::_insertTom de Vries2-6/+15
The variable Term::_last_char is meant to represent the last char inserted by Term::_insert, but setting it is done alongside the only call to _insert in lib/tuiterm.exp: ... _insert $expect_out(0,string) variable _last_char set _last_char [string index $expect_out(0,string) end] ... Fix this by moving the setting of _last_char to inside _insert. Tested on x86_64-linux.
2025-08-15[gdb/testsuite] Add gdb.tui/tui-mode-switch.expTom de Vries1-0/+52
Add test-case gdb.tui/tui-mode-switch.exp, a regression test for PR tui/30523. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30523
2025-08-15[gdb/testsuite] Add Term::with_termTom de Vries1-1/+15
Add Term::with_term that allows us to override the default TERM used in tuiterm: ... Term::with_term xterm { Term::clean_restart 12 40 } ...
2025-08-15[gdb/testsuite] Add Term::_esc_0x3d and Term::_esc_0x3eTom de Vries1-0/+19
Add support for: - DECKPAM (Application Keypad) ESC = - DECKPNM (Normal Keypad) ESC >
2025-08-15[gdb/testsuite] Add Term::_esc_0x28_B and Term::_esc_0x28_0Tom de Vries1-0/+20
Add support for: - Designate G0 Character Set, USASCII ESC ( B - Designate G0 Character Set, DEC Special Character and Line Drawing Set ESC ( 0
2025-08-15[gdb/testsuite] Add Term::_csi_rTom de Vries1-0/+7
Add support for: - Set Scrolling Region (DECSTBM) CSI r
2025-08-15[gdb/testsuite] Add Term::_csi_tTom de Vries1-0/+17
Add support for: - Window manipulation (XTWINOPS) CSI t
2025-08-15[gdb/testsuite] Add Term::_csi_0x3f_l and Term::_csi_0x3f_hTom de Vries1-0/+137
Add support for: - DECSET CSI ? h - DECRST CSI ? l
2025-08-15[gdb/testsuite] Add Term::_csi_h and Term::_csi_lTom de Vries1-0/+34
Add support for: - Set Mode (SM) CSI h - Reset Mode (RM) CSI l
2025-08-15[gdb/tui] Clear readline buffer on switching to TUITom de Vries1-0/+13
Consider the following scenario. We start gdb and type foo: ... $ gdb -q (gdb) foo ^ ... Then we switch to TUI using C-x C-a, and switch back using the same key combination. We get back the same, but with the cursor after the prompt: ... (gdb) foo ^ ... Typing b<ENTER> gives us: ... (gdb) boo ❌️ No default breakpoint address now. (gdb) ... which means gdb didn't see "boo" here, just "b". So while "foo" is part of the readline buffer when leaving CLI, it's not upon returning to CLI, but it is still on screen, which is confusing. Fix this by using rl_clear_visible_line in tui_rl_switch_mode to clear the readline buffer when leaving CLI. This only reproduces for me with TERM=xterm. Tested on x86_64-linux. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30523
2025-08-15gdb: fix forward/reverse search, when no lines are printedAndrew Burgess4-7/+233
This commit continues the theme of the previous commit, restoring the behaviour of forward-search and reverse-search to what it was before GDB 10, but adds tests to guard the behaviour. I believe this restored behaviour is inline with the documentation of the two search commands. This time, I'm looking at what happens when no source lines end up being printed. This can happen for two reasons, a request is made to list a line number outside the file, or, a request is made to list a reverse series of lines (e.g. line 100 to line 50). Before GDB 10, a 'list' command that resulted in no lines being printed would not change the notion of the last line listed. As a result a future forward or reverse search would continue from the previous last line. As an example, here's current master branch behaviour: (gdb) list 50 45 /* Line 45 */ 46 /* Line 46 */ 47 /* Line 47 */ 48 /* Line 48 */ 49 /* Line 49 */ 50 /* Line 50 */ 51 /* Line 51 */ 52 /* Line 52 */ 53 /* Line 53 */ 54 /* Line 54 */ (gdb) list 1000 Line number 995 out of range; long-file.c has 101 lines. (gdb) forward-search Line Expression not found (gdb) But on GDB 9, the forward-search instead acts like this: (gdb) forward-search Line 55 /* Line 55 */ (gdb) Similarly, reverse-search reports "Expression not found" on master, but would return line 53 on GDB 9. The reverse-search result for master might be a little surprising, surely, if we tried to list line 1000, then every line before that should be searched. The problem is that last_line_listed ends up being set to 995 (which is 1000 minus half the listsize). Then, when the reverse-search kicks in GDB tried to read line 994, fails, and abandons the search. This problem was introduced with commit: commit 8b7fcda2744145f2380af01c9db8e11986f7af6d Date: Sun Dec 22 14:58:22 2019 +0100 Fix search in TUI This commit wants last_line_listed updated so that the search functions would work correctly (see notes below) when GDB is in TUI mode. Without this commit last_line_listed would never be updated in TUI mode, and so every search would effectively start from the beginning of the file. The fix I propose is to delay updating the current_source_location until the source code has been printed successfully. That is, just before we leave print_source_lines_base, after a successful print. This update happens inside the 'if (noprint)' block, a the return here isn't really considered an error condition, this is a specific choice _not_ to print the source code. However, in the 'if (stopline <= line)' block, the current_source_location is not updated, that's because this 'if' represents an error condition. The last_line_listed is also updated at the end of the function still, which is the path taken in CLI mode when source lines are actually printed. I've added some CLI tests to confirm the forward/reverse search behaviour. And I've also added some TUI tests to check search works within the TUI. The TUI tests cover more than just the fix for this issue. There is one slight issue with the TUI. At this point you should definitively go read the previous commit. OK, so, the forward and reverse searches are supposed to search from the last line listed. The previous commit fixed this for CLI mode, but for the TUI the last_line_listed is _still_ being set to the first line displayed. The problem is that print_source_lines_base doesn't know the size of the TUI src window, and so, doesn't know what the last line listed will be, and so cannot set last_line_listed correctly. This indicates to me that setting last_line_listed from the core GDB code is likely the wrong approach, or, at least, the way it is done now is the wrong approach. Currently the 'list' command converts the arguments into a set of lines to be printed based on the CLI environment, e.g. using the 'listsize' if necessary. But the 'listsize' doesn't make sense for the TUI, where the src window height really overrides the 'listsize'. The list command then calls the core GDB print_source_lines function to do the printing, but for the TUI we don't actually print anything, we just update the internal state (including last_line_listed) and are done. I think that the current interpreter, CLI or TUI, needs to get involved in the 'list' command implementation much sooner. This would allow, for example, the CLI to use 'listsize' and the TUI to use the src window height. It might then be up to the interpreter to track the last line listed maybe? I mention all this only to acknowledge this issue. The problem existed before this commit, and continues to exist after this commit. I'm not proposing to fix this problem right now. The TUI forward/reverse search continue to work as well as they have since commit 8b7fcda2744. Approved-By: Tom Tromey <tom@tromey.com>
2025-08-15gdb: fix forward and reverse search commands to match documentationAndrew Burgess3-5/+214
The forward-search and reverse-search commands were broken by this commit: commit a75cd9a2c129dfc086cbe570ef9cff9b84570bbd Date: Thu Nov 14 16:11:15 2019 -0700 Add observable to watch current source symtab while builds on the work in this commit: commit 1dd588507782591478882a891f64945af9e2b86c Date: Thu Aug 1 09:34:40 2019 -0600 Make current_source_* per-program-space both of these commits went into GDB 10. The documentation for these commands is pretty clear: 'forward-search REGEXP' 'search REGEXP' The command 'forward-search REGEXP' checks each line, starting with the one following the last line listed, for a match for REGEXP. It lists the line that is found. You can use the synonym 'search REGEXP' or abbreviate the command name as 'fo'. 'reverse-search REGEXP' The command 'reverse-search REGEXP' checks each line, starting with the one before the last line listed and going backward, for a match for REGEXP. It lists the line that is found. You can abbreviate this command as 'rev'. Both searches should start searching based on the last line listed. But currently: (gdb) list 3 1 int 2 main (void) 3 { 4 /* Line 4 */ 5 /* Line 5 */ 6 /* Line 6 */ 7 /* Line 7 */ 8 /* Line 8 */ 9 /* Line 9 */ 10 /* Line 10 */ (gdb) forward-search Line 4 /* Line 4 */ (gdb) This should have found line 11. And for reverse-search: (gdb) list 3 1 int 2 main (void) 3 { 4 /* Line 4 */ 5 /* Line 5 */ 6 /* Line 6 */ 7 /* Line 7 */ 8 /* Line 8 */ 9 /* Line 9 */ 10 /* Line 10 */ (gdb) reverse-search Line Expression not found (gdb) The reverse-search should have returned line 9. This new behaviour started with the above commits in GDB 10. On GDB 9 we see behaviour that matches the documentation. Where the forward and reverse searches start from is controlled by a global, last_line_listed, found in source.c. Before commit 1dd588507782, in print_source_lines_base, the last_line_listed variable was updated as each source line was printed, and it was updated with the current line being printed. After commit 1dd588507782, the current symtab and line are moved into a current_source_location object, but the symtab and line member variables are public. The last_line_listed is still set based on the value held in the current_source_location object, and this object is updated each time around the source printing loop. So despite the restructure, the logic, and behaviour, is unchanged. After commit a75cd9a2c129, the member variables of current_source_location are now private. The source printing loop in print_source_lines_base uses a local variable, new_lineno, to track the current source line number, and updates the current_source_location at the end of print_source_lines_base. However, last_line_listed is still updated inside the loop, using the original line value within current_source_location, which is no longer being updated each time around the loop. As a result, last_line_listed is now just the first line listed! This didn't show up in testing because, as far as I can tell, the last_line_listed is _only_ used for forward and reverse searching, and the testing for these commands is minimal. In this commit I move the setting of last_line_listed outside of the source printing loop, this only needs to be updated once, when we have finished printing the source lines. I've also done a couple of other cleanups in the same area, I moved 'buf' a local variable into the most inner scope where it is required, and I converted the 'while' loop into a 'for' loop, moving the increment out of the loop body. There's now a test which does some more detailed checks of the forward and reverse search commands. Approved-By: Tom Tromey <tom@tromey.com>
2025-08-14[gdb/testsuite] Fix gdb.base/dlmopen.exp on native-gdbserverTom de Vries1-9/+13
With test-case gdb.base/dlmopen.exp and target board native-gdbserver, I get: ... (gdb) info breakpoints 3^M Num Type Disp Enb Address What^M 3 breakpoint keep y 0x00007ffff7fc8000 ^M stop only if (0) (target evals)^M (gdb) FAIL: $exp: test_solib_unmap_events: check b/p status ... The problem is that the regexp doesn't allow for the "(target evals)" part: ... -re -wrap "$bpnum\\s+breakpoint\\s+keep\\s+y\\s+$::hex\\s*\[^\r\n\]+\r\n\\s+stop o nly if \\(0\\)" { ... Fix this by updating the regexp. While we're at it: - rewrite the regexp using multiline, string_to_regexp, join and string cat to make it more readable, and - remove the redundant failure clause from the same gdb_test_multiple. Tested on x86_64-linux using make-check-all.sh. Approved-By: Tom Tromey <tom@tromey.com>
2025-08-14[gdb/testsuite] Fix gdb.tui/basic.exp on native-extended-gdbserverTom de Vries1-1/+1
With test-case gdb.tui/basic.exp and target board native-extended-gdbserver I get: ... status line: '<reverse:1>extended-r No process (asm) In: L?? PC: ?? <reverse:0>' FAIL: gdb.tui/basic.exp: status window: reverse ... because the regexp: ... gdb_assert { [regexp "^<.*>exec" $status] == 1 } \ ... tries to match: ... status line: '<reverse:1>exec No process (asm) In: L?? PC: ?? <reverse:0>' ... Fix this by updating the regexp to allow both exec and extended-r. Tested on x86_64-linux. Approved-By: Tom Tromey <tom@tromey.com>
2025-08-14gdb, gdbserver: update copyright years in copyright noticesSimon Marchi1-1/+1
The copyright notices printed by these programs still use year 2024. Update to 2025. It seems like a trivial patch to me, but I am posting it for review, in case there's something wrong in the new-year process that caused them to be missed, in which case we should address that too. Change-Id: I7d9541bb154b8000e66cfead4e4228e33c49f18b Approved-by: Kevin Buettner <kevinb@redhat.com>
2025-08-14gdb/testsuite: update some copyright yearsSimon Marchi11-11/+11
I ran gdb/copyright.py and these were changed. Change-Id: If0cfb538eff45cbb51863b963405002689512285
2025-08-14gdb/dwarf: clear per_bfd::num_{comp,type}_units on errorSimon Marchi4-21/+44
Commit bedd6a7a44 ("gdb/dwarf: track compilation and type unit count") causes this internal error: $ ./gdb -nx -q --data-directory=data-directory testsuite/outputs/gdb.dwarf2/debug-names-duplicate-cu/debug-names-duplicate-cu -ex "save gdb-index -dwarf-5 /tmp" -batch warning: Section .debug_names has incorrect number of CUs in CU table, ignoring .debug_names. /home/smarchi/src/binutils-gdb/gdb/dwarf2/index-write.c:1454: internal-error: write_debug_names: Assertion `comp_unit_counter == per_bfd->num_comp_units' failed. This is visible when running this test: $ make check TESTS="gdb.dwarf2/debug-names-duplicate-cu.exp" RUNTESTFLAGS="--target_board=cc-with-debug-names" ... Running /home/smarchi/src/binutils-gdb/gdb/testsuite/gdb.dwarf2/debug-names-duplicate-cu.exp ... gdb compile failed, warning: Section .debug_names has incorrect number of CUs in CU table, ignoring .debug_names. /home/smarchi/src/binutils-gdb/gdb/dwarf2/index-write.c:1454: internal-error: write_debug_names: Assertion `comp_unit_counter == per_bfd->num_comp_units' failed. ... === gdb Summary === # of untested testcases 1 However, it's easy to miss because it only causes an "UNTESTED" to be recorded, not a FAIL or UNRESOLVED. This is because the problem happens while trying to create the .debug_names index, as part of the test case compilation. The problem is: when we bail out from using .debug_names because we detect it is inconsistent with the units in .debug_info, we clear per_bfd->all_units, to destroy all units previously created, before proceeding to read the units with an index. However, we don't clear per_bfd->num_{comp,type}_units. As a result, per_bfd->all_units contains one unit, while per_bfd->num_comp_units is 2. Whenever we clear per_bfd->all_units, we should also clear per_bfd->num_{comp,type}_units. While at it, move this logic inside a scoped object. I added an assertion in finalize_all_units to verify that the size of per_bfd->all_units equals per_bfd->num_comp_units + per_bfd->num_type_units. This makes the problem (if omitting the fix) visible when running gdb.dwarf2/debug-names-duplicate-cu.exp with the unix (default) target board: ERROR: Couldn't load debug-names-duplicate-cu into GDB (GDB internal error). FAIL: gdb.dwarf2/debug-names-duplicate-cu.exp: find index type (GDB internal error) FAIL: gdb.dwarf2/debug-names-duplicate-cu.exp: find index type, check type is valid === gdb Summary === # of expected passes 1 # of unexpected failures 2 # of unresolved testcases 1 I considered changing the code to build a local vector of units first, then move it in per_bfd->all_units on success, that would avoid having to clean it up on error. I did not do it because it's a much larger change, but we could consider it. Change-Id: I49bcc0cb4b34aba3d882b27c8a93c168e8875c08 Approved-By: Tom Tromey <tom@tromey.com>
2025-08-14[gdb/testsuite] Fix gdb.base/condbreak-multi-context.exp on native-gdbserverTom de Vries1-2/+1
With test-case gdb.base/condbreak-multi-context.exp on target board native-gdbserver, I run into: ... (gdb) continue Continuing. gdb/ax-gdb.c:542: internal-error: gen_var_ref: \ LOC_CONST_BYTES symbols are not supported A problem internal to GDB has been detected, further debugging may prove unreliable. ----- Backtrace ----- FAIL: $exp: start_before=true: scenario_1: run until A::func (GDB internal error) Resyncing due to internal error. 0x64cfa9 gdb_internal_backtrace_1 gdb/bt-utils.c:122 0x64d047 _Z22gdb_internal_backtracev gdb/bt-utils.c:175 0x10cfdf1 internal_vproblem gdb/utils.c:423 0x10d020b _Z15internal_verrorPKciS0_P13__va_list_tag gdb/utils.c:503 0x19a6b4e _Z18internal_error_locPKciS0_z gdbsupport/errors.cc:57 0x5b76f9 gen_var_ref gdb/ax-gdb.c:541 0x5b9565 gen_static_field gdb/ax-gdb.c:1460 0x5b91c9 gen_struct_ref_recursive gdb/ax-gdb.c:1357 0x5b93f8 gen_struct_ref gdb/ax-gdb.c:1427 0x5bba0d _Z17gen_expr_structopP10expression10exp_opcodePN4expr9operationEPKcP10agent_exprP9axs_value gdb/ax-gdb.c:2253 0x678d94 _ZN4expr22structop_ptr_operation14do_generate_axEP10expressionP10agent_exprP9axs_valueP4type gdb/expop.h:1089 0x5b9ab6 _ZN4expr9operation11generate_axEP10expressionP10agent_exprP9axs_valueP4type gdb/ax-gdb.c:1602 0x5bb905 _Z14gen_expr_binopP10expression10exp_opcodePN4expr9operationES4_P10agent_exprP9axs_value gdb/ax-gdb.c:2233 0x69815c _ZN4expr24usual_ax_binop_operationIL10exp_opcode14EXadL_Z13eval_op_equalP4typeP10expression6nosideS1_P5valueS8_EEE14do_generate_axES5_P10agent_exprP9axs_valueS3_ gdb/expop.h:1291 0x5b9ab6 _ZN4expr9operation11generate_axEP10expressionP10agent_exprP9axs_valueP4type gdb/ax-gdb.c:1602 0x5bc034 _Z17gen_eval_for_exprmP10expression gdb/ax-gdb.c:2396 0x5f16b6 parse_cond_to_aexpr gdb/breakpoint.c:2582 0x5f18a5 build_target_condition_list gdb/breakpoint.c:2640 0x5f2698 insert_bp_location gdb/breakpoint.c:2970 0x5f3916 insert_breakpoint_locations gdb/breakpoint.c:3400 0x60c1dd update_global_location_list gdb/breakpoint.c:11771 0x5f3421 _Z18insert_breakpointsv gdb/breakpoint.c:3293 0xaa0972 keep_going_pass_signal gdb/infrun.c:9131 0xa91b23 proceed_resume_thread_checked gdb/infrun.c:3579 0xa92490 _Z7proceedm10gdb_signal gdb/infrun.c:3780 0xa72b9b _Z10continue_1i gdb/infcmd.c:639 0xa72e4b continue_command gdb/infcmd.c:730 0x6c01d1 do_simple_func gdb/cli/cli-decode.c:95 0x6c683a _Z8cmd_funcP16cmd_list_elementPKci gdb/cli/cli-decode.c:2827 0xff11a9 _Z15execute_commandPKci gdb/top.c:565 0x959e0a _Z15command_handlerPKc gdb/event-top.c:613 0x95a3e7 _Z20command_line_handlerOSt10unique_ptrIcN3gdb13xfree_deleterIcEEE gdb/event-top.c:849 0x102b645 tui_command_line_handler gdb/tui/tui-interp.c:101 0x959548 gdb_rl_callback_handler gdb/event-top.c:288 0x1186dfd rl_callback_read_char readline/readline/callback.c:302 0x95925a gdb_rl_callback_read_char_wrapper_sjlj gdb/event-top.c:197 0x95934a gdb_rl_callback_read_char_wrapper_noexcept gdb/event-top.c:240 0x9593c9 gdb_rl_callback_read_char_wrapper gdb/event-top.c:252 0x1071253 stdin_event_handler gdb/ui.c:154 0x19a7c80 handle_file_event gdbsupport/event-loop.cc:551 0x19a825b gdb_wait_for_event gdbsupport/event-loop.cc:672 0x19a711c _Z16gdb_do_one_eventi gdbsupport/event-loop.cc:263 0x6ce4e3 _ZN6interp12do_one_eventEi gdb/interps.h:87 0xb74717 start_event_loop gdb/main.c:402 0xb748b6 captured_command_loop gdb/main.c:467 0xb7638f captured_main gdb/main.c:1345 0xb76438 _Z8gdb_mainP18captured_main_args gdb/main.c:1364 0x41a411 main gdb/gdb.c:38 ... This reproduces with gcc 7, not with gcc 8 or later. Fix this by throwing an error instead of asserting, getting us instead: ... (gdb) continue^M Continuing.^M ^M Breakpoint 2.2, A::func (this=$hex) at condbreak-multi-context.cc:31^M 31 void func () {}^M (gdb) PASS: $exp: start_before=true: scenario_1: run until A::func ... Tested on x86_64-linux. Approved-By: Simon Marchi <simon.marchi@efficios.com> PR gdb/32012 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32012
2025-08-14gdb: modernize get_frame_pc_if_availableGuinevere Larsen9-53/+56
The convenience function get_frame_pc_if_available would take a pointer to a variable that should be set if available, and would return a boolean indicating whether that action was successful or not. Now that GDB supports C++17 features, this indirection of a pointer and returning boolean is unnecessary, since the function can return an optional, and code that calls it can check if the optional contains a value. This commit makes that modernization. It should have no visible effects. Approved-By: Tom Tromey <tom@tromey.com>
2025-08-14[gdb/testsuite] Remove useless indentation in lib/tuiterm.expTom de Vries1-1105/+1105
In lib/tuiterm.exp we have: ... namespace eval Term { variable ... ... } ... with everything within the namespace (which is basically the entire file) indented, which wastes screen space and makes editing more involved. We could maybe fix this by moving the "namespace eval Term" to tuiterm_env, but I don't think it's a good idea to move it out of the file. Another idea is to have the file include itself, wrapped in the namespace: ... if { ![info exists Term::_in_namespace] } { namespace eval Term { # Read the rest of this file, wrapped in this namespace. variable _in_namespace set _in_namespace 1 source $::srcdir/lib/tuiterm.exp unset _in_namespace return } } variable ... ... but this was considered unnecessarily complex. Fix this in the style of lib/ton.tcl and lib/completion-support.exp: - only declare the variables in the namespace, and - define the procs using a Term:: prefix. As a side-effect, this works around an emacs bug that makes editing lib/tuiterm.exp in its current form problematic because the auto-indentation keeps removing required indentation of all but the first proc [1]. Tested on x86_64-linux. [1] https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-11/msg01674.html
2025-08-14gdb, configure: Add enable-binary-file-format option for configureGuinevere Larsen9-37/+270
GDB has support for many binary file formats, some which might be very unlikely to be found in some situations (such as the XCOFF format in an x86 system). This commit introduces the option for a user to choose which formats GDB will support at build configuration time. This is especially useful to avoid possible security concerns with readers that aren't expected to be used at all, as they are one of the simplest vectors for an attacker to try and hit GDB with. This change can also reduce the size of the final binary, if that is a concern. This commit adds a switch to the configure script allowing a user to only enable selected file formats, called --enable-binary-file-formats. The default behavior when the switch is omitted is to compile all file formats, keeping the original behavior of the script. At the time of this commit, the valid options for this option are: dbx, coff (which includes coff-pe), xcoff, mips, elf, macho and all. All is treated especially, activating all supported readers. A few targets may require specific binary file format support, as they directly call functions defined by the file reader. Specifically, windows targets require coff support, and rs6000 aix and lynx178 targets require xcoff support. Considering that those formats are the main - or only - one available in those targets, I believe it makes sense to re-enable those readers. If that happens, the script will emit the following warning: FOO is required to support one or more requested targets. Adding it Users aren't able to force the disabling of those formats, since GDB will not compile without those readers. Ideally we'd like to be able to disable even those formats, in case a user wants to build GDB only to examine remote files for example, but the current infrastructure for the file format readers doesn't allow us to do it. Mach-O and elf support are also dependent on BFD support being compiled in. In case one of those was requested and BFD does not support them, the following error is emitted: FOO was requested, but BFD does not support it. Finally, this configure switch is also printed by the "show configuration" command in GDB. Reviewed-By: Eli Zaretskii <eliz@gnu.org> Approved-By: Tom Tromey <tom@tromey.com>
2025-08-14[gdb/testsuite] Disable CLI styling by default in Term::prepare_tuiTom de Vries4-1/+14
On x86_64-freebsd, with test-case gdb.tui/main.exp, I ran into a failure to match the output of the file command, for which I submitted a patch [1]. However, after switching to TERM=ansiw for bsd, I could no longer reproduce the problem. Investigation showed that the difference was caused by CLI styling. A command: ... (gdb) file <filename> ... gives an output: ... Reading symbols from <filename>... (gdb) ... On x86_64-linux, with CLI styling I get: ... Reading symbols from ^[[32m/data/vries/gdb/leap-15-6/build/gdb/testsuite/outputs/gdb.tui/main/main^[[39m^[[0;10m... ... After disabling CLI styling using "set style enabled off", I simply get: ... Reading symbols from /data/vries/gdb/leap-15-6/build/gdb/testsuite/outputs/gdb.tui/main/main... ... and run into the same failure as on x86_64-freebsd. The extra csi sequence "^[[32m" causes an additional matching attempt in Term::wait_for, and the way we're currently matching relies on this: ... send_gdb "file [standard_output_file $testfile]\n" gdb_assert { [Term::wait_for "Reading symbols from"] } "file command" ... Make the TUI testsuite more stable and matching more simple by disabling CLI styling by default, and: - fix the resulting fallout in test-cases gdb.tui/main.exp and gdb.tui/new-layout.exp, and - re-enable CLI styling in the one test-case that needs it: gdb.tui/tui-disasm-styling.exp. Tested on x86_64-linux. [1] https://sourceware.org/pipermail/gdb-patches/2025-June/218942.html
2025-08-14[gdb/testsuite] Make prompt matching in Term::wait_for more strictTom de Vries2-8/+66
On x86_64-freebsd, I run into: ... Box Dump (80 x 24) @ (0, 0): 0 (gdb) maint info screen 1 Number of characters gdb thinks are in a line is 90. 2 Number of characters readline reports are in a line is 89. 3 Number of characters curses thinks are in a line is 90. 4 Number of characters environment thinks are in a line is 90 (COLUMNS). 5 Number of lines gdb thinks are in a page is 40. 6 Number of lines readline reports are in a page is 40. 7 Number of lines curses thinks are in a page is 40. 8 Number of lines environment thinks are in a page is 40 (LINES). 9 Readline wrapping mode: readline (terminal is not auto wrap capable, last column 10 . 11 (gdb) tui disable 12 (gdb) tui disable 13 (gdb) maint info screen 14 15 16 17 18 19 20 21 22 23 FAIL: gdb.tui/resize-2.exp: again: curses width 80 ... The problem is that the prompt matching in Term::wait for is not strict enough. It will accept a line: ... (gdb) foo ... as long as the cursor is pointing just after the prompt, like so: ... (gdb) foo ^ ... Fix this by also checking that the line is empty. Tested on x86_64-linux.
2025-08-14[gdb/testsuite] Stop on main in gdb.gdb/{python-helper,selftest}.expTom de Vries3-16/+34
With a gdb build with gcc 15.1.1 and "-O2 -flto=auto -g", I run into: ... UNTESTED: gdb.gdb/selftest.exp: \ Cannot set breakpoint at captured_main, skipping testcase. UNTESTED: gdb.gdb/python-helper.exp: \ Cannot set breakpoint at captured_main, skipping testcase. ... I don't know why we're trying to stop in captured_main. Stopping in main also works, and main is more likely to be present in an lto build. Fix this by using main instead. This requires us to update the expected file name from main.c to gdb.c in selftest_setup. After doing so, we get: ... XFAIL: gdb.gdb/selftest.exp: \ run until breakpoint at main (line numbers scrambled?) XFAIL: gdb.gdb/python-helper.exp: \ run until breakpoint at main (line numbers scrambled?) ... because main is reported to be in run-on-main-thread.c instead of gdb.c: . Breakpoint 1, main (...) at gdb/run-on-main-thread.c:120^M ... This is due to picking the last line entry for pc == 0x455e40 that has is_stmt == true: ... File name Line number Starting address View Stmt gdb/gdb.c: gdb.c 25 0x455e40 x gdb.c 30 0x455e40 1 x gdb/run-on-main-thread.c: run-on-main-thread.c 116 0x455e40 2 x run-on-main-thread.c 120 0x455e40 3 x gdb/gdb.c: gdb.c 25 0x455e40 4 /usr/include/c++/15/bits/std_thread.h: std_thread.h 366 0x455e4b ... While we're at it, update the corresponding gdb_test_multiple in selftest_setup using multi_line and -wrap. Tested on x86_64-linux.
2025-08-14[gdb/testsuite] Make ^C cancel i-searchTom de Vries2-3/+5
PR cli/21690 reports the following: say we start gdb: ... $ gdb -q (gdb) ... and press ^R for reverse-i-search: ... (reverse-i-search)`': ... Pressing the p key has the effect of showing both the pressed key and a matching entry, which happens to be up: ... (reverse-i-search)`p': up ... Now we press ^C to cancel the search: ... (reverse-i-search)`p': u❌️ Quit (gdb) ... and type "down". We expected to get: ... (gdb) down ... but instead we get: ... (failed reverse-i-search)`pdown': ... So we're stuck in reverse-i-search, until we use the workaround of ^G. The same problem happened with python [1], was reported upstream [2], and fixed in cpython commit d6990d221b0 ("Issue #24266: Cancel history search mode with Ctrl+C in Readline 7") using rl_callback_sigcleanup. Fix this likewise in quit using rl_callback_sigcleanup, a new callback function in readline 7.0: ... i. rl_callback_sigcleanup: a new application function that can clean up and unset any state set by readline's callback mode. Intended to be used after a signal. ... giving us instead: ... $ gdb (gdb) u❌️ Quit (gdb) down ... Remove the corresponding kfail in gdb.tui/pr30056.exp. Tested on x86_64-linux. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=21690 [1] https://bugs.python.org/issue24266 [2] https://lists.gnu.org/archive/html/bug-readline/2015-05/msg00014.html
2025-08-13Refine range check in create_addrmap_from_gdb_indexTom Tromey1-1/+1
PR symtab/33247 points out that this check in create_addrmap_from_gdb_index: if (lo > hi) { complaint (_(".gdb_index address table has invalid range (%s - %s)"), hex_string (lo), hex_string (hi)); ... should probably use ">=" instead. Reading a bit further the reason seems obvious: mutable_map.set_empty (lo, hi - 1, index->units[cu_index]); Here if lo==hi, then this will insert a "reversed" range into the addrmap. Apparently some LLVM tool can erroneously create a .gdb_index like this. No test because it seems like more trouble to write than it's worth. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33247 Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-08-13Remove cast from captured_mainTom Tromey1-3/+1
captured_main takes a 'void *', but then immediately casts it to the correct type. There's no reason for this any more, the caller passes in the correct type. This patch cleans this up. Tested by rebuilding.
2025-08-12[gdb/tui] Make tui_disassemble more efficientTom de Vries1-15/+19
Function tui_disassemble (with addr_size parameter) has two modes of operation: - addr_size != nullptr, and - addr_size == nullptr. I noticed that for the addr_size == nullptr case, more than necessary is done. Fix this by using continue and null_stream. While we're at it, eliminate the unnecessary variables new_size and orig_pc. Tested on x86_64-linux. Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-08-12[gdb/tdep] Handle M1 ldp in aarch64_stopped_data_addressTom de Vries2-4/+10
In test-case gdb.base/watchpoint-unaligned.exp, in function write_size8twice, two adjacent 8-byte vars are written. For aarch64, we use a single stp instruction for that. If we do the same in function read_size8twice for two adjacent 8-byte var reads using aarch64 insn ldp, on an aarch64-linux M1 system we get a hang: ... (gdb) continue^M Continuing.^M FAIL: $exp: fun=read_size8twice: offset=0: index=1: continue (timeout) FAIL: $exp: fun=read_size8twice: offset=0: index=1: $got_hit ... The same problem was observed for stp in PR tdep/29423, fixed by commit 9a03f218534 ("[gdb/tdep] Fix gdb.base/watchpoint-unaligned.exp on aarch64"). See that commit for an explanation of the hang. That commit introduced max_access_size in aarch64_stopped_data_address: ... The access size also can be larger than that of the watchpoint itself. For instance, the access size of an stp instruction is 16. So, if we use stp to store to address p, and set a watchpoint on address p + 8, the reported ADDR_TRAP can be p + 8 (observed on RK3399 SOC). But it also can be p (observed on M1 SOC). Checking for this situation introduces the possibility of false positives, so we only do this for hw_write watchpoints. */ const CORE_ADDR max_access_size = type == hw_write ? 16 : 8; ... If we say that hangs are worse than false positives, then we should also fix this case. Fix this by setting max_access_size to 16 for all watchpoint types. Tested on aarch64-linux, both on an M1 SOC and an RK3399 SOC. Approved-By: Luis Machado <luis.machado.foss@gmail.com>
2025-08-12[gdb/testsuite] Extend gdb.base/watchpoint-unaligned.expTom de Vries2-10/+40
Extend the part of gdb.base/watchpoint-unaligned.exp handling write_size8twice to also check read hardware watchpoints. Tested on x86_64-linux. Approved-By: Luis Machado <luis.machado.foss@gmail.com>
2025-08-12[gdb/testsuite] Improve gdb.base/watchpoint-unaligned.expTom de Vries2-41/+69
Improve the part of gdb.base/watchpoint-unaligned.exp handling write_size8twice: - move the code into a proc - use -wrap - use $decimal more often - don't use gdb_test_multiple $test $test - add comments - start test when entering write_size8twice function, instead of main - finish test when leaving write_size8twice function, instead of main - add insn in between: - insn triggering watchpoint, and - insn triggering breakpoint to ensure that the watchpoint triggers before the breakpoint, and add a comment explaining this. Tested on x86_64-linux.
2025-08-12Change type::fields to return an array_viewTom Tromey14-139/+115
This patch changes type::fields to return an array_view of the fields, then fixes up the fallout. More cleanups would be possible here (in particular in the field initialization code) but I haven't done so. The main motivation for this patch was to make it simpler to iterate over the fields of a type. Regression tested on x86-64 Fedora 41. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-08-12Avoid scopes.exp failure on certain architecturesTom Tromey1-2/+9
A buildbot pointed out that my changes to gdb.dap/scopes.exp caused a test failure. The new code iterates over all the registers, fetching their children (when possible). The failure comes because this code failed to consider that a register might have "indexed" children, which I believe can occur when a register is vector-like. This patch fixes the problem by arranging to fetch indexed children when indicated.
2025-08-11Emit DAPException when too many variable children are reqeustedTom Tromey2-0/+11
PR dap/33228 points out a failure that occurs when the DAP client requests more children of a variable than actually exist. Currently, gdb throws a somewhat confusing exception. This patch changes this code to throw a DAPException instead, resulting in a more ordinary and readable failure. The spec seems to be silent on what to do in this case. I chose an exception on the theory that it's easier to be strict now and lift the restriction later (if needed) than vice versa. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33228
2025-08-11Do not allow DAP clients to dereference "void *"Tom Tromey3-10/+36
While investigating a different bug, I noticed that the DAP code would report a "void *"-typed register as having children -- however, requesting the children of this register would fail. The issue here is that a plain "void *" can't be dereferenced. This patch changes the default visualizer to treat a "void *" as a scalar. This adds a new test; but also arranges to examine all the returned registers -- this was the first thing I attempted and it seemed reasonable to have a test that double-checks that all the registers really can be dereferenced as appropriate. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33228
2025-08-08should_validate_memtags: Do not dereference referencesKeith Seitz3-1/+115
should_validate_memtags uses value_as_address to evalute whether an address for a value is tagged. The comments for that function simply say, "Extract a value as a C pointer." While that sounds innoncuous, that function calls coerce_array, which will dereference any references. This is not what is desired here. This can be demonstrated on an MTE-enabled host, such as aarch64- based Ampere (example taken from tests introduced in this patch): (gdb) p b.get_foo () Could not validate memory tag: Value can't be converted to integer. $2 = (const foo &) @0xffffffffed88: {m_a = 42} While the command completes, gdb didn't actually attempt to evaluate any memory tags. Fix this by using unpack_pointer instead. Tested on x86_64 Fedora 40 and aarch64 RHEL 9.6.
2025-08-08[gdb/testsuite] Fix gdb.tui/basic.exp for TERM=ansisTom de Vries1-1/+5
With test-case gdb.tui/basic.exp and TERM=ansis, I run into (with some logging added): ... status line: '<reverse:1><intensity:dim>exec No process (asm) In: L?? PC: ?? <reverse:0><intensity:normal>' FAIL: gdb.tui/basic.exp: status window: reverse ... The status window uses ncurses attribute standout, which can differ between different terminal settings. Fix this by making the matching less strict. Tested on x86_64-linux.
2025-08-08[gdb/testsuite] Fix gdb.tui/main-2.exp for TERM=ansisTom de Vries1-2/+2
When running test-case gdb.tui/main-2.exp with TERM=ansis, I get: ... screen line 6: 'B+><fg:black><intensity:bold> 21 <reverse:1><fg:default><intensity:normal> return 0;<reverse:0> ' FAIL: gdb.tui/main-2.exp: highlighted line in middle of source window ... The test tries to check the highlighting of the source line, but also gets the part with the line number, which makes it more complicated to parse. Fix this by getting just the part with the source line: ... screen line 6: '<reverse:1> return 0;<reverse:0> \ ' ... Tested on x86_64-linux.