2016-01-01 05:33:14 +01:00
# Copyright 1988-2016 Free Software Foundation, Inc.
2004-01-12 18:20:41 +01:00
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
2007-08-23 20:14:19 +02:00
# the Free Software Foundation; either version 3 of the License, or
2004-01-12 18:20:41 +01:00
# (at your option) any later version.
2007-08-23 20:14:19 +02:00
#
2004-01-12 18:20:41 +01:00
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
2007-08-23 20:14:19 +02:00
#
2004-01-12 18:20:41 +01:00
# You should have received a copy of the GNU General Public License
2007-08-23 20:14:19 +02:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2004-01-12 18:20:41 +01:00
# Based on break.exp, written by Rob Savoye. (rob@cygnus.com)
# Modified to test gdb's handling of separate debug info files.
2007-09-01 10:16:16 +02:00
# Modified to test gdb's handling of a debug-id retrieval.
2004-01-12 18:20:41 +01:00
# This file has two parts. The first is testing that gdb behaves
# normally after reading in an executable and its corresponding
# separate debug file. The second moves the .debug file to a different
# location and tests the "set debug-file-directory" command.
2007-09-01 10:16:16 +02:00
# The third is for testing build-id retrievel by finding the separate
# ".debug-id/ab/cdef.debug" file.
2004-01-12 18:20:41 +01:00
#
# test running programs
#
2013-08-23 20:18:01 +02:00
standard_testfile .c
2004-01-12 18:20:41 +01:00
2006-03-07 16:23:33 +01:00
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
2006-08-10 07:27:22 +02:00
untested sepdebug.exp
return -1
2004-01-12 18:20:41 +01:00
}
# Note: the procedure gdb_gnu_strip_debug will produce an executable called
# ${binfile}, which is just like the executable ($binfile) but without
2012-01-18 19:58:43 +01:00
# the debuginfo. Instead $binfile has a .gnu_debuglink section which contains
2004-01-14 16:09:37 +01:00
# the name of a debuginfo only file. This file will be stored in the
2010-05-02 11:08:59 +02:00
# gdb.base/ subdirectory.
2004-01-12 18:20:41 +01:00
2015-04-07 21:49:08 +02:00
if [gdb_gnu_strip_debug $binfile$EXEEXT] {
2004-01-14 16:09:37 +01:00
# check that you have a recent version of strip and objcopy installed
unsupported "cannot produce separate debug info files"
2004-01-12 18:20:41 +01:00
return -1
}
2012-01-18 19:58:43 +01:00
#
# PR gdb/9538. Verify that symlinked executable still finds the separate
# debuginfo.
#
2013-08-23 20:18:01 +02:00
set old_subdir $subdir
set subdir [file join ${old_subdir} pr9538]
2012-01-18 19:58:43 +01:00
# Cleanup any stale state.
2013-08-23 20:18:01 +02:00
set new_name [standard_output_file ${testfile}${EXEEXT}]
remote_exec build "rm -rf [file dirname $new_name]"
2012-01-18 19:58:43 +01:00
2013-08-23 20:18:01 +02:00
remote_exec build "mkdir [file dirname $new_name]"
2015-04-07 21:49:08 +02:00
remote_exec build "ln -s ${binfile}${EXEEXT} $new_name"
2012-01-18 19:58:43 +01:00
clean_restart ${testfile}${EXEEXT}
if { $gdb_file_cmd_debug_info != "debug" } then {
fail "No debug information found."
}
# Restore subdir
set subdir ${old_subdir}
clean_restart ${testfile}${EXEEXT}
2009-10-13 09:57:28 +02:00
if { $gdb_file_cmd_debug_info != "debug" } then {
fail "No debug information found."
}
2004-01-12 18:20:41 +01:00
#
# test simple breakpoint setting commands
#
#
# test break at function
#
gdb_test "break main" \
"Breakpoint.*at.* file .*$srcfile, line.*" \
"breakpoint function"
#
# test break at quoted function
#
gdb_test "break \"marker2\"" \
"Breakpoint.*at.* file .*$srcfile, line.*" \
"breakpoint quoted function"
#
# test break at function in file
#
gdb_test "break $srcfile:factorial" \
"Breakpoint.*at.* file .*$srcfile, line.*" \
"breakpoint function in file"
set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
#
# test break at line number
#
# Note that the default source file is the last one whose source text
# was printed. For native debugging, before we've executed the
# program, this is the file containing main, but for remote debugging,
# it's wherever the processor was stopped when we connected to the
# board. So, to be sure, we do a list command.
#
gdb_test "list main" \
2014-10-23 13:02:31 +02:00
".*main \\(int argc, char \\*\\*argv, char \\*\\*envp\\).*" \
2004-01-12 18:20:41 +01:00
"use `list' to establish default source file"
gdb_test "break $bp_location1" \
"Breakpoint.*at.* file .*$srcfile, line $bp_location1\\." \
"breakpoint line number"
#
# test duplicate breakpoint
#
gdb_test "break $bp_location1" \
"Note: breakpoint \[0-9\]+ also set at pc.*Breakpoint \[0-9\]+ at.* file .*$srcfile, line $bp_location1\\." \
"breakpoint duplicate"
set bp_location2 [gdb_get_line_number "set breakpoint 2 here"]
#
# test break at line number in file
#
gdb_test "break $srcfile:$bp_location2" \
"Breakpoint.*at.* file .*$srcfile, line $bp_location2\\." \
"breakpoint line number in file"
set bp_location3 [gdb_get_line_number "set breakpoint 3 here"]
set bp_location4 [gdb_get_line_number "set breakpoint 4 here"]
#
# Test putting a break at the start of a multi-line if conditional.
# Verify the breakpoint was put at the start of the conditional.
#
gdb_test "break multi_line_if_conditional" \
"Breakpoint.*at.* file .*$srcfile, line $bp_location3\\." \
"breakpoint at start of multi line if conditional"
gdb_test "break multi_line_while_conditional" \
"Breakpoint.*at.* file .*$srcfile, line $bp_location4\\." \
"breakpoint at start of multi line while conditional"
set bp_location6 [gdb_get_line_number "set breakpoint 6 here"]
2011-12-13 18:22:11 +01:00
set main_line $bp_location6
2004-01-12 18:20:41 +01:00
set bp_location7 [gdb_get_line_number "set breakpoint 7 here"]
set bp_location8 [gdb_get_line_number "set breakpoint 8 here"]
gdb_test "info break" \
2008-02-26 09:14:11 +01:00
"Num Type\[ \]+Disp Enb Address\[ \]+What.*
2004-01-12 18:20:41 +01:00
\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$main_line.*
2014-10-23 13:02:31 +02:00
\[0-9\]+\[\t \]+breakpoint keep y.* in marker2 at .*$srcfile:$bp_location8.*
2004-01-12 18:20:41 +01:00
\[0-9\]+\[\t \]+breakpoint keep y.* in factorial at .*$srcfile:$bp_location7.*
\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$bp_location1.*
\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$bp_location1.*
\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$bp_location2.*
\[0-9\]+\[\t \]+breakpoint keep y.* in multi_line_if_conditional at .*$srcfile:$bp_location3.*
\[0-9\]+\[\t \]+breakpoint keep y.* in multi_line_while_conditional at .*$srcfile:$bp_location4" \
"breakpoint info"
# FIXME: The rest of this test doesn't work with anything that can't
# handle arguments.
# Huh? There doesn't *appear* to be anything that passes arguments
# below.
#
# run until the breakpoint at main is hit. For non-stubs-using targets.
#
2007-03-27 19:59:38 +02:00
gdb_run_cmd
2014-09-12 23:16:31 +02:00
gdb_test "" \
"Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*" \
"run until function breakpoint"
2004-01-12 18:20:41 +01:00
#
# run until the breakpoint at a line number
#
gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location1.*$bp_location1\[\t \]+printf.*factorial.*" \
"run until breakpoint set at a line number"
#
# Run until the breakpoint set in a function in a file
#
for {set i 6} {$i >= 1} {incr i -1} {
gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, factorial \\(value=$i\\) at .*$srcfile:$bp_location7.*$bp_location7\[\t \]+.*if .value > 1. \{.*" \
"run until file:function($i) breakpoint"
}
#
# Run until the breakpoint set at a quoted function
#
2014-10-23 13:02:31 +02:00
gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, (0x\[0-9a-f\]+ in )?marker2 \\(a=43\\) at .*$srcfile:$bp_location8.*" \
2004-01-12 18:20:41 +01:00
"run until quoted breakpoint"
#
# run until the file:function breakpoint at a line number in a file
#
gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location2.*$bp_location2\[\t \]+argc = \\(argc == 12345\\);.*" \
"run until file:linenum breakpoint"
# Test break at offset +1
set bp_location10 [gdb_get_line_number "set breakpoint 10 here"]
gdb_test "break +1" \
"Breakpoint.*at.* file .*$srcfile, line $bp_location10\\." \
"breakpoint offset +1"
# Check to see if breakpoint is hit when stepped onto
gdb_test "step" \
".*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location10.*$bp_location10\[\t \]+return argc;.*breakpoint 10 here.*" \
"step onto breakpoint"
#
# delete all breakpoints so we can start over, course this can be a test too
#
delete_breakpoints
#
# test temporary breakpoint at function
#
2008-04-15 16:33:55 +02:00
gdb_test "tbreak main" "Temporary breakpoint.*at.* file .*$srcfile, line.*" "Temporary breakpoint function"
2004-01-12 18:20:41 +01:00
#
# test break at function in file
#
2008-04-15 16:33:55 +02:00
gdb_test "tbreak $srcfile:factorial" "Temporary breakpoint.*at.* file .*$srcfile, line.*" \
2004-01-12 18:20:41 +01:00
"Temporary breakpoint function in file"
#
# test break at line number
#
2010-05-28 01:44:51 +02:00
gdb_test "tbreak $bp_location1" \
"Temporary breakpoint.*at.* file .*$srcfile, line $bp_location1.*" \
"Temporary breakpoint line number #1"
gdb_test "tbreak $bp_location6" \
"Temporary breakpoint.*at.* file .*$srcfile, line $bp_location6.*" \
"Temporary breakpoint line number #2"
2004-01-12 18:20:41 +01:00
#
# test break at line number in file
#
2010-05-28 01:44:51 +02:00
gdb_test "tbreak $srcfile:$bp_location2" \
"Temporary breakpoint.*at.* file .*$srcfile, line $bp_location2.*" \
"Temporary breakpoint line number in file #1"
2004-01-12 18:20:41 +01:00
set bp_location11 [gdb_get_line_number "set breakpoint 11 here"]
2008-04-15 16:33:55 +02:00
gdb_test "tbreak $srcfile:$bp_location11" "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location11.*" "Temporary breakpoint line number in file #2"
2004-01-12 18:20:41 +01:00
#
# check to see what breakpoints are set (temporary this time)
#
2008-02-26 09:14:11 +01:00
gdb_test "info break" "Num Type.*Disp Enb Address.*What.*\[\r\n\]
2004-01-12 18:20:41 +01:00
\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$main_line.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint del.*y.*in factorial at .*$srcfile:$bp_location7.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$bp_location1.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$bp_location6.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$bp_location2.*\[\r\n\]
\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$bp_location11.*" \
"Temporary breakpoint info"
#***********
# Verify that catchpoints for fork, vfork and exec don't trigger
# inappropriately. (There are no calls to those system functions
# in this test program.)
#
2010-05-28 01:44:51 +02:00
if ![runto_main] then { fail "sepdebug tests suppressed" }
2004-01-12 18:20:41 +01:00
2010-05-28 01:44:51 +02:00
gdb_test "catch" "Catch requires an event name.*" \
"catch requires an event name"
2004-01-12 18:20:41 +01:00
2015-12-21 20:38:51 +01:00
gdb_test "catch fork" "Catchpoint \[0-9\]+ \\(fork\\)" \
"set catch fork, never expected to trigger"
2004-01-12 18:20:41 +01:00
2015-12-21 20:38:51 +01:00
gdb_test "catch vfork" "Catchpoint \[0-9\]+ \\(vfork\\)" \
"set catch vfork, never expected to trigger"
2004-01-12 18:20:41 +01:00
2015-12-21 20:38:51 +01:00
gdb_test "catch exec" "Catchpoint \[0-9\]+ \\(exec\\)" \
"set catch exec, never expected to trigger"
2004-01-12 18:20:41 +01:00
# Verify that GDB responds gracefully when asked to set a breakpoint
# on a nonexistent source line.
#
2010-05-28 01:44:51 +02:00
the "ambiguous linespec" series
gdb
2011-12-06 Joel Brobecker <brobecker@acacore.com>
* language.h (struct language_defn): Add new component
la_symbol_name_compare.
* symfile.h (struct quick_symbol_functions): Update the profile
of parameter "name_matcher" for the expand_symtabs_matching
method. Update the documentation accordingly.
* ada-lang.h (ada_name_for_lookup): Add declaration.
* ada-lang.c (ada_name_for_lookup): New function, extracted out
from ada_iterate_over_symbols.
(ada_iterate_over_symbols): Do not encode symbol name anymore.
(ada_expand_partial_symbol_name): Adjust profile.
(ada_language_defn): Add value for la_symbol_name_compare field.
* linespec.c: #include "ada-lang.h".
(iterate_name_matcher): Add language parameter. Replace call
to strcmp_iw by call to language->la_symbol_name_compare.
(decode_variable): Encode COPY if current language is Ada.
* dwarf2read.c (dw2_expand_symtabs_matching): Adjust profile
of name_matcher parameter. Adjust call to name_matcher.
* psymtab.c (expand_symtabs_matching_via_partial): Likewise.
(expand_partial_symbol_names): Update profile of parameter "fun".
* psymtab.h (expand_partial_symbol_names): Update profile of
parameter "fun".
* symtab.c (demangle_for_lookup): Update function documentation.
(search_symbols_name_matches): Add language parameter.
(expand_partial_symbol_name): Likewise.
* c-lang.c (c_language_defn, cplus_language_defn)
(asm_language_defn, minimal_language_defn): Add value for
la_symbol_name_compare field.
* d-lang.c (d_language_defn): Likewise.
* f-lang.c (f_language_defn): Ditto.
* jv-lang.c (java_language_defn): Ditto.
* m2-lang.c (m2_language_defn): Ditto.
* objc-lang.c (objc_language_defn): Ditto.
* opencl-lang.c (opencl_language_defn): Ditto.
* p-lang.c (pascal_language_defn): Ditto.
* language.c (unknown_language_defn, auto_language_defn)
(local_language_defn): Ditto.
2011-12-06 Tom Tromey <tromey@redhat.com>
* linespec.c (iterate_over_all_matching_symtabs): Use
LA_ITERATE_OVER_SYMBOLS.
(lookup_prefix_sym, add_matching_symbols_to_info): Likewise.
(find_function_symbols, decode_variable): Remove Ada special
case.
* language.h (struct language_defn) <la_iterate_over_symbols>: New
field.
(LA_ITERATE_OVER_SYMBOLS): New macro.
* language.c (unknown_language_defn, auto_language_defn)
(local_language_defn): Update.
* c-lang.c (c_language_defn, cplus_language_defn)
(asm_language_defn, minimal_language_defn): Update.
* d-lang.c (d_language_defn): Update.
* f-lang.c (f_language_defn): Update.
* jv-lang.c (java_language_defn): Update.
* m2-lang.c (m2_language_defn): Update.
* objc-lang.c (objc_language_defn): Update.
* opencl-lang.c (opencl_language_defn): Update.
* p-lang.c (pascal_language_defn): Update.
* ada-lang.c (ada_iterate_over_symbols): New function.
(ada_language_defn): Update.
2011-12-06 Tom Tromey <tromey@redhat.com>
Joel Brobecker <brobecker@acacore.com>
PR breakpoints/13105, PR objc/8341, PR objc/8343, PR objc/8366,
PR objc/8535, PR breakpoints/11657, PR breakpoints/11970,
PR breakpoints/12023, PR breakpoints/12334, PR breakpoints/12856,
PR shlibs/8929, PR shlibs/7393:
* python/py-type.c (compare_maybe_null_strings): Rename from
compare_strings.
(check_types_equal): Update.
* utils.c (compare_strings): New function.
* tui/tui-winsource.c (tui_update_breakpoint_info): Update for
location changes.
* tracepoint.c (scope_info): Update.
(trace_find_line_command): Use DECODE_LINE_FUNFIRSTLINE.
* symtab.h (iterate_over_minimal_symbols)
(iterate_over_some_symtabs, iterate_over_symtabs)
(find_pcs_for_symtab_line, iterate_over_symbols)
(demangle_for_lookup): Declare.
(expand_line_sal): Remove.
* symtab.c (iterate_over_some_symtabs, iterate_over_symtabs)
(lookup_symtab_callback): New functions.
(lookup_symtab): Rewrite.
(demangle_for_lookup): New function, extract from
lookup_symbol_in_language.
(lookup_symbol_in_language): Use it.
(iterate_over_symbols): New function.
(find_line_symtab): Update.
(find_pcs_for_symtab_line): New functions.
(find_line_common): Add 'start' argument.
(decode_line_spec): Update. Change argument to 'flags', change
interpretation.
(append_expanded_sal): Remove.
(append_exact_match_to_sals): Remove.
(expand_line_sal): Remove.
* symfile.h (struct quick_symbol_functions) <lookup_symtab>:
Remove.
<map_symtabs_matching_filename>: New field.
* stack.c (func_command): Only look in the current program space.
Use DECODE_LINE_FUNFIRSTLINE.
* source.c (line_info): Set pspace on sal. Check program space in
the loop. Use DECODE_LINE_LIST_MODE.
(select_source_symtab): Use DECODE_LINE_FUNFIRSTLINE.
* solib-target.c: Remove DEF_VEC_I(CORE_ADDR).
* python/python.c (gdbpy_decode_line): Update.
* psymtab.c (partial_map_expand_apply): New function.
(partial_map_symtabs_matching_filename): Rename from
lookup_partial_symbol. Update arguments.
(lookup_symtab_via_partial_symtab): Remove.
(psym_functions): Update.
* objc-lang.h (parse_selector, parse_method): Don't declare.
(find_imps): Update.
* objc-lang.c (parse_selector, parse_method): Now static.
(find_methods): Change arguments. Fill in a vector of symbol
names.
(uniquify_strings): New function.
(find_imps): Change arguments.
* minsyms.c (iterate_over_minimal_symbols): New function.
* linespec.h (enum decode_line_flags): New.
(struct linespec_sals): New.
(struct linespec_result) <canonical>: Remove.
<pre_expanded, addr_string, sals>: New fields.
(destroy_linespec_result, make_cleanup_destroy_linespec_result)
(decode_line_full): Declare.
(decode_line_1): Update.
* linespec.c (struct address_entry, struct linespec_state, struct
collect_info): New types.
(add_sal_to_sals_basic, add_sal_to_sals, hash_address_entry)
(eq_address_entry, maybe_add_address): New functions.
(total_number_of_methods): Remove.
(iterate_name_matcher, iterate_over_all_matching_symtabs): New
functions.
(find_methods): Change arguments. Don't canonicalize input.
Simplify logic.
(add_matching_methods, add_constructors)
(build_canonical_line_spec): Remove.
(filter_results, convert_results_to_lsals): New functions.
(decode_line_2): Change arguments. Rewrite for new data
structures.
(decode_line_internal): Rename from decode_line_1. Change
arguments. Add cleanups. Update for new data structures.
(linespec_state_constructor, linespec_state_destructor)
(decode_line_full, decode_line_1): New functions.
(decode_indirect): Change arguments. Update.
(locate_first_half): Use skip_spaces.
(decode_objc): Change arguments. Update for new data structures.
Simplify logic.
(decode_compound): Change arguments. Add cleanups. Remove
fallback code, replace with error.
(struct decode_compound_collector): New type.
(collect_one_symbol): New function.
(lookup_prefix_sym): Change arguments. Update.
(compare_symbol_name, add_all_symbol_names_from_pspace)
(find_superclass_methods ): New functions.
(find_method): Rewrite.
(struct symtab_collector): New type.
(add_symtabs_to_list, collect_symtabs_from_filename): New
functions.
(symtabs_from_filename): Change API. Rename from
symtab_from_filename.
(collect_function_symbols): New function.
(find_function_symbols): Change API. Rename from
find_function_symbol. Rewrite.
(decode_all_digits): Change arguments. Rewrite.
(decode_dollar): Change arguments. Use decode_variable.
(decode_label): Change arguments. Rewrite.
(collect_symbols): New function.
(minsym_found): Change arguments. Rewrite.
(check_minsym, search_minsyms_for_name)
(add_matching_symbols_to_info): New function.
(decode_variable): Change arguments. Iterate over all symbols.
(symbol_found): Remove.
(symbol_to_sal): New function.
(init_linespec_result, destroy_linespec_result)
(cleanup_linespec_result, make_cleanup_destroy_linespec_result):
New functions.
(decode_digits_list_mode, decode_digits_ordinary): New functions.
* dwarf2read.c (dw2_map_expand_apply): New function.
(dw2_map_symtabs_matching_filename): Rename from
dw2_lookup_symtab. Change arguments.
(dwarf2_gdb_index_functions): Update.
* dwarf2loc.c: Remove DEF_VEC_I(CORE_ADDR).
* defs.h (compare_strings): Declare.
* cli/cli-cmds.c (compare_strings): Move to utils.c.
(edit_command, list_command): Use DECODE_LINE_LIST_MODE. Call
filter_sals.
(compare_symtabs, filter_sals): New functions.
* breakpoint.h (struct bp_location) <line_number, source_file>:
New fields.
(struct breakpoint) <line_number, source_file>: Remove.
<filter>: New field.
* breakpoint.c (print_breakpoint_location, init_raw_breakpoint)
(momentary_breakpoint_from_master, add_location_to_breakpoint):
Update for changes to locations.
(init_breakpoint_sal): Add 'filter' argument. Set 'filter' on
breakpoint.
(create_breakpoint_sal): Add 'filter' argument.
(remove_sal, expand_line_sal_maybe): Remove.
(create_breakpoints_sal): Remove 'sals' argument. Handle
pre-expanded sals and the filter.
(parse_breakpoint_sals): Use decode_line_full.
(check_fast_tracepoint_sals): Use get_sal_arch.
(create_breakpoint): Create a linespec_sals. Update.
(break_range_command): Use decode_line_full. Update.
(until_break_command): Update.
(clear_command): Update match conditions for linespec.c changes.
Use DECODE_LINE_LIST_MODE.
(say_where): Update for changes to locations.
(bp_location_dtor): Free 'source_file'.
(base_breakpoint_dtor): Free 'filter'. Don't free 'source_file'.
(update_static_tracepoint): Update for changes to locations.
(update_breakpoint_locations): Disable ranged breakpoint if too
many locations match. Update.
(addr_string_to_sals): Use decode_line_full. Resolve all sal
PCs.
(breakpoint_re_set_default): Don't call expand_line_sal_maybe.
(decode_line_spec_1): Update. Change argument name to 'flags',
change interpretation.
* block.h (block_containing_function): Declare.
* block.c (block_containing_function): New function.
* skip.c (skip_function_command): Update.
(skip_re_set): Update.
* infcmd.c (jump_command): Use DECODE_LINE_FUNFIRSTLINE.
* mi/mi-main.c (mi_cmd_trace_find): Use DECODE_LINE_FUNFIRSTLINE.
* NEWS: Add entry.
2011-12-06 Tom Tromey <tromey@redhat.com>
* elfread.c (elf_gnu_ifunc_resolver_return_stop): Allow
breakpoint's pspace to be NULL.
* breakpoint.h (struct breakpoint) <pspace>: Update comment.
* breakpoint.c (init_raw_breakpoint): Conditionally set
breakpoint's pspace.
(init_breakpoint_sal): Don't set breakpoint's pspace.
(prepare_re_set_context): Conditionally switch program space.
(addr_string_to_sals): Check executing_startup on location's
program space.
2011-12-06 Tom Tromey <tromey@redhat.com>
* breakpoint.h (enum enable_state) <bp_startup_disabled>: Remove.
* breakpoint.c (should_be_inserted): Explicitly check if program
space is executing startup.
(describe_other_breakpoints): Update.
(disable_breakpoints_before_startup): Change executing_startup
earlier. Remove loop.
(enable_breakpoints_after_startup): Likewise.
(init_breakpoint_sal): Don't use bp_startup_disabled.
(create_breakpoint): Don't use bp_startup_disabled.
(update_global_location_list): Use should_be_inserted.
(bkpt_re_set): Update.
gdb/testsuite
2011-12-06 Joel Brobecker <brobecker@acacore.com>
* gdb.ada/fullname_bp.exp: Add tests for other valid linespecs
involving a fully qualified function name.
2011-12-06 Tom Tromey <tromey@redhat.com>
* gdb.ada/homonym.exp: Add three breakpoint tests.
2011-12-06 Tom Tromey <tromey@redhat.com>
* gdb.base/solib-weak.exp (do_test): Remove kfail.
* gdb.trace/tracecmd.exp: Disable pending breakpoints earlier.
* gdb.objc/objcdecode.exp: Update for output changes.
* gdb.linespec/linespec.exp: New file.
* gdb.linespec/lspec.cc: New file.
* gdb.linespec/lspec.h: New file.
* gdb.linespec/body.h: New file.
* gdb.linespec/base/two/thefile.cc: New file.
* gdb.linespec/base/one/thefile.cc: New file.
* gdb.linespec/Makefile.in: New file.
* gdb.cp/templates.exp (test_template_breakpoints): Update for
output changes.
* gdb.cp/re-set-overloaded.exp: Remove kfail.
* gdb.cp/ovldbreak.exp: Update for output changes. "all" test now
makes one breakpoint.
* gdb.cp/method2.exp (test_break): Update for output changes.
* gdb.cp/mb-templates.exp: Update for output changes.
* gdb.cp/mb-inline.exp: Update for output changes.
* gdb.cp/mb-ctor.exp: Update for output changes.
* gdb.cp/ovsrch.exp: Use fully-qualified names.
* gdb.base/solib-symbol.exp: Run to main later. Breakpoint now
has multiple matches.
* gdb.base/sepdebug.exp: Disable pending breakpoints. Update for
error message change.
* gdb.base/list.exp (test_list_filename_and_number): Update for
error message change.
* gdb.base/break.exp: Disable pending breakpoints. Update for
output changes.
* configure.ac: Add gdb.linespec.
* configure: Rebuild.
* Makefile.in (ALL_SUBDIRS): Add gdb.linespec.
gdb/doc
2011-12-06 Tom Tromey <tromey@redhat.com>
* gdb.texinfo (Set Breaks): Update for new behavior.
2011-12-06 19:54:43 +01:00
gdb_test_no_output "set breakpoint pending off"
gdb_test "break 999" "No line 999 in the current file." \
2010-05-28 01:44:51 +02:00
"break on non-existent source line"
2004-01-12 18:20:41 +01:00
# Run to the desired default location. If not positioned here, the
# tests below don't work.
#
gdb_test "until $bp_location1" "main .* at .*:$bp_location1.*" "until bp_location1"
# Verify that GDB allows one to just say "break", which is treated
# as the "default" breakpoint. Note that GDB gets cute when printing
# the informational message about other breakpoints at the same
# location. We'll hit that bird with this stone too.
#
2010-05-28 01:44:51 +02:00
gdb_test "break" "Breakpoint \[0-9\]*.*" \
"break on default location, 1st time"
2004-01-12 18:20:41 +01:00
2010-05-28 01:44:51 +02:00
gdb_test "break" \
"Note: breakpoint \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \
"break on default location, 2nd time"
2004-01-12 18:20:41 +01:00
2010-05-28 01:44:51 +02:00
gdb_test "break" \
"Note: breakpoints \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \
"break on default location, 3rd time"
gdb_test "break" \
"Note: breakpoints \[0-9\]*, \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \
"break on default location, 4th time"
2004-01-12 18:20:41 +01:00
# Verify that a "silent" breakpoint can be set, and that GDB is indeed
# "silent" about its triggering.
#
2010-05-28 01:44:51 +02:00
if ![runto_main] then { fail "sepdebug tests suppressed" }
2004-01-12 18:20:41 +01:00
2010-05-28 01:44:51 +02:00
gdb_test_multiple "break $bp_location1" \
"set to-be-silent break bp_location1" {
-re "Breakpoint (\[0-9\]*) at .*, line $bp_location1.*$gdb_prompt $" {
pass "set to-be-silent break bp_location1"
}
2004-01-12 18:20:41 +01:00
}
2011-12-26 12:24:55 +01:00
gdb_test "commands $expect_out(1,string)\nsilent\nend" ">end" "set silent break bp_location1"
2004-01-12 18:20:41 +01:00
2010-05-28 19:57:44 +02:00
gdb_test "info break $expect_out(1,string)" \
2010-05-28 01:44:51 +02:00
"\[0-9\]*\[ \t\]*breakpoint.*:$bp_location1\r\n\[ \t\]*silent.*" \
"info silent break bp_location1"
gdb_test "continue" "Continuing.*" "hit silent break bp_location1"
gdb_test "bt" "#0 main .* at .*:$bp_location1.*" \
"stopped for silent break bp_location1"
2004-01-12 18:20:41 +01:00
# Verify that GDB can at least parse a breakpoint with the
# "thread" keyword. (We won't attempt to test here that a
# thread-specific breakpoint really triggers appropriately.
# The gdb.threads subdirectory contains tests for that.)
#
set bp_location12 [gdb_get_line_number "set breakpoint 12 here"]
2010-05-28 01:44:51 +02:00
gdb_test "break $bp_location12 thread 999" "Unknown thread 999.*" \
"thread-specific breakpoint on non-existent thread disallowed"
gdb_test "break $bp_location12 thread foo" \
"Junk after thread keyword.*" \
"thread-specific breakpoint on bogus thread ID disallowed"
2004-01-12 18:20:41 +01:00
# Verify that GDB responds gracefully to a breakpoint command with
# trailing garbage.
#
2010-05-28 01:44:51 +02:00
gdb_test "break $bp_location12 foo" \
2012-04-05 20:50:29 +02:00
"malformed linespec error: unexpected string, \"foo\".*" \
2010-05-28 01:44:51 +02:00
"breakpoint with trailing garbage disallowed"
2004-01-12 18:20:41 +01:00
# Verify that GDB responds gracefully to a "clear" command that has
# no matching breakpoint. (First, get us off the current source line,
# which we know has a breakpoint.)
#
2010-05-28 01:44:51 +02:00
gdb_test "next" "marker1.*" "step over breakpoint"
gdb_test "clear 81" "No breakpoint at 81.*" \
"clear line has no breakpoint disallowed"
gdb_test "clear" "No breakpoint at this line.*" \
"clear current line has no breakpoint disallowed"
2004-01-12 18:20:41 +01:00
# Verify that we can set and clear multiple breakpoints.
#
# We don't test that it deletes the correct breakpoints. We do at
# least test that it deletes more than one breakpoint.
#
gdb_test "break marker3" "Breakpoint.*at.*" "break marker3 #1"
gdb_test "break marker3" "Breakpoint.*at.*" "break marker3 #2"
gdb_test "clear marker3" {Deleted breakpoints [0-9]+ [0-9]+.*}
# Verify that a breakpoint can be set via a convenience variable.
#
2010-05-28 01:44:51 +02:00
2010-06-01 23:29:21 +02:00
gdb_test_no_output "set \$foo=$bp_location11" \
2010-05-28 01:44:51 +02:00
"set convenience variable \$foo to bp_location11"
gdb_test "break \$foo" \
"Breakpoint (\[0-9\]*) at .*, line $bp_location11.*" \
"set breakpoint via convenience variable"
2004-01-12 18:20:41 +01:00
# Verify that GDB responds gracefully to an attempt to set a
# breakpoint via a convenience variable whose type is not integer.
#
2010-05-28 01:44:51 +02:00
gdb_test_no_output "set \$foo=81.5" \
"set convenience variable \$foo to 81.5"
gdb_test "break \$foo" \
"Convenience variables used in line specs must have integer values.*" \
"set breakpoint via non-integer convenience variable disallowed"
2004-01-12 18:20:41 +01:00
# Verify that we can set and trigger a breakpoint in a user-called function.
#
2010-05-28 01:44:51 +02:00
gdb_test "break marker2" \
2014-10-23 13:02:31 +02:00
"Breakpoint (\[0-9\]*) at .*, line $bp_location8.*" \
2010-05-28 01:44:51 +02:00
"set breakpoint on to-be-called function"
gdb_test "print marker2(99)" \
"The program being debugged stopped while in a function called from GDB.\r\nEvaluation of the expression containing the function\r\n.marker2. will be abandoned.\r\nWhen the function is done executing, GDB will silently stop.*" \
"hit breakpoint on called function"
2004-01-12 18:20:41 +01:00
# As long as we're stopped (breakpointed) in a called function,
# verify that we can successfully backtrace & such from here.
2010-05-28 01:44:51 +02:00
2015-12-21 18:51:54 +01:00
gdb_test "bt" \
"#0\[ \t\]*($hex in )?marker2.*:$bp_location8\r\n#1\[ \t\]*<function called from gdb>.*" \
"backtrace while in called function"
2004-01-12 18:20:41 +01:00
# Return from the called function. For remote targets, it's important to do
# this before runto_main, which otherwise may silently stop on the dummy
# breakpoint inserted by GDB at the program's entry point.
#
2010-05-28 01:44:51 +02:00
gdb_test_multiple "finish" "finish from called function" {
2014-10-23 13:02:31 +02:00
-re "Run till exit from .*marker2.* at .*$bp_location8\r\n.*function called from gdb.*$gdb_prompt $" {
2010-05-28 01:44:51 +02:00
pass "finish from called function"
}
2014-10-23 13:02:31 +02:00
-re "Run till exit from .*marker2.* at .*$bp_location8\r\n.*Value returned.*$gdb_prompt $" {
2010-05-28 01:44:51 +02:00
pass "finish from called function"
}
2004-01-12 18:20:41 +01:00
}
# Verify that GDB responds gracefully to a "finish" command with
# arguments.
#
2010-05-28 01:44:51 +02:00
if ![runto_main] then { fail "sepdebug tests suppressed" }
2004-01-12 18:20:41 +01:00
2010-05-28 01:44:51 +02:00
gdb_test "finish 123" \
"The \"finish\" command does not take any arguments.*" \
"finish with arguments disallowed"
2004-01-12 18:20:41 +01:00
# Verify that GDB responds gracefully to a request to "finish" from
# the outermost frame. On a stub that never exits, this will just
# run to the stubs routine, so we don't get this error... Thus the
# second condition.
#
2010-05-28 01:44:51 +02:00
gdb_test_multiple "finish" "finish from outermost frame disallowed" {
-re "\"finish\" not meaningful in the outermost frame.*$gdb_prompt $" {
pass "finish from outermost frame disallowed"
}
-re "Run till exit from.*$gdb_prompt $" {
pass "finish from outermost frame disallowed"
}
2004-01-12 18:20:41 +01:00
}
#
# Test "next" over recursive function call.
#
proc test_next_with_recursion {} {
global gdb_prompt
global decimal
global binfile
2007-03-27 19:59:38 +02:00
gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"
delete_breakpoints
2004-01-12 18:20:41 +01:00
gdb_test "break factorial" "Breakpoint $decimal at .*" "break at factorial"
# Run until we call factorial with 6
2007-03-27 19:59:38 +02:00
gdb_run_cmd
2014-09-12 23:16:31 +02:00
gdb_test "" "Break.* factorial .value=6. .*" "run to factorial(6)"
2004-01-12 18:20:41 +01:00
# Continue until we call factorial recursively with 5.
if [gdb_test "continue" \
"Continuing.*Break.* factorial .value=5. .*" \
"continue to factorial(5)"] then { gdb_suppress_tests }
# Do a backtrace just to confirm how many levels deep we are.
if [gdb_test "backtrace" \
"#0\[ \t\]+ factorial .value=5..*" \
"backtrace from factorial(5)"] then { gdb_suppress_tests }
# Now a "next" should position us at the recursive call, which
# we will be performing with 4.
if [gdb_test "next" \
".* factorial .value - 1.;.*" \
"next to recursive call"] then { gdb_suppress_tests }
# Disable the breakpoint at the entry to factorial by deleting them all.
# The "next" should run until we return to the next line from this
# recursive call to factorial with 4.
# Buggy versions of gdb will stop instead at the innermost frame on
# the line where we are trying to "next" to.
delete_breakpoints
if [istarget "mips*tx39-*"] {
set timeout 60
}
# We used to set timeout here for all other targets as well. This
# is almost certainly wrong. The proper timeout depends on the
# target system in use, and how we communicate with it, so there
# is no single value appropriate for all targets. The timeout
# should be established by the Dejagnu config file(s) for the
# board, and respected by the test suite.
#
# For example, if I'm running GDB over an SSH tunnel talking to a
# portmaster in California talking to an ancient 68k board running
# a crummy ROM monitor (a situation I can only wish were
# hypothetical), then I need a large timeout. But that's not the
# kind of knowledge that belongs in this file.
gdb_test next "\[0-9\]*\[\t \]+return \\(value\\);.*" \
"next over recursive call"
# OK, we should be back in the same stack frame we started from.
# Do a backtrace just to confirm.
set result [gdb_test "backtrace" \
"#0\[ \t\]+ factorial .value=120.*\r\n#1\[ \t\]+ \[0-9a-fx\]+ in factorial .value=6..*" \
"backtrace from factorial(5.1)"]
if { $result != 0 } { gdb_suppress_tests }
if [target_info exists gdb,noresults] { gdb_suppress_tests }
gdb_continue_to_end "recursive next test"
2013-06-07 19:31:09 +02:00
gdb_stop_suppressing_tests
2004-01-12 18:20:41 +01:00
}
test_next_with_recursion
#********
2013-03-15 02:41:29 +01:00
proc test_different_dir {type test_different_dir xfail} {
with_test_prefix "$type" {
2013-08-23 20:18:01 +02:00
global srcdir subdir binfile srcfile timeout gdb_prompt
2013-03-15 02:41:29 +01:00
global bp_location6 decimal hex
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_test_no_output "set debug-file-directory ${test_different_dir}" \
"set separate debug location"
gdb_load ${binfile}
#
# test break at function
#
if {$xfail} {
setup_xfail "*-*-*"
2007-09-01 10:16:16 +02:00
}
2013-03-15 02:41:29 +01:00
gdb_test "break main" \
"Breakpoint.*at.* file .*$srcfile, line.*" \
"breakpoint function, optimized file"
#
# test break at function
#
if {$xfail} {
setup_xfail "*-*-*"
2007-09-01 10:16:16 +02:00
}
2013-03-15 02:41:29 +01:00
gdb_test "break marker4" \
"Breakpoint.*at.* file .*$srcfile, line.*" \
"breakpoint small function, optimized file"
#
# run until the breakpoint at main is hit. For non-stubs-using targets.
#
gdb_run_cmd
if {$xfail} {
setup_xfail "*-*-*"
2007-09-01 10:16:16 +02:00
}
2014-09-12 23:16:31 +02:00
set test "run until function breakpoint, optimized file"
gdb_test_multiple "" $test {
2013-03-15 02:41:29 +01:00
-re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" {
2014-09-12 23:16:31 +02:00
pass $test
2013-03-15 02:41:29 +01:00
}
-re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $" {
2014-09-12 23:16:31 +02:00
pass "$test (code motion)"
2013-03-15 02:41:29 +01:00
}
2007-09-01 10:16:16 +02:00
}
2010-05-28 01:44:51 +02:00
2013-03-15 02:41:29 +01:00
#
# run until the breakpoint at a small function
#
#
# Add a second pass pattern. The behavior differs here between stabs
# and dwarf for one-line functions. Stabs preserves two line symbols
# (one before the prologue and one after) with the same line number,
# but dwarf regards these as duplicates and discards one of them.
# Therefore the address after the prologue (where the breakpoint is)
# has no exactly matching line symbol, and GDB reports the breakpoint
# as if it were in the middle of a line rather than at the beginning.
set bp_location14 [gdb_get_line_number "set breakpoint 14 here"]
if {$xfail} {
setup_xfail "*-*-*"
2007-09-01 10:16:16 +02:00
}
2013-03-15 02:41:29 +01:00
gdb_test_multiple "continue" "run until breakpoint set at small function, optimized file" {
-re "Breakpoint $decimal, marker4 \\(d=177601976\\) at .*$srcfile:$bp_location14\[\r\n\]+$bp_location14\[\t \]+void marker4.*$gdb_prompt $" {
2014-10-23 13:02:31 +02:00
pass "run until breakpoint set at small function, optimized file (line bp_location14)"
}
-re "Breakpoint $decimal, $hex in marker4 \\(d=177601976\\) at .*$srcfile:$bp_location14\[\r\n\]+$bp_location14\[\t \]+void marker4.*$gdb_prompt $" {
2013-03-15 02:41:29 +01:00
pass "run until breakpoint set at small function, optimized file (line bp_location14)"
}
2007-09-01 10:16:16 +02:00
}
2013-03-15 02:41:29 +01:00
# proc test_different_dir
}
}
2004-01-12 18:20:41 +01:00
2007-09-01 10:16:16 +02:00
# now move the .debug file to a different location so that we can test
# the "set debug-file-directory" command.
2013-08-23 20:18:01 +02:00
set different_dir [standard_output_file ${testfile}.dir]
2015-04-07 21:49:08 +02:00
set debugfile "${different_dir}/[standard_output_file ${testfile}${EXEEXT}.debug]"
2010-05-02 11:08:59 +02:00
remote_exec build "rm -rf $different_dir"
remote_exec build "mkdir -p [file dirname $debugfile]"
2015-04-07 21:49:08 +02:00
remote_exec build "mv -f [standard_output_file ${testfile}${EXEEXT}.debug] $debugfile"
2010-05-02 11:08:59 +02:00
test_different_dir debuglink $different_dir 0
2007-09-01 10:16:16 +02:00
2009-11-02 15:55:05 +01:00
# Test CRC mismatch is reported.
if {[build_executable sepdebug.exp sepdebug2 sepdebug2.c debug] != -1
2015-04-07 21:49:08 +02:00
&& ![gdb_gnu_strip_debug [standard_output_file sepdebug2]$EXEEXT]} {
2009-11-02 15:55:05 +01:00
2013-08-23 20:18:01 +02:00
remote_exec build "cp ${debugfile} [standard_output_file sepdebug2.debug]"
2009-11-02 15:55:05 +01:00
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
2013-08-23 20:18:01 +02:00
set escapedobjdirsubdir [string_to_regexp [standard_output_file {}]]
2009-11-02 15:55:05 +01:00
2013-08-23 20:18:01 +02:00
gdb_test "file [standard_output_file sepdebug2]" "warning: the debug information found in \"${escapedobjdirsubdir}/sepdebug2\\.debug\" does not match \"${escapedobjdirsubdir}/sepdebug2\" \\(CRC mismatch\\)\\..*\\(no debugging symbols found\\).*" "CRC mismatch is reported"
2009-11-02 15:55:05 +01:00
}
2007-09-01 10:16:16 +02:00
# NT_GNU_BUILD_ID / .note.gnu.build-id test:
2015-04-07 21:49:08 +02:00
set build_id_debug_filename [build_id_debug_filename_get $binfile$EXEEXT]
2007-10-30 20:23:18 +01:00
if ![string compare $build_id_debug_filename ""] then {
2007-09-01 10:16:16 +02:00
unsupported "build-id is not supported by the compiler"
# Spare debug files may confuse testsuite runs in the future.
remote_exec build "rm -f $debugfile"
} else {
set build_id_debugself_filename [build_id_debug_filename_get $debugfile]
set test "build-id support by binutils"
set xfail 0
2007-10-30 20:23:18 +01:00
if ![string compare $build_id_debugself_filename ""] then {
2007-09-01 10:16:16 +02:00
unsupported $test
set xfail 1
2007-10-30 20:23:18 +01:00
} elseif {[string compare $build_id_debugself_filename $build_id_debug_filename] != 0} then {
2007-09-01 10:16:16 +02:00
fail $test
} else {
pass $test
}
2013-08-23 20:18:01 +02:00
file mkdir [file dirname [standard_output_file ${build_id_debug_filename}]]
remote_exec build "mv $debugfile [standard_output_file ${build_id_debug_filename}]"
2007-09-01 10:16:16 +02:00
2013-08-23 20:18:01 +02:00
test_different_dir build-id [standard_output_file {}] $xfail
2007-09-01 10:16:16 +02:00
2009-11-02 15:59:53 +01:00
# Test also multiple directories can be specified. Without the build-id
# reference GDB would find the separate debug info just at the same
# location as the executable file.
2013-08-23 20:18:01 +02:00
test_different_dir multiple-dirs "/doesnotexist:[standard_output_file {}]" $xfail
2009-11-02 15:59:53 +01:00
2007-09-01 10:16:16 +02:00
# Spare debug files may confuse testsuite runs in the future.
2013-08-23 20:18:01 +02:00
remote_exec build "rm -f [standard_output_file ${build_id_debug_filename}]"
2004-01-12 18:20:41 +01:00
}