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 Michael Snyder (msnyder@cygnus.com) 17 18load_lib "trace-support.exp" 19 20 21gdb_exit 22gdb_start 23 24standard_testfile actions.c 25if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ 26 executable {debug nowarnings}] != "" } { 27 untested report.exp 28 return -1 29} 30gdb_load $binfile 31gdb_test "tstop" ".*" "" 32gdb_test "tfind none" ".*" "" 33runto_main 34gdb_reinitialize_dir $srcdir/$subdir 35 36if { ![gdb_target_supports_trace] } then { 37 unsupported "Current target does not support trace" 38 return 1 39 40} 41 42set cr "\[\r\n\]+" 43 44# If testing on a remote host, download the source file. 45# remote_download host $srcdir/$subdir/$srcfile 46 47# 48# test general reporting of trace experiment results 49# 50 51set testline1 0 52set testline2 0 53set testline3 0 54set testline4 0 55set testline5 0 56set testline6 0 57 58set arg1 1 59set arg2 2 60set arg3 3 61set arg4 4 62set arg5 5 63set arg6 6 64 65set gdb_recursion_test_baseline [gdb_find_recursion_test_baseline $srcfile] 66if { $gdb_recursion_test_baseline == -1 } { 67 fail "Could not find gdb_recursion_test function" 68 return 69} 70 71set return_me 0 72 73gdb_test_multiple "list $gdb_recursion_test_baseline, +12" "" { 74 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 1 " { 75 set testline1 $expect_out(1,string) 76 exp_continue 77 } 78 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 2 " { 79 set testline2 $expect_out(1,string) 80 exp_continue 81 } 82 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 3 " { 83 set testline3 $expect_out(1,string) 84 exp_continue 85 } 86 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 4 " { 87 set testline4 $expect_out(1,string) 88 exp_continue 89 } 90 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 5 " { 91 set testline5 $expect_out(1,string) 92 exp_continue 93 } 94 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 6 " { 95 set testline6 $expect_out(1,string) 96 exp_continue 97 } 98 -re ".*$gdb_prompt $" { 99 if { ($testline1 == 0) || ($testline2 == 0) || ($testline3 == 0) || ($testline4 == 0) || ($testline5 == 0) || ($testline6 == 0) } { 100 untested report.exp 101 set return_me 1 102all tests in this module will fail." 103 } 104 } 105 default { 106 untested report.exp 107 set return_me 1 108all tests in this module will fail." 109 } 110} 111 112if { $return_me == 1 } then { 113 return -1 114} 115 116# 117# Setup trace experiment. This will involve: 118# 1) a tracepoint where nothing is collected 119# 2) a tracepoint where only regs are collected 120# 3) a tracepoint where only args are collected 121# 4) a tracepoint where only locals are collected 122# 5) a tracepoint where some amount of stack memory is collected. 123# 6) a tracepoint where some expressions are collected. 124# 125 126gdb_delete_tracepoints 127set tdp1 [gdb_gettpnum $testline1] 128set tdp2 [gdb_gettpnum $testline2] 129set tdp3 [gdb_gettpnum $testline3] 130set tdp4 [gdb_gettpnum $testline4] 131set tdp5 [gdb_gettpnum $testline5] 132set tdp6 [gdb_gettpnum $testline6] 133 134if { $tdp1 <= 0 || $tdp2 <= 0 || $tdp3 <= 0 || \ 135 $tdp4 <= 0 || $tdp5 <= 0 || $tdp6 <= 0 } then { 136 fail "setting tracepoints failed" 137 return 138} 139 140gdb_trace_setactions "9.x: setup TP to collect regs" \ 141 "$tdp2" \ 142 "collect \$regs" "^$" 143 144 145gdb_trace_setactions "9.x: setup TP to collect args" \ 146 "$tdp3" \ 147 "collect \$args" "^$" 148 149gdb_trace_setactions "9.x: setup TP to collect locals" \ 150 "$tdp4" \ 151 "collect \$locs" "^$" 152 153gdb_trace_setactions "9.x: setup TP to collect stack memory" \ 154 "$tdp5" \ 155 "collect \$$fpreg, \*\(void \*\*\) \$$spreg @ 64" "^$" 156 157gdb_trace_setactions "9.x: setup TP to collect expressions" \ 158 "$tdp6" \ 159 "collect gdb_char_test, gdb_short_test, gdb_long_test" "^$" 160 161gdb_test "tstart" ".*" "" 162 163gdb_test "break end" ".*" "" 164gdb_test "continue" \ 165 "Continuing.*Breakpoint $decimal, end.*" \ 166 "run trace experiment" 167 168gdb_test "tstop" ".*" "" 169 170gdb_tfind_test "9.1: init: make sure not debugging any trace frame" \ 171 "none" "-1" 172 173# 9.3 help tdump 174 175gdb_test "help tdump" "Print everything collected at the current.*" \ 176 "9.3: help tdump" 177 178# Check the collected trace data from different sources, such as live 179# inferior and tfile. 180 181proc use_collected_data { data_source } { 182 with_test_prefix "${data_source}" { 183 global tdp1 tdp2 tdp3 tdp4 tdp5 tdp6 184 global testline1 testline2 testline3 testline4 testline5 testline6 185 global pcreg fpreg spreg 186 global srcfile srcdir subdir binfile 187 global arg1 arg3 188 global decimal hex gdb_prompt 189 # 190 # 9.1 test the tdump command 191 # 192 193 set timeout 60 194 195 gdb_tfind_test "9.1: find frame for TP $tdp1" "tracepoint $tdp1" \ 196 "\$tracepoint" "$tdp1" 197 198 # Nothing was collected at tdp1, so this tdump should be empty. 199 gdb_test "tdump" \ 200 "Data collected at tracepoint $tdp1, trace frame $decimal:" \ 201 "9.1: tdump, nothing collected" 202 203 gdb_tfind_test "9.1: find frame for TP $tdp2" "tracepoint $tdp2" \ 204 "\$tracepoint" "$tdp2" 205 206 # regs were collected at tdp2. 207 # How to match for the output of "info registers" on an unknown architecture? 208 # For now, assume that most architectures have a register called "pc". 209 210 gdb_test "tdump" \ 211 "\[\r\n\]$pcreg .*" \ 212 "9.1: tdump, regs collected" 213 214 gdb_tfind_test "9.1: find frame for TP $tdp3" "tracepoint $tdp3" \ 215 "\$tracepoint" "$tdp3" 216 217 # args were collected at tdp3 218 gdb_test "tdump" \ 219 "depth = 3.*q1 = 2.*q2 = 2.*q3 = 3.*q4 = 4.*q5 = 5.*q6 = 6" \ 220 "9.1: tdump, args collected" 221 222 gdb_tfind_test "9.1: find frame for TP $tdp4" "tracepoint $tdp4" \ 223 "\$tracepoint" "$tdp4" 224 225 # locals were collected at tdp4 226 gdb_test "tdump" \ 227 "q = 1" \ 228 "9.1: tdump, locals collected" 229 230 gdb_tfind_test "9.1: find frame for TP $tdp5" "tracepoint $tdp5" \ 231 "\$tracepoint" "$tdp5" 232 233 # stack was collected at tdp5, plus the frame pointer 234 gdb_test "tdump" \ 235 ".$fpreg = .*$spreg @ 64 = .*" \ 236 "9.1: tdump, memrange collected" 237 238 gdb_tfind_test "9.1: find frame for TP $tdp6" "tracepoint $tdp6" \ 239 "\$tracepoint" "$tdp6" 240 241 # globals were collected at tdp6 242 gdb_test "tdump" \ 243 "gdb_char_test = 1.*gdb_short_test = 2.*gdb_long_test = 3" \ 244 "9.1: tdump, global variables collected" 245 246 # 9.2 test tdump with arguments 247 # [no go, tdump doesn't have any arguments] 248 249 set linecount1 0 250 set linecount2 0 251 set linecount3 0 252 set linecount4 0 253 set linecount5 0 254 set linecount6 0 255 256 gdb_tfind_test "11.x, 12.1: find start frame" "start" "0" 257 258 # 259 # 11.x test built-in trace variables $trace_frame, $trace_line etc. 260 # 261 262 gdb_test "printf \"x %d x\\n\", \$trace_frame" "x 0 x" \ 263 "11.1: test \$trace_frame" 264 265 gdb_test "printf \"x %d x\\n\", \$tracepoint" "x $tdp1 x" \ 266 "11.2: test \$tracepoint" 267 268 gdb_test "printf \"x %d x\\n\", \$trace_line" "x $testline1 x" \ 269 "11.3: test \$trace_line" 270 271 gdb_test_multiple "print \$trace_file" "11.4: test \$trace_file" { 272 -re "\\$\[0-9\]+ = \"$srcfile\"\[\r\n\]+$gdb_prompt $" { 273 pass "11.4: test \$trace_file" 274 } 275 -re "\\$\[0-9\]+ = \"$srcdir/$subdir/$srcfile\"\[\r\n\]+$gdb_prompt $" { 276 pass "11.4: test \$trace_file" 277 } 278 } 279 280 #gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \ 281 # "11.4: test \$trace_file" 282 283 # 284 # 12.x test report generation using arbitrary GDB commands, loops etc. 285 # 286 287 gdb_test_multiple "while \$trace_frame != -1\n output \$trace_file\n printf \", line \%d \(tracepoint #\%d\)\\n\", \$trace_line, \$tracepoint\n tfind\n end" "12.1: trace report #1" { 288 -re "> end\r\n" { 289 exp_continue 290 } 291 -re "^Found trace frame \[0-9\]+, tracepoint \[0-9\]+\r\n" { 292 exp_continue 293 } 294 -re "^\[^\r\n\]* line $testline1 .tracepoint .$tdp1\\)\r\n" { 295 set linecount1 [expr $linecount1 + 1] 296 exp_continue 297 } 298 -re "^\[^\r\n\]* line $testline2 .tracepoint .$tdp2\\)\r\n" { 299 set linecount2 [expr $linecount2 + 1] 300 exp_continue 301 } 302 -re "^\[^\r\n\]* line $testline3 .tracepoint .$tdp3\\)\r\n" { 303 set linecount3 [expr $linecount3 + 1] 304 exp_continue 305 } 306 -re "^\[^\r\n\]* line $testline4 .tracepoint .$tdp4\\)\r\n" { 307 set linecount4 [expr $linecount4 + 1] 308 exp_continue 309 } 310 -re "^\[^\r\n\]* line $testline5 .tracepoint .$tdp5\\)\r\n" { 311 set linecount5 [expr $linecount5 + 1] 312 exp_continue 313 } 314 -re "^\[^\r\n\]* line $testline6 .tracepoint .$tdp6\\)\r\n" { 315 set linecount6 [expr $linecount6 + 1] 316 exp_continue 317 } 318 -re "^No trace frame found\r\n$gdb_prompt $" { 319 if { ($linecount1 < 4) || ($linecount2 < 4) || ($linecount3 < 4) || ($linecount4 < 4) || ($linecount5 < 4) || ($linecount6 < 4) } { 320 fail "12.1: trace report #1" 321 } else { 322 pass "12.1: trace report #1" 323 } 324 } 325 } 326 327 gdb_tfind_test "12.2: tfind end, selects no frame" "end" "-1" 328 gdb_tfind_test "12.2: find first TDP #2 frame" "tracepoint $tdp2" \ 329 "\$tracepoint" "$tdp2" 330 331 set linecount2 0 332 333 gdb_test_multiple "while \$trace_frame != -1\n printf \"tracepoint #\%d, FP 0x\%08x, SP 0x\%08x, PC 0x%08x\\n\", \$tracepoint, \$fp, \$sp, \$pc\n tfind tracepoint\n end" "12.2: trace report #2" { 334 -re "tracepoint #$tdp2, FP $hex, SP $hex, PC $hex" { 335 set linecount2 [expr $linecount2 + 1] 336 exp_continue 337 } 338 -re ".*$gdb_prompt $" { 339 if { ($linecount2 < 4) } { 340 fail "12.2: trace report #2" 341 } else { 342 pass "12.2: trace report #2" 343 } 344 } 345 } 346 347 gdb_tfind_test "12.3: tfind end, selects no frame" "end" "-1" 348 gdb_tfind_test "12.3: find first TDP #3 frame" "tracepoint $tdp3" \ 349 "\$tracepoint" "$tdp3" 350 351 set linecount3 0 352 353 gdb_test_multiple "while \$trace_frame != -1\n printf \"TDP #\%d, frame \%d: depth = \%d, q1 = \%d\\n\", \$tracepoint, \$trace_frame, depth, q1\n tfind tracepoint\n end" "12.3: trace report #3" { 354 -re "TDP #$tdp3, frame $decimal: depth = $decimal, q1 = $decimal" { 355 set linecount3 [expr $linecount3 + 1] 356 exp_continue 357 } 358 -re ".*$gdb_prompt $" { 359 if { ($linecount3 < 4) } { 360 fail "12.3: trace report #3" 361 } else { 362 pass "12.3: trace report #3" 363 } 364 } 365 } 366 367 gdb_tfind_test "12.4: tfind end, selects no frame" "end" "-1" 368 gdb_tfind_test "12.4: find first TDP #6 frame" "tracepoint $tdp6" \ 369 "\$tracepoint" "$tdp6" 370 371 set linecount6 0 372 373 gdb_test_multiple "while \$trace_frame != -1\n printf \"TDP #\%d, frame %d: char_test = \%d, long_test = \%d\\n\", \$tracepoint, \$trace_frame, gdb_char_test, gdb_long_test\n tfind tracepoint\n end" "12.4: trace report #4" { 374 -re "TDP #$tdp6, frame $decimal: char_test = $arg1, long_test = $arg3" { 375 set linecount6 [expr $linecount6 + 1] 376 exp_continue 377 } 378 -re ".*$gdb_prompt $" { 379 if { ($linecount6 < 4) } { 380 fail "12.4: trace report #4" 381 } else { 382 pass "12.4: trace report #4" 383 } 384 } 385 } 386 387 # There is always a thread of an inferior, either a live one or 388 # a faked one. 389 gdb_test "info threads" "\\* ${decimal} (process|Thread) \[0-9\.\]+\[ \t\].*" 390 gdb_test "info inferiors" "\\* 1 process ${decimal} \[ \t\]+${binfile}.*" 391 } 392} 393 394use_collected_data "live" 395 396# Finished! 397gdb_tfind_test "finished: make sure not debugging any trace frame" \ 398 "none" "-1" 399 400# Save trace frames to tfile. 401set tracefile [standard_output_file ${testfile}] 402gdb_test "tsave ${tracefile}.tf" \ 403 "Trace data saved to file '${tracefile}.tf'.*" \ 404 "save tfile trace file" 405 406# Save trace frames to ctf. 407gdb_test "tsave -ctf ${tracefile}.ctf" \ 408 "Trace data saved to directory '${tracefile}.ctf'.*" \ 409 "save ctf trace file" 410 411# Change target to tfile. 412set test "change to tfile target" 413gdb_test_multiple "target tfile ${tracefile}.tf" "$test" { 414 -re "A program is being debugged already. Kill it. .y or n. " { 415 send_gdb "y\n" 416 exp_continue 417 } 418 -re "$gdb_prompt $" { 419 pass "$test" 420 } 421} 422# Test the collected trace frames from tfile. 423use_collected_data "tfile" 424 425# Try to read ctf data if GDB supports. 426gdb_test_multiple "target ctf ${tracefile}.ctf" "" { 427 -re "Undefined target command: \"ctf ${tracefile}.ctf\"\. Try \"help target\"\.\r\n$gdb_prompt $" { 428 } 429 -re ".*\r\n$gdb_prompt $" { 430 use_collected_data "ctf" 431 } 432} 433