maint.exp revision 1.6
1# Copyright 1998-2016 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# This file was written by Elena Zannoni (ezannoni@cygnus.com) 17 18# this file tests maintenance commands and help on those. 19 20# source file used is break.c 21 22 23#maintenance check-psymtabs -- Check consistency of psymtabs vs symtabs 24#maintenance check-symtabs -- Check consistency of symtabs 25#maintenance expand-symtabs -- Expand symtabs matching a file regexp 26#maintenance set -- Set GDB internal variables used by the GDB maintainer 27#maintenance show -- Show GDB internal variables used by the GDB maintainer 28#maintenance dump-me -- Get fatal error; make debugger dump its core 29#maintenance print -- Maintenance command for printing GDB internal state 30#maintenance info -- Commands for showing internal info about the program being debugged 31#maintenance internal-error -- Give GDB an internal error. 32# 33#maintenance print dummy-frames -- Print the dummy frame stack 34#maintenance print statistics -- Print statistics about internal gdb state 35#maintenance print objfiles -- Print dump of current object file definitions 36#maintenance print psymbols -- Print dump of current partial symbol definitions 37#maintenance print msymbols -- Print dump of current minimal symbol definitions 38#maintenance print symbols -- Print dump of current symbol definitions 39#maintenance print type -- Print a type chain for a given symbol 40#maintenance print unwind -- Print unwind table entry at given address 41# 42# 43#maintenance info sections -- List the BFD sections of the exec and core files 44#maintenance info breakpoints -- Status of all breakpoints 45# 46 47 48 49standard_testfile break.c break1.c 50 51if {[prepare_for_testing $testfile.exp $testfile \ 52 [list $srcfile $srcfile2] {debug nowarnings}]} { 53 untested $testfile.exp 54 return -1 55} 56 57# The commands we test here produce many lines of output; disable "press 58# <return> to continue" prompts. 59gdb_test_no_output "set height 0" 60 61# Tests that require that no program is running 62 63gdb_file_cmd ${binfile} 64 65# Test for a regression where this command would internal-error if the 66# program wasn't running. 67gdb_test "maint print registers" "Name.*Nr.*Rel.*Offset.*Size.*Type.*" 68 69# Test "mt expand-symtabs" here as it's easier to verify before we 70# run the program. 71gdb_test_no_output "mt set per on" "mt set per on for expand-symtabs" 72gdb_test_multiple "mt expand-symtabs $subdir/break\[.\]c$" \ 73 "mt expand-symtabs" { 74 -re "#compunits: (1|2) \\(\[+\](0|1|2)\\),.*$gdb_prompt $" { 75 # This should expand at most two primary symtabs. 76 # "Normally" it will not expand any, because the symtab 77 # holding "main" will already have been expanded, but if the 78 # file is compiled with -fdebug-types-section then a second primary 79 # symtab for break.c will be created for any types. 80 pass "mt expand-symtabs" 81 } 82 } 83gdb_test "mt set per off" ".*" "mt set per off for expand-symtabs" 84 85# Tests that can or should be done with a running program 86 87gdb_load ${binfile} 88 89if ![runto_main] then { 90 perror "tests suppressed" 91} 92 93# If we're using .gdb_index there will be no psymtabs. 94set have_gdb_index 0 95gdb_test_multiple "maint info sections .gdb_index" "check for .gdb_index" { 96 -re ": .gdb_index.*$gdb_prompt $" { 97 set have_gdb_index 1 98 } 99 -re ".*$gdb_prompt $" { 100 ;# Nothing to do, present to avoid a FAIL. 101 } 102} 103 104# 105# this command does not produce any output 106# unless there is some problem with the symtabs and psymtabs 107# so that branch will really never be covered in this tests here!! 108# 109 110# guo: on linux this command output is huge. for some reason splitting up 111# the regexp checks works. 112# 113send_gdb "maint check-psymtabs\n" 114gdb_expect { 115 -re "^maint check-psymtabs" { 116 gdb_expect { 117 -re "$gdb_prompt $" { 118 pass "maint check-psymtabs" 119 } 120 timeout { fail "(timeout) maint check-psymtabs" } 121 } 122 } 123 -re ".*$gdb_prompt $" { fail "maint check-psymtabs" } 124 timeout { fail "(timeout) maint check-psymtabs" } 125} 126 127# This command does not produce any output unless there is some problem 128# with the symtabs, so that branch will really never be covered in the 129# tests here!! 130gdb_test_no_output "maint check-symtabs" 131 132# Test per-command stats. 133gdb_test_no_output "maint set per-command on" 134gdb_test "pwd" \ 135 "Command execution time: \[0-9.\]+ \\(cpu\\), \[0-9.\]+ \\(wall\\)\[\r\n\]+Space used: $decimal \\(\\+$decimal for this command\\)\[\r\n\]+#symtabs: $decimal \\(\\+$decimal\\), #compunits: $decimal \\(\\+$decimal\\), #blocks: $decimal \\(\\+$decimal\\)" 136gdb_test_no_output "maint set per-command off" 137 138# The timeout value is raised, because printing all the symbols and 139# statistical information about Cygwin and Windows libraries takes a lot 140# of time. 141if [istarget "*-*-cygwin*"] { 142 set oldtimeout $timeout 143 set timeout [expr $timeout + 500] 144} 145 146send_gdb "maint print statistics\n" 147gdb_expect { 148 -re "Statistics for\[^\n\r\]*maint\[^\n\r\]*:\r\n Number of \"minimal\" symbols read: $decimal\r\n( Number of \"partial\" symbols read: $decimal\r\n)? Number of \"full\" symbols read: $decimal\r\n Number of \"types\" defined: $decimal\r\n( Number of psym tables \\(not yet expanded\\): $decimal\r\n)?( Number of read CUs: $decimal\r\n Number of unread CUs: $decimal\r\n)? Number of symbol tables: $decimal\r\n Number of symbol tables with line tables: $decimal\r\n Number of symbol tables with blockvectors: $decimal\r\n Total memory used for objfile obstack: $decimal\r\n Total memory used for BFD obstack: $decimal\r\n Total memory used for psymbol cache: $decimal\r\n Total memory used for macro cache: $decimal\r\n Total memory used for file name cache: $decimal\r\n" { 149 gdb_expect { 150 -re "$gdb_prompt $" { 151 pass "maint print statistics" 152 } 153 timeout { fail "(timeout) maint print statistics" } 154 } 155 } 156 -re ".*$gdb_prompt $" { fail "maint print statistics" } 157 timeout { fail "(timeout) maint print statistics" } 158} 159 160# There aren't any ... 161gdb_test_no_output "maint print dummy-frames" 162 163send_gdb "maint print objfiles\n" 164 165# To avoid timeouts, we avoid expects with many .* patterns that match 166# many lines. Instead, we keep track of which milestones we've seen 167# in the output, and stop when we've seen all of them. 168 169set header 0 170set psymtabs 0 171set symtabs 0 172set keep_looking 1 173 174while {$keep_looking} { 175 gdb_expect { 176 177 -re "\r\n" { 178 set output $expect_out(buffer) 179 if {[regexp ".*Object file.*maint($EXEEXT)?: Objfile at ${hex}" $output]} { 180 set header 1 181 } 182 if {[regexp ".*Psymtabs:\[\r\t \]+\n" $output]} { 183 set psymtabs 1 184 } 185 if {[regexp ".*Symtabs:\[\r\t \]+\n" $output]} { 186 set symtabs 1 187 } 188 } 189 190 -re ".*$gdb_prompt $" { 191 set keep_looking 0 192 } 193 timeout { 194 fail "(timeout) maint print objfiles" 195 set keep_looking 0 196 } 197 } 198} 199 200proc maint_pass_if {val name} { 201 if $val { pass $name } else { fail $name } 202} 203 204maint_pass_if $header "maint print objfiles: header" 205if { ! $have_gdb_index } { 206 maint_pass_if $psymtabs "maint print objfiles: psymtabs" 207} 208maint_pass_if $symtabs "maint print objfiles: symtabs" 209 210gdb_test "maint print psymbols" \ 211 "print-psymbols takes an output file name and optional symbol file name" \ 212 "maint print psymbols w/o args" 213 214if { ! $have_gdb_index } { 215 set psymbols_output [standard_output_file psymbols_output] 216 set psymbols_output_re [string_to_regexp $psymbols_output] 217 send_gdb "maint print psymbols $psymbols_output ${srcdir}/${subdir}/${srcfile}\n" 218 gdb_expect { 219 -re "^maint print psymbols $psymbols_output_re \[^\n\]*\r\n$gdb_prompt $" { 220 send_gdb "shell ls $psymbols_output\n" 221 gdb_expect { 222 -re "$psymbols_output_re\r\n$gdb_prompt $" { 223 # We want this grep to be as specific as possible, 224 # so it's less likely to match symbol file names in 225 # psymbols_output. Yes, this actually happened; 226 # poor expect got tons of output, and timed out 227 # trying to match it. --- Jim Blandy <jimb@cygnus.com> 228 send_gdb "shell grep 'main.*function' $psymbols_output\n" 229 gdb_expect { 230 -re ".main., function, $hex.*$gdb_prompt $" { 231 pass "maint print psymbols 1" 232 } 233 -re ".*main. .., function, $hex.*$gdb_prompt $" { 234 pass "maint print psymbols 2" 235 } 236 -re ".*$gdb_prompt $" { fail "maint print psymbols" } 237 timeout { fail "(timeout) maint print psymbols" } 238 } 239 gdb_test "shell rm -f $psymbols_output" ".*" \ 240 "shell rm -f psymbols_output" 241 } 242 -re ".*$gdb_prompt $" { fail "maint print psymbols" } 243 timeout { fail "(timeout) maint print psymbols" } 244 } 245 } 246 -re ".*$gdb_prompt $" { fail "maint print psymbols" } 247 timeout { fail "(timeout) maint print psymbols" } 248 } 249} 250 251gdb_test "maint print msymbols" \ 252 "print-msymbols takes an output file name and optional symbol file name" \ 253 "maint print msymbols w/o args" 254 255 256set msymbols_output [standard_output_file msymbols_output] 257set msymbols_output_re [string_to_regexp $msymbols_output] 258send_gdb "maint print msymbols $msymbols_output ${binfile}\n" 259gdb_expect { 260 -re "^maint print msymbols $msymbols_output_re \[^\n\]*\r\n$gdb_prompt $" { 261 send_gdb "shell ls $msymbols_output\n" 262 gdb_expect { 263 -re "$msymbols_output_re\r\n$gdb_prompt $" { 264 send_gdb "shell grep factorial $msymbols_output\n" 265 gdb_expect { 266 -re "\\\[ *$decimal\\\] \[tT\]\[ \t\]+$hex \\.?factorial.*$gdb_prompt $" { 267 pass "maint print msymbols" 268 } 269 -re ".*$gdb_prompt $" { fail "maint print msymbols" } 270 timeout { fail "(timeout) maint print msymbols" } 271 } 272 gdb_test "shell rm -f $msymbols_output" ".*" \ 273 "shell rm -f msymbols_output" 274 } 275 -re ".*$gdb_prompt $" { fail "maint print msymbols" } 276 timeout { fail "(timeout) maint print msymbols" } 277 } 278 } 279 -re ".*$gdb_prompt $" { fail "maint print msymbols" } 280 timeout { fail "(timeout) maint print msymbols" } 281} 282 283# Check that maint print msymbols allows relative pathnames 284set mydir [pwd] 285gdb_test "cd [standard_output_file {}]" \ 286 "Working directory .*\..*" \ 287 "cd to objdir" 288 289gdb_test_multiple "maint print msymbols msymbols_output2 ${testfile}" "maint print msymbols" { 290 -re "^maint print msymbols msymbols_output2 \[^\n\]*\r\n$gdb_prompt $" { 291 gdb_test_multiple "shell ls msymbols_output2" "maint print msymbols" { 292 -re "msymbols_output2\r\n$gdb_prompt $" { 293 gdb_test_multiple "shell grep factorial msymbols_output2" "maint print msymbols" { 294 -re "\\\[ *$decimal\\\] \[tT\]\[ \t\]+$hex \\.?factorial.*$gdb_prompt $" { 295 pass "maint print msymbols" 296 } 297 -re ".*$gdb_prompt $" { 298 fail "maint print msymbols" 299 } 300 timeout { 301 fail "(timeout) maint print msymbols" 302 } 303 } 304 gdb_test "shell rm -f msymbols_output2" ".*" \ 305 "shell rm -f msymbols_output2" 306 } 307 -re ".*$gdb_prompt $" { 308 fail "maint print msymbols" 309 } 310 timeout { 311 fail "(timeout) maint print msymbols" 312 } 313 } 314 } 315 -re ".*$gdb_prompt $" { 316 fail "maint print msymbols" 317 } 318 timeout { 319 fail "(timeout) maint print msymbols" 320 } 321} 322gdb_test "cd ${mydir}" \ 323 "Working directory [string_to_regexp ${mydir}]\..*" \ 324 "cd to mydir" 325 326gdb_test "maint print symbols" \ 327 "Arguments missing: an output file name and an optional symbol file name" \ 328 "maint print symbols w/o args" 329 330 331# Request symbols for one particular source file so that we don't try to 332# dump the symbol information for the entire C library - over 500MB nowadays 333# for GNU libc. 334 335set symbols_output [standard_output_file symbols_output] 336set symbols_output_re [string_to_regexp $symbols_output] 337send_gdb "maint print symbols $symbols_output ${srcdir}/${subdir}/${srcfile}\n" 338gdb_expect { 339 -re "^maint print symbols $symbols_output_re \[^\n\]*\r\n$gdb_prompt $" { 340 send_gdb "shell ls $symbols_output\n" 341 gdb_expect { 342 -re "$symbols_output_re\r\n$gdb_prompt $" { 343 # See comments for `maint print psymbols'. 344 send_gdb "shell grep 'main(.*block' $symbols_output\n" 345 gdb_expect { 346 -re "int main\\(int, char \\*\\*, char \\*\\*\\); block.*$gdb_prompt $" { 347 pass "maint print symbols" 348 } 349 -re ".*$gdb_prompt $" { fail "maint print symbols" } 350 timeout { fail "(timeout) maint print symbols" } 351 } 352 gdb_test "shell rm -f $symbols_output" ".*" \ 353 "shell rm -f symbols_output" 354 } 355 -re ".*$gdb_prompt $" { fail "maint print symbols" } 356 timeout { fail "(timeout) maint print symbols" } 357 } 358 } 359 -re ".*$gdb_prompt $" { fail "maint print symbols" } 360 timeout { fail "(timeout) maint print symbols" } 361} 362 363set msg "maint print type" 364gdb_test_multiple "maint print type argc" $msg { 365 -re "type node $hex\r\nname .int. \\($hex\\)\r\ntagname .<NULL>. \\($hex\\)\r\ncode $hex \\(TYPE_CODE_INT\\)\r\nlength \[24\]\r\nobjfile $hex\r\ntarget_type $hex\r\npointer_type $hex\r\nreference_type $hex\r\ntype_chain $hex\r\ninstance_flags $hex\r\nflags\r\nnfields 0 $hex\r\n$gdb_prompt $" { 366 pass $msg 367 } 368} 369 370if [istarget "hppa*-*-11*"] { 371 setup_xfail hppa*-*-*11* CLLbs14860 372 gdb_test_multiple "maint print unwind &main" "maint print unwind" { 373 -re ".*unwind_table_entry \\($hex\\):\r\n\tregion_start = $hex <main>\r\n\tregion_end = $hex <main\\+\[0-9\]*>\r\n\tflags = Args_stored Save_RP\r\n\tRegion_description = $hex\r\n\tEntry_FR = $hex\r\n\tEntry_GR = $hex\r\n\tTotal_frame_size = $hex\r\n$gdb_prompt $" { 374 pass "maint print unwind" 375 } 376 -re ".*unwind_table_entry \\($hex\\):\r\n\tregion_start = $hex <main>\r\n\tregion_end = $hex <main\\+\[0-9\]*>\r\n\tflags = Args_stored Save_RP\r\n\tFLD = $hex\r\n\tFLD = $hex\r\n\tFLD = $hex\r\n\tFLD = $hex\r\n$gdb_prompt $" { 377 xfail "maint print unwind" 378 } 379 } 380} 381 382set oldtimeout $timeout 383set timeout [expr $timeout + 300] 384 385# It'd be nice to check for every possible section. However, that's 386# problematic, since the relative ordering wanders from release to 387# release of the compilers. Instead, we'll just check for two 388# sections which appear to always come out in the same relative 389# order. (If that changes, then we should just check for one 390# section.) 391# 392# And by the way: This testpoint will break for PA64, where a.out's 393# are ELF files. 394 395# Standard GNU names. 396set text_section ".text" 397set data_section ".data" 398 399gdb_test_multiple "maint info sections" "maint info sections" { 400 -re "Exec file:\r\n.*maint($EXEEXT)?., file type.*ER_RO.*$gdb_prompt $" { 401 # Looks like RealView which uses different section names. 402 set text_section ER_RO 403 set data_section ER_RW 404 pass "maint info sections" 405 } 406 -re "Exec file:\r\n.*maint($EXEEXT)?., file type.*neardata.*$gdb_prompt $" { 407 # c6x doesn't have .data section. It has .neardata and .fardata section. 408 set data_section ".neardata" 409 pass "maint info sections" 410 } 411 -re "Exec file:\r\n.*maint($EXEEXT)?., file type.*$gdb_prompt $" { 412 pass "maint info sections" 413 } 414} 415 416# Test for new option: maint info sections <section name> 417# If you don't have a .text section, this will require tweaking. 418 419gdb_test_multiple "maint info sections $text_section" \ 420 "maint info sections .text" { 421 -re ".* \\.bss .*$gdb_prompt $" { 422 fail "maint info sections .text" 423 } 424 -re ".* $data_section .*$gdb_prompt $" { 425 fail "maint info sections .text" 426 } 427 -re ".* $text_section .*$gdb_prompt $" { 428 pass "maint info sections .text" 429 } 430 } 431 432# Test for new option: CODE section flag 433# If your data section is tagged CODE, xfail this test. 434 435gdb_test_multiple "maint info sections CODE" "maint info sections CODE" { 436 -re ".* $data_section .*$gdb_prompt $" { fail "maint info sections CODE" } 437 -re ".* $text_section .*$gdb_prompt $" { pass "maint info sections CODE" } 438} 439 440# Test for new option: DATA section flag 441# If your text section is tagged DATA, xfail this test. 442# 443# The "maint info sections DATA" test is marked for XFAIL on Windows, 444# because Windows has text sections marked DATA. 445setup_xfail "*-*-*cygwin*" 446setup_xfail "*-*-*mingw*" 447 448gdb_test_multiple "maint info sections DATA" "maint info sections DATA" { 449 -re ".* $text_section .*$gdb_prompt $" { fail "maint info sections DATA" } 450 -re ".* $data_section .*$gdb_prompt $" { pass "maint info sections DATA" } 451 -re ".* .rodata .*$gdb_prompt $" { pass "maint info sections DATA" } 452} 453 454set bp_location6 [gdb_get_line_number "set breakpoint 6 here"] 455 456gdb_test_multiple "maint info breakpoints" "maint info breakpoints" { 457 -re "Num\[ \t\]+Type\[ \t\]+Disp\[ \t\]+Enb\[ \t\]+Address\[ \t\]+What\r\n1\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex\[ \t\]+in main at.*break.c:$bp_location6 inf 1\r\n\[ \t\]+breakpoint already hit 1 time\r\n.*$gdb_prompt $" { 458 pass "maint info breakpoints" 459 } 460 -re "Num\[ \t\]+Type\[ \t\]+Disp\[ \t\]+Enb\[ \t\]+Address\[ \t\]+What\r\n1\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex in main at.*break.c:$bp_location6 sspace 1\r\n\[ \t\]+breakpoint already hit 1 time\r\n-1\[ \t\]+shlib events\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex.*breakpoint already hit.*$gdb_prompt $" { 461 pass "maint info breakpoints (with shlib events)" 462 } 463} 464 465gdb_test "maint print" \ 466 "\"maintenance print\" must be followed by the name of a print command\\.\r\nList.*unambiguous\\..*" \ 467 "maint print w/o args" 468 469gdb_test "maint info" \ 470 "\"maintenance info\" must be followed by the name of an info command\\.\r\nList.*unambiguous\\..*" \ 471 "maint info w/o args" 472 473gdb_test "maint" \ 474 "\"maintenance\" must be followed by the name of a maintenance command\\.\r\nList.*unambiguous\\..*" \ 475 "maint w/o args" 476 477gdb_test "maint info line-table" \ 478 "symtab: \[^\n\r\]+${srcfile}.*\\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX.*LINE.*ADDRESS.*" \ 479 "maint info line-table w/o a file name" 480 481gdb_test "maint info line-table ${srcfile}" \ 482 "symtab: \[^\n\r\]+${srcfile}.*INDEX.*LINE.*ADDRESS.*" \ 483 "maint info line-table with filename of current symtab" 484 485gdb_test_no_output "maint info line-table ${srcfile2}" \ 486 "maint info line-table with filename of symtab that is not currently expanded" 487 488gdb_test_no_output "maint expand-symtabs" 489 490gdb_test "maint info line-table ${srcfile2}" \ 491 "symtab: \[^\n\r\]+${srcfile2}.*INDEX.*LINE.*ADDRESS.*" \ 492 "maint info line-table with filename of symtab that is not current" 493 494gdb_test_no_output "maint info line-table xxx.c" \ 495 "maint info line-table with invalid filename" 496 497set timeout $oldtimeout 498 499#============test help on maint commands 500 501gdb_test "help maint" \ 502 "Commands for use by GDB maintainers\\..*Includes commands to dump specific internal GDB structures in.*a human readable form, to cause GDB to deliberately dump core, etc\\..*List of maintenance subcommands:.*maintenance info.*maintenance internal-error.*maintenance print.*maintenance set.*maintenance show.*Type.*help maintenance.*followed by maintenance subcommand name for full documentation\\..*Command name abbreviations are allowed if unambiguous\\..*" 503 504gdb_test "help maint info" \ 505 "Commands for showing internal info about the program being debugged.*unambiguous\\..*" 506 507test_prefix_command_help {"maint print" "maintenance print"} { 508 "Maintenance command for printing GDB internal state\\.\[\r\n\]+" 509} 510 511test_prefix_command_help {"maint" "maintenance"} { 512 "Commands for use by GDB maintainers\\.\[\r\n\]+" 513 "Includes commands to dump specific internal GDB structures in\[\r\n\]+" 514 "a human readable form, to cause GDB to deliberately dump core, etc\\.\[\r\n\]+" 515} 516 517#set oldtimeout $timeout 518#set timeout [expr $timeout + 300] 519 520gdb_test_multiple "maint dump-me" "maint dump-me" { 521 -re "Should GDB dump core.*\\(y or n\\) $" { 522 gdb_test "n" ".*" "maint dump-me" 523 } 524 -re "Undefined maintenance command: .*$gdb_prompt $" { 525 # Command 'maint dump-me' is registered on non-win32 host. 526 unsupported "maint dump-me" 527 } 528} 529 530send_gdb "maint internal-error\n" 531gdb_expect { 532 -re "A problem internal to GDB has been detected" { 533 pass "maint internal-error" 534 if [gdb_internal_error_resync] { 535 pass "internal-error resync" 536 } else { 537 fail "internal-error resync" 538 } 539 } 540 -re ".*$gdb_prompt $" { 541 fail "maint internal-error" 542 untested "internal-error resync" 543 } 544 timeout { 545 fail "maint internal-error (timeout)" 546 untested "internal-error resync" 547 } 548} 549 550#set timeout $oldtimeout 551 552 553gdb_exit 554return 0 555