RE: [PATCH 1/2] Check trace data from trace file

Abid, Hafiz
2013-02-25T14:10:20Z

Yao,
To avoid confusion, previously, I was using GDB command line and there the loop was terminating OK. I just tried your patched report.exp file and it does give an infinite loop.

Regards,
Abid
________________________________________
From: gdb-patches-owner@sourceware.org [gdb-patches-owner@sourceware.org] on behalf of Abid, Hafiz
Sent: Monday, February 25, 2013 12:03 PM
To: Qi, Yao; gdb-patches@sourceware.org
Subject: RE: [PATCH 1/2] Check trace data from trace file

Hi Yao,
FWIW, the loop that you mentioned below works OK for me and terminates correctly. I tried it on GDB that came with the distribution and one built from the recent sources.

Regards,
Abid
________________________________________
From: gdb-patches-owner@sourceware.org [gdb-patches-owner@sourceware.org] on behalf of Qi, Yao
Sent: Monday, February 25, 2013 2:57 AM
To: gdb-patches@sourceware.org
Subject: [PATCH 1/2] Check trace data from trace file

GDB is able to save trace data to trace file via 'tsave' and read
trace data by target 'tfile', however, we don't have a test case. We
have some test cases getting trace data from live inferior, so I have
an idea to "refactor" the test case, so it gets trace data from either
live inferior or trace file. This is also useful to verify that GDB
behaves the same way when data is from either live inferior or trace
file. Secondly, when we support a new trace file format, such as CTF,
it is easy to change test cases to test GDB still behaves correctly on
the new trace file format.

This patch moves code about checking trace data into a proc
"use_collected_data", and invoke it for different targets (live
inferior and tfile). This patch causes an endless loop when executing
this in GDB, which is a bug in GDB.

(gdb) while $trace_frame != -1
> printf "tracepoint #%d, FP 0x%08x, SP 0x%08x, PC 0x%08x\n",
> $tracepoint, $fp, $sp, $pc
> tfind tracepoint
> end
tracepoint #3, FP 0xbfffe808, SP 0xbfffe7d0, PC 0x080483d0^M
Found trace frame 1, tracepoint 3^M
tracepoint #3, FP 0xbfffe808, SP 0xbfffe7d0, PC 0x080483d0
Found trace frame 1, tracepoint 3^M
tracepoint #3, FP 0xbfffe808, SP 0xbfffe7d0, PC 0x080483d0^

The next patch is to fix this bug.

gdb/testsuite:

2013-02-25 Yao Qi <yao@codesourcery.com>

* gdb.trace/report.exp: Move some code to ...
(use_collected_data): ... here. New.
---
gdb/testsuite/gdb.trace/report.exp | 315 ++++++++++++++++++++----------------
1 files changed, 174 insertions(+), 141 deletions(-)

diff --git a/gdb/testsuite/gdb.trace/report.exp b/gdb/testsuite/gdb.trace/report.exp
index e8aa597..6139485 100644
--- a/gdb/testsuite/gdb.trace/report.exp
+++ b/gdb/testsuite/gdb.trace/report.exp
@@ -181,210 +181,243 @@ gdb_test "continue" \

gdb_test "tstop" ".*" ""

-#
-# 9.1 test the tdump command
-#
+gdb_tfind_test "9.1: init: make sure not debugging any trace frame" \
+ "none" "-1"

-set timeout 60
+# 9.3 help tdump

-gdb_tfind_test "9.1: init: make sure not debugging any trace frame" "none" "-1"
+gdb_test "help tdump" "Print everything collected at the current.*" \
+ "9.3: help tdump"

-gdb_tfind_test "9.1: find frame for TP $tdp1" "tracepoint $tdp1" \
+# Check the collected trace data from different sources, such as live
+# infeiror and tfile.
+
+proc use_collected_data { data_source } { with_test_prefix "${data_source}" {
+ global tdp1 tdp2 tdp3 tdp4 tdp5 tdp6
+ global testline1 testline2 testline3 testline4 testline5 testline6
+ global pcreg fpreg spreg
+ global srcfile srcdir subdir
+ global arg1 arg3
+ global decimal hex gdb_prompt
+ #
+ # 9.1 test the tdump command
+ #
+
+ set timeout 60
+
+ gdb_tfind_test "9.1: find frame for TP $tdp1" "tracepoint $tdp1" \
"\$tracepoint" "$tdp1"

-# Nothing was collected at tdp1, so this tdump should be empty.
-gdb_test "tdump" \
- "Data collected at tracepoint $tdp1, trace frame $decimal:" \
+ # Nothing was collected at tdp1, so this tdump should be empty.
+ gdb_test "tdump" \
+ "Data collected at tracepoint $tdp1, trace frame $decimal:\(\|\\r\\nPC register is not available\)" \
"9.1: tdump, nothing collected"

-gdb_tfind_test "9.1: find frame for TP $tdp2" "tracepoint $tdp2" \
+ gdb_tfind_test "9.1: find frame for TP $tdp2" "tracepoint $tdp2" \
"\$tracepoint" "$tdp2"

-# regs were collected at tdp2.
-# How to match for the output of "info registers" on an unknown architecture?
-# For now, assume that most architectures have a register called "pc".
+ # regs were collected at tdp2.
+ # How to match for the output of "info registers" on an unknown architecture?
+ # For now, assume that most architectures have a register called "pc".

-gdb_test "tdump" \
- "\[\r\n\]$pcreg .*" \
- "9.1: tdump, regs collected"
+ gdb_test "tdump" \
+ "\[\r\n\]$pcreg .*" \
+ "9.1: tdump, regs collected"

-gdb_tfind_test "9.1: find frame for TP $tdp3" "tracepoint $tdp3" \
+ gdb_tfind_test "9.1: find frame for TP $tdp3" "tracepoint $tdp3" \
"\$tracepoint" "$tdp3"

-# args were collected at tdp3
-gdb_test "tdump" \
+ # args were collected at tdp3
+ gdb_test "tdump" \
"depth = 3.*q1 = 2.*q2 = 2.*q3 = 3.*q4 = 4.*q5 = 5.*q6 = 6" \
"9.1: tdump, args collected"

-gdb_tfind_test "9.1: find frame for TP $tdp4" "tracepoint $tdp4" \
+ gdb_tfind_test "9.1: find frame for TP $tdp4" "tracepoint $tdp4" \
"\$tracepoint" "$tdp4"

-# locals were collected at tdp4
-gdb_test "tdump" \
+ # locals were collected at tdp4
+ gdb_test "tdump" \
"q = 1" \
"9.1: tdump, locals collected"

-gdb_tfind_test "9.1: find frame for TP $tdp5" "tracepoint $tdp5" \
+ gdb_tfind_test "9.1: find frame for TP $tdp5" "tracepoint $tdp5" \
"\$tracepoint" "$tdp5"

-# stack was collected at tdp5, plus the frame pointer
-gdb_test "tdump" \
- ".$fpreg = .*$spreg @ 64 = .*" \
- "9.1: tdump, memrange collected"
+ # stack was collected at tdp5, plus the frame pointer
+ gdb_test "tdump" \
+ ".$fpreg = .*$spreg @ 64 = .*" \
+ "9.1: tdump, memrange collected"

-gdb_tfind_test "9.1: find frame for TP $tdp6" "tracepoint $tdp6" \
+ gdb_tfind_test "9.1: find frame for TP $tdp6" "tracepoint $tdp6" \
"\$tracepoint" "$tdp6"

-# globals were collected at tdp6
-gdb_test "tdump" \
+ # globals were collected at tdp6
+ gdb_test "tdump" \
"gdb_char_test = 1.*gdb_short_test = 2.*gdb_long_test = 3" \
"9.1: tdump, global variables collected"

-# 9.2 test tdump with arguments
-# [no go, tdump doesn't have any arguments]
+ # 9.2 test tdump with arguments
+ # [no go, tdump doesn't have any arguments]

-# 9.3 help tdump
+ set linecount1 0
+ set linecount2 0
+ set linecount3 0
+ set linecount4 0
+ set linecount5 0
+ set linecount6 0

-gdb_test "help tdump" "Print everything collected at the current.*" \
- "9.3: help tdump"
-
-set linecount1 0
-set linecount2 0
-set linecount3 0
-set linecount4 0
-set linecount5 0
-set linecount6 0
-
-gdb_tfind_test "11.x, 12.1: find start frame" "start" "0"
+ gdb_tfind_test "11.x, 12.1: find start frame" "start" "0"

-#
-# 11.x test built-in trace variables $trace_frame, $trace_line etc.
-#
+ #
+ # 11.x test built-in trace variables $trace_frame, $trace_line etc.
+ #

-gdb_test "printf \"x %d x\\n\", \$trace_frame" "x 0 x" \
+ gdb_test "printf \"x %d x\\n\", \$trace_frame" "x 0 x" \
"11.1: test \$trace_frame"

-gdb_test "printf \"x %d x\\n\", \$tracepoint" "x $tdp1 x" \
+ gdb_test "printf \"x %d x\\n\", \$tracepoint" "x $tdp1 x" \
"11.2: test \$tracepoint"

-gdb_test "printf \"x %d x\\n\", \$trace_line" "x $testline1 x" \
+ gdb_test "printf \"x %d x\\n\", \$trace_line" "x $testline1 x" \
"11.3: test \$trace_line"

-gdb_test_multiple "print \$trace_file" "11.4: test \$trace_file" {
- -re "\\$\[0-9\]+ = \"$srcfile\"\[\r\n\]+$gdb_prompt $" {
- pass "11.4: test \$trace_file"
- }
- -re "\\$\[0-9\]+ = \"$srcdir/$subdir/$srcfile\"\[\r\n\]+$gdb_prompt $" {
- pass "11.4: test \$trace_file"
+ gdb_test_multiple "print \$trace_file" "11.4: test \$trace_file" {
+ -re "\\$\[0-9\]+ = \"$srcfile\"\[\r\n\]+$gdb_prompt $" {
+ pass "11.4: test \$trace_file"
+ }
+ -re "\\$\[0-9\]+ = \"$srcdir/$subdir/$srcfile\"\[\r\n\]+$gdb_prompt $" {
+ pass "11.4: test \$trace_file"
+ }
}
-}

-#gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \
-# "11.4: test \$trace_file"
+ #gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \
+ # "11.4: test \$trace_file"

-#
-# 12.x test report generation using arbitrary GDB commands, loops etc.
-#
+ #
+ # 12.x test report generation using arbitrary GDB commands, loops etc.
+ #

-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" {
- -re "> end\r\n" {
- exp_continue
- }
- -re "^Found trace frame \[0-9\]+, tracepoint \[0-9\]+\r\n" {
- exp_continue
- }
- -re "^\[^\r\n\]* line $testline1 .tracepoint .$tdp1\\)\r\n" {
- set linecount1 [expr $linecount1 + 1]
- exp_continue
- }
- -re "^\[^\r\n\]* line $testline2 .tracepoint .$tdp2\\)\r\n" {
- set linecount2 [expr $linecount2 + 1]
- exp_continue
- }
- -re "^\[^\r\n\]* line $testline3 .tracepoint .$tdp3\\)\r\n" {
- set linecount3 [expr $linecount3 + 1]
- exp_continue
- }
- -re "^\[^\r\n\]* line $testline4 .tracepoint .$tdp4\\)\r\n" {
- set linecount4 [expr $linecount4 + 1]
- exp_continue
- }
- -re "^\[^\r\n\]* line $testline5 .tracepoint .$tdp5\\)\r\n" {
- set linecount5 [expr $linecount5 + 1]
- exp_continue
- }
- -re "^\[^\r\n\]* line $testline6 .tracepoint .$tdp6\\)\r\n" {
- set linecount6 [expr $linecount6 + 1]
- exp_continue
- }
- -re "^No trace frame found\r\n$gdb_prompt $" {
- if { ($linecount1 < 4) || ($linecount2 < 4) || ($linecount3 < 4) || ($linecount4 < 4) || ($linecount5 < 4) || ($linecount6 < 4) } {
- fail "12.1: trace report #1"
- } else {
- pass "12.1: trace report #1"
+ 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" {
+ -re "> end\r\n" {
+ exp_continue
+ }
+ -re "^Found trace frame \[0-9\]+, tracepoint \[0-9\]+\r\n" {
+ exp_continue
+ }
+ -re "^\[^\r\n\]* line $testline1 .tracepoint .$tdp1\\)\r\n" {
+ set linecount1 [expr $linecount1 + 1]
+ exp_continue
+ }
+ -re "^\[^\r\n\]* line $testline2 .tracepoint .$tdp2\\)\r\n" {
+ set linecount2 [expr $linecount2 + 1]
+ exp_continue
+ }
+ -re "^\[^\r\n\]* line $testline3 .tracepoint .$tdp3\\)\r\n" {
+ set linecount3 [expr $linecount3 + 1]
+ exp_continue
+ }
+ -re "^\[^\r\n\]* line $testline4 .tracepoint .$tdp4\\)\r\n" {
+ set linecount4 [expr $linecount4 + 1]
+ exp_continue
+ }
+ -re "^\[^\r\n\]* line $testline5 .tracepoint .$tdp5\\)\r\n" {
+ set linecount5 [expr $linecount5 + 1]
+ exp_continue
+ }
+ -re "^\[^\r\n\]* line $testline6 .tracepoint .$tdp6\\)\r\n" {
+ set linecount6 [expr $linecount6 + 1]
+ exp_continue
+ }
+ -re "^No trace frame found\r\n$gdb_prompt $" {
+ if { ($linecount1 < 4) || ($linecount2 < 4) || ($linecount3 < 4) || ($linecount4 < 4) || ($linecount5 < 4) || ($linecount6 < 4) } {
+ fail "12.1: trace report #1"
+ } else {
+ pass "12.1: trace report #1"
+ }
}
}
-}

-gdb_tfind_test "12.2: tfind end, selects no frame" "end" "-1"
-gdb_tfind_test "12.2: find first TDP #2 frame" "tracepoint $tdp2" \
+ gdb_tfind_test "12.2: tfind end, selects no frame" "end" "-1"
+ gdb_tfind_test "12.2: find first TDP #2 frame" "tracepoint $tdp2" \
"\$tracepoint" "$tdp2"

-set linecount2 0
+ set linecount2 0

-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" {
- -re "tracepoint #$tdp2, FP $hex, SP $hex, PC $hex" {
- set linecount2 [expr $linecount2 + 1]
- exp_continue
- }
- -re ".*$gdb_prompt $" {
- if { ($linecount2 < 4) } {
- fail "12.2: trace report #2"
- } else {
- pass "12.2: trace report #2"
+ 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" {
+ -re "tracepoint #$tdp2, FP $hex, SP $hex, PC $hex" {
+ set linecount2 [expr $linecount2 + 1]
+ exp_continue
+ }
+ -re ".*$gdb_prompt $" {
+ if { ($linecount2 < 4) } {
+ fail "12.2: trace report #2"
+ } else {
+ pass "12.2: trace report #2"
+ }
}
}
-}

-gdb_tfind_test "12.3: tfind end, selects no frame" "end" "-1"
-gdb_tfind_test "12.3: find first TDP #3 frame" "tracepoint $tdp3" \
+ gdb_tfind_test "12.3: tfind end, selects no frame" "end" "-1"
+ gdb_tfind_test "12.3: find first TDP #3 frame" "tracepoint $tdp3" \
"\$tracepoint" "$tdp3"

-set linecount3 0
+ set linecount3 0

-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" {
- -re "TDP #$tdp3, frame $decimal: depth = $decimal, q1 = $decimal" {
- set linecount3 [expr $linecount3 + 1]
- exp_continue
- }
- -re ".*$gdb_prompt $" {
- if { ($linecount3 < 4) } {
- fail "12.3: trace report #3"
- } else {
- pass "12.3: trace report #3"
+ 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" {
+ -re "TDP #$tdp3, frame $decimal: depth = $decimal, q1 = $decimal" {
+ set linecount3 [expr $linecount3 + 1]
+ exp_continue
+ }
+ -re ".*$gdb_prompt $" {
+ if { ($linecount3 < 4) } {
+ fail "12.3: trace report #3"
+ } else {
+ pass "12.3: trace report #3"
+ }
}
}
-}

-gdb_tfind_test "12.4: tfind end, selects no frame" "end" "-1"
-gdb_tfind_test "12.4: find first TDP #6 frame" "tracepoint $tdp6" \
+ gdb_tfind_test "12.4: tfind end, selects no frame" "end" "-1"
+ gdb_tfind_test "12.4: find first TDP #6 frame" "tracepoint $tdp6" \
"\$tracepoint" "$tdp6"

-set linecount6 0
+ set linecount6 0

-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" {
- -re "TDP #$tdp6, frame $decimal: char_test = $arg1, long_test = $arg3" {
- set linecount6 [expr $linecount6 + 1]
- exp_continue
- }
- -re ".*$gdb_prompt $" {
- if { ($linecount6 < 4) } {
- fail "12.4: trace report #4"
- } else {
- pass "12.4: trace report #4"
+ 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" {
+ -re "TDP #$tdp6, frame $decimal: char_test = $arg1, long_test = $arg3" {
+ set linecount6 [expr $linecount6 + 1]
+ exp_continue
+ }
+ -re ".*$gdb_prompt $" {
+ if { ($linecount6 < 4) } {
+ fail "12.4: trace report #4"
+ } else {
+ pass "12.4: trace report #4"
+ }
}
}
}
+}
+
+use_collected_data "live"

# Finished!
-gdb_tfind_test "finished: make sure not debugging any trace frame" "none" "-1"
+gdb_tfind_test "finished: make sure not debugging any trace frame" \
+ "none" "-1"
+
+# Save trace frames to tfile.
+gdb_test "tsave report.tf" "Trace data saved to file 'report.tf'.*"
+
+# Change target to tfile.
+set test "change to tfile target"
+gdb_test_multiple "target tfile report.tf" "$test" {
+ -re "A program is being debugged already. Kill it. .y or n. " {
+ send_gdb "y\n"
+ exp_continue
+ }
+ -re "$gdb_prompt $" {
+ pass "$test"
+ }
+}
+# Test the collected trace frames from tfile.
+use_collected_data "tfile"
--
1.7.7.6