diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/step-line.exp | 9 | ||||
-rw-r--r-- | gdb/testsuite/lib/gdb.exp | 55 |
3 files changed, 75 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index cca06f2..81a54d9 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2002-11-22 Jim Blandy <jimb@redhat.com> + + * gdb.base/step-line.exp: Check that GDB can handle filenames that + appear in the line number info, but not in the preprocessor macro + info. + + * lib/gdb.exp (gdb_internal_error_regexp): New variable. + (gdb_internal_error_resync): New procedure. + (gdb_test): If the command results in an internal error, + answer GDB's questions until we get back to a prompt. + 2002-11-21 Daniel Jacobowitz <drow@mvista.com> * gdb.base/maint.exp (help maint dump-me): Update with typo fix. diff --git a/gdb/testsuite/gdb.base/step-line.exp b/gdb/testsuite/gdb.base/step-line.exp index cac3128..637f2af 100644 --- a/gdb/testsuite/gdb.base/step-line.exp +++ b/gdb/testsuite/gdb.base/step-line.exp @@ -53,6 +53,15 @@ gdb_test "continue" \ gdb_test "next" \ ".*i = f2 \\(i\\);.*" \ "next over dummy 1" + +# As of Oct 2002, GCC does record the effect of #line directives in +# the source line info, but not in macro info. This means that GDB's +# symtabs (built from the former, among other things) may mention +# filenames that GDB's macro tables (built from the latter) don't have +# any record of. Make sure GDB can handle this by trying to evaluate +# an expression, which will do a macro expansion. +gdb_test "print i" ".* = 4.*" + gdb_test "next" \ ".*dummy \\(2, i\\);.*" \ "next to dummy 2" diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index aae7365..7be95a1 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -370,6 +370,56 @@ proc gdb_continue_to_breakpoint {name} { } +# A regular expression matching the output GDB produces when it +# reports an internal error. +set gdb_internal_error_regexp ".*A problem internal to GDB has been detected" + + +# gdb_internal_error_resync TESTNAME +# +# Answer the questions GDB asks after it reports an internal error +# until we get back to a GDB prompt, as part of the test named +# TESTNAME. Decline to quit the debugging session, and decline to +# create a core file. +# +# This procedure just answers whatever questions come up until it sees +# a GDB prompt; it doesn't require you to have matched the input up to +# any specific point. However, it only answers questions it sees in +# the output itself, so if you've matched a question, you had better +# answer it yourself before calling this. +# +# The variable `gdb_internal_error_regexp' is set up to match the +# internal error message, but none of the questions that follow it, so +# you can write code like this: +# +# gdb_expect { +# ... +# -re $gdb_internal_error_regexp { +# gdb_internal_error_resync "$message (internal error)" +# } +# ... +# } +proc gdb_internal_error_resync {testname} { + global gdb_prompt + + gdb_expect { + -re "Quit this debugging session\\? \\(y or n\\) $" { + send_gdb "n\n" + exp_continue + } + -re "Create a core file of GDB\\? \\(y or n\\) $" { + send_gdb "n\n" + exp_continue + } + -re "$gdb_prompt $" { + # We're resynchronized. + } + timeout { + fail "$testname (internal error resync timeout)" + } + } +} + # gdb_test COMMAND PATTERN MESSAGE QUESTION RESPONSE # Send a command to gdb; test the result. @@ -395,6 +445,7 @@ proc gdb_test { args } { global verbose global gdb_prompt global GDB + global gdb_internal_error_regexp upvar timeout timeout if [llength $args]>2 then { @@ -477,6 +528,10 @@ proc gdb_test { args } { } } gdb_expect $tmt { + -re $gdb_internal_error_regexp { + fail "$message" + gdb_internal_error_resync "$message (internal error)" + } -re "\\*\\*\\* DOSEXIT code.*" { if { $message != "" } { fail "$message"; |