aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2023-05-26[gdb/testsuite] Add test-case gdb.tui/color-prompt.expTom de Vries3-3/+88
Add a test-case that sets a prompt with color in TUI. The line containing the prompt is shown by get_line_with_attrs as follows: ... <fg:31>(gdb) <fg:default> ... The 31 means red, but only for foreground colors, for background colors 41 means red. Make this more readable by using color names for both foreground and background, such that we have instead: .... <fg:red>(gdb) <fg:default> ... Tested on x86_64-linux.
2023-05-26[gdb/testsuite] Add invisible and blinking attributes in tuitermTom de Vries2-0/+22
I noticed curses using the invisible and blinking attributes. Add these in tuiterm. Tested on x86_64-linux.
2023-05-26[gdb/testsuite] Fix reverse attribute in tuitermTom de Vries2-1/+37
I noticed in proc Term::_csi_m arguments that while parameters 7 and 27 are supposed to set the reverse attribute to 1 and 0, in fact it's set to 1 in both cases: ... 7 { set _attrs(reverse) 1 } ... 27 { set _attrs(reverse) 1 } ... Fix this and add a regression test in gdb.tui/tuiterm.exp. Tested on x86_64-linux.
2023-05-25Make MI commands const-correctTom Tromey16-187/+250
I've had this patch for a while now and figured I'd update it and send it. It changes MI commands to use a "const char * const" for their argv parameter. Regression tested on x86-64 Fedora 36. Acked-By: Simon Marchi <simon.marchi@efficios.com>
2023-05-25Fix scoped_value_mark not working with empty value chainCiaran Woodward1-2/+3
The scoped_value_mark helper class was setting its internal mark value to NULL to indicate that the value chain had already been freed to mark. However, value_mark() also returns NULL if the value chain is empty at the time of call. This lead to the situation that if the value chain was empty at the time the scoped_value_mark was created, the class would not correctly clean up the state when it was destroyed, because it believed it had already been freed. I noticed this because I was setting a watchpoint very early in my debug session, and it was becoming a software watchpoint rather than hardware. Running any command that called evaluate() beforehand (such as 'x 0') would mean that a hardware watchpoint was correctly used. After some careful examination of the differences in execution, I noticed that values were being freed later in the 'bad case', which lead me to notice the issue with scoped_value_mark.
2023-05-25gdb: remove breakpoint_pointer_iteratorSimon Marchi11-366/+360
Remove the breakpoint_pointer_iterator layer. Adjust all users of all_breakpoints and all_tracepoints to use references instead of pointers. Change-Id: I376826f812117cee1e6b199c384a10376973af5d Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-25gdb: link breakpoints with intrusive_listSimon Marchi2-31/+18
Change-Id: I043d8d6f3dd864d80d5088f6ffc2c098337249ea Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-25gdb: remove bp_location_pointer_iteratorSimon Marchi10-181/+172
Remove the bp_location_pointer_iterator layer. Adjust all users of breakpoint::locations to use references instead of pointers. Change-Id: Iceed34f5e0f5790a9cf44736aa658be6d1ba1afa Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-25gdb: use intrusive_list for breakpoint locationsSimon Marchi3-150/+172
Replace the hand-maintained linked lists of breakpoint locations with and intrusive list. - Remove breakpoint::loc, add breakpoint::m_locations. - Add methods for the various manipulations that need to be done on the location list, while maintaining reasonably good encapsulation. - bp_location currently has a default constructor because of one use in hoist_existing_locations. hoist_existing_locations now returns a bp_location_list, and doesn't need the default-constructor bp_location anymore, so remove the bp_location default constructor. - I needed to add a call to clear_locations in delete_breakpoint to avoid a use-after-free. - Add a breakpoint::last_loc method, for use in set_breakpoint_condition. bp_location_range uses reference_to_pointer_iterator, so that all existing callers of breakpoint::locations don't need to change right now. It will be removed in the next patch. The rest of the changes are to adapt the call sites to use the new methods, of breakpoint::locations, rather than breakpoint::loc directly. Change-Id: I25f7ee3d66a4e914a0540589ac414b3b820b6e70 Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-25gdb: add breakpoint::first_loc methodsSimon Marchi9-69/+82
Add convenience first_loc methods to struct breakpoint (const and non-const overloads). A subsequent patch changes the list of locations to be an intrusive_list and makes the actual list private, so these spots would need to change from: b->loc to something ugly like: *b->locations ().begin () That would make the code much heavier and not readable. There is a surprisingly big number of places that access the first location of breakpoints. Whether this is correct, or these spots fail to consider the possibility of multi-location breakpoints, I don't know. But anyhow, I think that using this instead: b->first_loc () conveys the intention better than the other two forms. Change-Id: Ibbefe3e4ca6cdfe570351fe7e2725f2ce11d1e95 Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-25gdb: add breakpoint "has locations" methodsSimon Marchi8-37/+53
Add three convenience methods to struct breakpoint: - has_locations: returns true if the breakpoint has at least one location - has_single_location: returns true if the breakpoint has exactly one location - has_multiple_locations: returns true if the breakpoint has more than one location A subsequent patch changes the list of breakpoints to be an intrusive_list, so all these spots would need to change. But in any case, I think that this: if (b->has_multiple_locations ()) conveys the intention better than: if (b->loc != nullptr && b->loc->next != nullptr) Change-Id: Ib18c3605fd35d425ef9df82cb7aacff1606c6747 Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-25gdb: constify breakpoint::print_it parameterSimon Marchi9-23/+21
The print_it method itself is const. In a subsequent patch, the locations that come out of a const breakpoint will be const as well. It will therefore be needed to make the last_loc output parameter const as well. Make that change now to reduce the size of the following patches. Change-Id: I7ed962950bc9582646e31e2e42beca2a1c9c5105 Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-25gdb: make some breakpoint methods use `this`Simon Marchi4-29/+19
Some implementations of breakpoint::check_status and breakpoint::print_it do this: struct breakpoint *b = bs->breakpoint_at; bs->breakpoint_at is always the same as `this` (we can get convinced by looking at the call sites of check_status and print_it), so it would just be clearer to access fields through `this` instead. Change-Id: Ic542a64fcd88e31ae2aad6feff1da278c7086891 Reviewed-By: Alexandra Petlanova Hajkova <ahajkova@redhat.com> Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-25gdb: get gdbarch from syscall_catchpoint instead of locationSimon Marchi1-6/+0
I noticed some methods of syscall_catchpoint doing this: struct gdbarch *gdbarch = loc->owner->gdbarch; `loc` is the list of locations of this catchpoint. Logically, the owner the locations are this catchpoint. So this just ends up getting this->gdbarch. Remove the unnecessary indirection through the loc. syscall_catchpoint::print_recreate does something slightly different, getting its arch from the loc: struct gdbarch *gdbarch = loc->gdbarch; I suppose it's always going to be the same arch, so get it from the catchpoint there too. Change-Id: I6f6a6f8e0cd7cfb754cecfb6249e71ec12ba4855 Reviewed-By: Alexandra Petlanova Hajkova <ahajkova@redhat.com> Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-24gdbsupport: add support for references to checked_static_castSimon Marchi1-9/+19
Add a checked_static_cast overload that works with references. A bad dynamic cast with references throws std::bad_cast, it would be possible to implement the new overload based on that, but it seemed simpler to just piggy back off the existing function. I found some potential uses of this new overload in amd-dbgapi-target.c, update them to illustrate the use of the new overload. To build amd-dbgapi-target.c, on needs the amd-dbgapi library, which I don't expect many people to have. But I have it, and it builds fine here. I did test the new overload by making a purposely bad cast and it did catch it. Change-Id: Id6b6a7db09fe3b4aa43cddb60575ff5f46761e96 Reviewed-By: Lancelot SIX <lsix@lancelotsix.com> Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2023-05-24gdb/testsuite: fix race in gdb.server/multi-ui-errors.expAndrew Burgess1-1/+1
After this commit: commit ed32754a8c7919feffc6ddb66ff1c532e4a4d1cd Date: Thu Mar 9 10:45:03 2023 +0100 [gdb/testsuite] Fix gdb.server/multi-ui-errors.exp for remote target I noticed the occasional failure in gdb.server/multi-ui-errors.exp, which looked like this: (gdb) PASS: gdb.server/multi-ui-errors.exp: interact with GDB's main UI interrupt (gdb) Program received signal SIGINT, Interrupt. 0x00007ffff7d501e7 in nanosleep () from /lib64/libc.so.6 FAIL: gdb.server/multi-ui-errors.exp: interrupt (timeout) PASS: gdb.server/multi-ui-errors.exp: interrupt arrived p server_pid $1 = 718174 (gdb) PASS: gdb.server/multi-ui-errors.exp: p server_pid This is triggered by this code in gdb.server/multi-ui-errors.exp: gdb_test "interrupt" gdb_test_multiple "" "interrupt arrived" { -re "Program received signal SIGINT, Interrupt\\.\r\n" { pass $gdb_test_name } } The problem here is that the first interrupt will trigger the prompt to be printed, and then, after some time the inferior will be interrupted. However the default pattern for gdb_test includes a '$' end anchor. If expect sees the prompt with nothing following it then everything is fine, and the test passes. However, if the interrupt is quick and so what expect sees is this: (gdb) Program received signal SIGINT, Interrupt. 0x00007ffff7d501e7 in nanosleep () from /lib64/libc.so.6 In this case the end anchor means that the gdb_test fails to match, and eventually times out. Fix this by passing -no-prompt-anchor to gdb_test. Reviewed-By: Tom de Vries <tdevries@suse.de>
2023-05-24gdb, infcmd: Support jump command with same line in multiple symtabsMatti Puputti6-2/+154
If a header file defining a static function is included in multiple source files, each calling the function, and GDB is asked to jump to a line inside that function, there would be multiple locations matching the target. The solution in this commit is to select the location in the current symtab. Reviewed-By: Eli Zaretskii <eliz@gnu.org> Approved-By: Andrew Burgess <aburgess@redhat.com>
2023-05-24Add "args" and "env" parameters to DAP launch requestTom Tromey5-12/+178
This patch augments the DAP launch request with some optional new parameters that let the client control the command-line arguments and the environment of the inferior. Reviewed-By: Andrew Burgess <aburgess@redhat.com> Reviewed-By: Eli Zaretskii <eliz@gnu.org>
2023-05-24Add attributes and methods to gdb.InferiorTom Tromey5-0/+263
This adds two new attributes and three new methods to gdb.Inferior. The attributes let Python code see the command-line arguments and the name of "main". Argument setting is also supported. The methods let Python code manipulate the inferior's environment variables. Reviewed-By: Eli Zaretskii <eliz@gnu.org>
2023-05-23Handle DAP evaluate request without a frame IDTom Tromey3-1/+89
DAP specifies that if an evaluate request does not have a frameID parameter, then the expression is evaluated in the global scope.
2023-05-23Add global_context parameter to gdb.parse_and_evalTom Tromey5-7/+40
This adds a 'global_context' parse_and_eval to gdb.parse_and_eval. This lets users request a parse that is done at "global scope". I considered letting callers pass in a block instead, with None meaning "global" -- but then there didn't seem to be a clean way to express the default for this parameter. Reviewed-By: Eli Zaretskii <eliz@gnu.org>
2023-05-23Add flags to parse_and_evalTom Tromey2-3/+3
This adds a flags parameter to parse_and_eval.
2023-05-23Add PARSER_LEAVE_BLOCK_ALONE flagTom Tromey2-16/+27
This adds a PARSER_LEAVE_BLOCK_ALONE flag, and changes the parse API to respect it. This flag lets callers avoid any change to the passed-in block and expression PC, letting them specify the context exactly. In particular, now nullptr can be used to indicate that the parse should not examine any local variables.
2023-05-23Add PARSER_DEBUG flagTom Tromey8-9/+16
This adds a new PARSER_DEBUG constant and changes the parser code to use it. This lets us make the 'parser_debug' global 'static'.
2023-05-23Rearrange parser_stateTom Tromey1-9/+8
This patch mildly rearranges parser_state, moving all the bool fields together.
2023-05-23Boolify parser_state::comma_terminatesTom Tromey1-1/+1
parser_state::comma_terminates ought to be boolean, and changing it does not require any other changes.
2023-05-23Simplify parser_state constructorTom Tromey3-11/+7
This simplifies the parser_state constructor by having it accept a parser_flags parameter.
2023-05-23Introduce and use parser flagsTom Tromey7-26/+48
This patch adds a new parser_flags type and changes the parser APIs to use it rather than a collection of 'int' and 'bool'. More flags will be added in subsquent patches.
2023-05-23Move innermost_block_tracker to expression.hTom Tromey2-45/+44
I think parser-defs.h should hold declarations that can be used by parser implementations, whereas expression.h should hold declarations that are used by code that wants to call a parser. Following this logic, this patch moves innermost_block_tracker to expression.h.
2023-05-23Avoid forward declaration in parse.cTom Tromey1-24/+18
This minorly rearranges parse.c to avoid the need for a forward declaration.
2023-05-23Implement DAP loadedSources requestTom Tromey4-0/+45
This implements the DAP loadedSources request, using gdb.execute_mi to avoid having to write another custom Python API.
2023-05-23Implement gdb.execute_miTom Tromey10-0/+419
This adds a new Python function, gdb.execute_mi, that can be used to invoke an MI command but get the output as a Python object, rather than a string. This is done by implementing a new ui_out subclass that builds a Python object. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=11688 Reviewed-By: Eli Zaretskii <eliz@gnu.org>
2023-05-23Add second mi_parse constructorTom Tromey2-2/+107
This adds a second mi_parse constructor. This constructor takes a command name and vector of arguments, and does not do any escape processing. This also changes mi_parse::args to handle parse objects created this new way.
2023-05-23Introduce mi_parse helper methodsTom Tromey2-17/+61
This introduces some helper methods for mi_parse that handle some of the details of parsing. This approach lets us reuse them later.
2023-05-23Introduce "static constructor" for mi_parseTom Tromey3-19/+17
Change the mi_parse function to be a static method of mi_parse. This lets us remove the 'set_args' setter function.
2023-05-23Change mi_parse_argv to a methodTom Tromey4-10/+9
This changes mi_parse_argv to be a method of mi_parse. This is just a minor cleanup.
2023-05-23Use accessor for mi_parse::argsTom Tromey5-9/+20
This changes mi_parse::args to be a private member, retrieved via accessor. It also changes this member to be a std::string. This makes it simpler for a subsequent patch to implement different behavior for argument parsing.
2023-05-23Use member initializers in mi_parseTom Tromey2-31/+14
This changes mi_parse to use member initializers rather than a constructor. This is easier to follow.
2023-05-23Use field_signed from Python MI commandsTom Tromey2-0/+17
If an MI command written in Python includes a number in its output, currently that is simply emitted as a string. However, it's convenient for a later patch if these are emitted using field_signed. This does not make a difference to ordinary MI clients.
2023-05-23gdb/cli-out.c: clear_current_line shouldn't trigger pagination promptAaron Merey2-5/+8
clear_current_line overwrites the current line with chars_per_line blank spaces. Printing the final space triggers a condition in pager_file::puts that causes lines_printed to be incremented. If lines_printed becomes greater than or equal to lines_allowed, the pagination prompt will appear if enabled. In this case the prompt is unnecessary since after printing the final space clear_current_line immediately moves the cursor to the beginning of the line with '\r'. A new line isn't actually started, so the prompt ends up being spurious. Additionally it's possible for gdb to crash during this pagination prompt. Answering the prompt with 'q' throws an exception intended to bring gdb back to the main event loop. But since commit 0fea10f32746, clear_current_line may be called under the progress_update destructor. The exception will try to propagate through the destructor, causing an abort. To fix this, pagination is disabled for the duration for clear_current_line. clear_current_line is also renamed to clear_progress_notify to help indicate that it is a special purpose function intended for use with do_progress_notify. Acked-by: Eli Zaretskii <eliz@gnu.org>
2023-05-23gdb/testsuite: change hardcoded assembly in gdb.arch/disp-step-insn-reloc.expBruno Larsen1-4/+2
When testing gdb.arch/disp-step-insn-reloc.exp with clang in an x86_64 machine, the compiled test case would segfault when returning from the function can_relocate_call, with a suggestion of a broken stack. The example assembly in the commment was the following: f: MOV $1, %[ok] JMP end set_point0: CALL f ; tracepoint here. end: And the segmentation fault happening at the final "ret" instruction of can_relocate_call. Looking at the disassembled version of the later half of the important function, we see: Clang version (f starting at 11a4): 00000000000011ae <set_point0>: 11ae: e8 f1 ff ff ff callq 11a4 <can_relocate_call+0x14> 11b3: 89 45 fc mov %eax,-0x4(%rbp) 11b6: 83 7d fc 01 cmpl $0x1,-0x4(%rbp) 11ba: 0f 85 0a 00 00 00 jne 11ca <set_point0+0x1c> 11c0: e8 5b 00 00 00 callq 1220 <pass> 11c5: e9 05 00 00 00 jmpq 11cf <set_point0+0x21> 11ca: e8 61 00 00 00 callq 1230 <fail> 11cf: 48 83 c4 10 add $0x10,%rsp 11d3: 5d pop %rbp 11d4: c3 retq 11d5: 66 66 2e 0f 1f 84 00 data16 nopw %cs:0x0(%rax,%rax,1) 11dc: 00 00 00 00 gcc version (f starting at 401125): 000000000040112c <set_point0>: 40112c: e8 f4 ff ff ff callq 401125 <can_relocate_call+0x11> 401131: 89 45 fc mov %eax,-0x4(%rbp) 401134: 83 7d fc 01 cmpl $0x1,-0x4(%rbp) 401138: 75 07 jne 401141 <set_point0+0x15> 40113a: e8 c7 ff ff ff callq 401106 <pass> 40113f: eb 05 jmp 401146 <set_point0+0x1a> 401141: e8 c7 ff ff ff callq 40110d <fail> 401146: 90 nop 401147: c9 leaveq 401148: c3 retq The epilogue of set_point0 (11cf for clang, 401146 for gcc) is the main difference: GCC's version uses the leaveq instruction, which resets rsp based on rbp, while clang adds the same constant to rsp that it subtracted in the prologue. Clang fails because the return address that is added by the "call f" instruction isn't accounted for. This commit fixes that by adding a return instruction to f, which leaves the rsp as the compilers would expect. Approved-By: Andrew Burgess <aburgess@redhat.com>
2023-05-22[gdb/tui] Fix buglet in tui_update_variablesTom de Vries1-2/+3
I noticed a buglet in tui_update_variables: ... entry = translate (tui_border_kind, tui_border_kind_translate_lrcorner); if (tui_border_lrcorner != (chtype) entry->value) { tui_border_lrcorner = (entry->value < 0) ? ACS_LRCORNER : entry->value; ... When assigning the new value to tui_border_lrcorner, an entry->value of -1 is taken into account, but not when comparing to the current value of tui_border_lrcorner. Fix this by introducing: ... int val = (entry->value < 0) ? ACS_LRCORNER : entry->value; ... and using this in both comparison and assignment. Tested on x86_64-linux.
2023-05-22Remove some FIXME comments from DAPTom Tromey4-7/+0
I recently added a 'dap' component to bugzilla, and I filed a few bugs there. This patch removes the corresponding FIXME comments. A few such comments still exist. In at least one case, I have a fix I'll be submitting eventually; in others I think I need to do a bit of investigation to properly file a bug report.
2023-05-22gdb: add Richard Bunt to gdb/MAINTAINERSRichard Bunt1-0/+1
2023-05-22[gdb/testsuite] Add Term::get_line_with_attrsTom de Vries2-7/+59
Add a new proc Term::get_line_with_attrs, similar to Term::get_line, that annotates a tuiterm line with the active attributes. For instance, the line representing the TUI status window with attribute mode standout looks like this with Term::get_line: ... exec No process In: ... L?? PC: ?? ... but like this with Term::get_line_with_attrs: ... <reverse:1>exec No process In: ... L?? PC: ?? <reverse:0> ... Also add Term::dump_screen_with_attrs, a Term::dump_screen variant that uses Term::get_line_with_attrs instead of Term::get_line. Tested by re-running the TUI test-cases (gdb.tui/*.exp and gdb.python/tui*.exp) on x86_64-linux.
2023-05-22[gdb/testsuite] Factor out Term::_reset_attrsTom de Vries1-12/+14
Factor out new proc Term::_reset_attrs. Tested by re-running the TUI test-cases (gdb.tui/*.exp and gdb.python/tui*.exp) on x86_64-linux.
2023-05-19Update documentation for Python Frame.older and Frame.newerTom Tromey2-3/+5
I noticed that Frame.older and Frame.newer don't document that they return None at the ends of the stack. This patch updates the documentation, and also fixes a somewhat related typo in a comment that I noticed while digging into this. Approved-By: Eli Zaretskii <eliz@gnu.org>
2023-05-19gdb: fix post-hook execution for remote targetsJan Vrany1-1/+3
Commit b5661ff2 ("gdb: fix possible use-after-free when executing commands") attempted to fix possible use-after-free in case command redefines itself. Commit 37e5833d ("gdb: fix command lookup in execute_command ()") updated the previous fix to handle subcommands as well by using the original command string to lookup the command again after its execution. This fixed the test in gdb.base/define.exp but it turned out that it does not work (at least) for "target remote" and "target extended-remote". The problem is that the command buffer P passed to execute_command () gets overwritten in dont_repeat () while executing "target remote" command itself: #0 dont_repeat () at top.c:822 #1 0x000055555730982a in target_preopen (from_tty=1) at target.c:2483 #2 0x000055555711e911 in remote_target::open_1 (name=0x55555881c7fe ":1234", from_tty=1, extended_p=0) at remote.c:5946 #3 0x000055555711d577 in remote_target::open (name=0x55555881c7fe ":1234", from_tty=1) at remote.c:5272 #4 0x00005555573062f2 in open_target (args=0x55555881c7fe ":1234", from_tty=1, command=0x5555589d0490) at target.c:853 #5 0x0000555556ad22fa in cmd_func (cmd=0x5555589d0490, args=0x55555881c7fe ":1234", from_tty=1) at cli/cli-decode.c:2737 #6 0x00005555573487fd in execute_command (p=0x55555881c802 "4", from_tty=1) at top.c:688 Therefore the second call to lookup_cmd () at line 697 fails to find command because the original command string is gone. This commit addresses this particular problem by creating a *copy* of original command string for the sole purpose of using it after command execution to lookup the command again. It may not be the most efficient way but it's safer given that command buffer is shared and overwritten in hard-to-foresee situations. Tested on x86_64-linux. PR 30249 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30249 Approved-By: Tom Tromey <tom@tromey.com>
2023-05-19gdb: Remove redundant frame switchingRichard Bunt2-6/+12
547ce8f00b fixed an issue where dynamic types were not being resolved correctly prior to printing a value. The same issue was discovered when printing the value using mi-mode, which was not covered by the fix. Porting the fix to the mi-mode code path resolved the issue. However, it was discovered that a later patch series, ending 2fc3b8a4cb8, independently fixed the issue in both the cli- and mi-mode code paths, making the original fix unneeded. This commit removes this extra frame switch and adds test coverage for the mi-mode scenario to protect against any future divergence in this area. GDB built with GCC 11. No test suite regressions detected. Compilers: GCC 12.1.0, ACfL 22.1, Intel 22.1; Platforms: x86_64, aarch64. Approved-By: Tom Tromey <tom@tromey.com>
2023-05-19gdb: safety checks in skip_prologue_using_salAndrew Burgess1-3/+5
While working on the previous patch I reverted this commit: commit e86e87f77fd5d8afb3e714f1d9e09e0ff5b4e6ff Date: Tue Nov 28 16:23:32 2006 +0000 * symtab.c (find_pc_sect_line): Do not return a line before the start of a symtab. When I re-ran the testsuite I saw some GDB crashes in the tests: gdb.dwarf2/dw2-line-number-zero.exp gdb.dwarf2/dw2-lines.exp gdb.dwarf2/dw2-vendor-extended-opcode.exp GDB was reading beyond the end of an array in the function skip_prologue_using_sal. Now, without the above commit reverted I don't believe that this should ever happen. Reverting the above commit effectively breaks GDB's symtab_and_line lookup, we try to find a result for an address, and return the wrong symtab and line-table. In skip_prologue_using_sal we then walk the line table looking for an appropriate entry, except we never find one, and GDB just keeps going, wandering off the end of the array. However, I think adding extra protection to prevent walking off the end of the array is pretty cheap, and if something does go wrong in the future then this should prevent a random crash. Obviously, I have no reproducer for this, as I said, I don't think this should impact GDB at all, this is just adding a little extra caution. Reviewed-By: Tom Tromey <tom@tromey.com>