[patch] circ.exp

Abid, Hafiz
2013-03-20T18:23:33Z

[-- Attachment #1: Type: text/plain, Size: 2004 bytes --]

Hi All,
This is patch to refactor circ.exp. I noticed that it was quitting
early as gdb_target_supports_trace was failing. There were some other
issues too. After the changes, it is running to completion. How does
it look?

One test is failing that probably shows a defect. Following session,
which is edited for clarity, shows the problem. When there is not
enough buffer left (3rd frame onward), target does not stop the trace.
It continues but only uses 6 bytes for the frame.

(gdb) set trace-buffer-size 200
(gdb) tstart
(gdb) c
...
(gdb) tstatus
Collected 1 trace frames.
Trace buffer has 131 bytes of 200 bytes free (34% full).
...
(gdb) c
...
(gdb) tstatus
Collected 2 trace frames.
Trace buffer has 62 bytes of 200 bytes free (69% full).
...
(gdb) c
...
(gdb) tstatus
Trace is running on the target.
Collected 3 trace frames.
Trace buffer has 56 bytes of 200 bytes free (72% full).
...
(gdb) c
...
(gdb) tstatus
Collected 4 trace frames.
Trace buffer has 50 bytes of 200 bytes free (75% full).
...
(gdb) c
...
(gdb) tstatus
Collected 5 trace frames.
Trace buffer has 44 bytes of 200 bytes free (78% full).
...
(gdb) tstop
(gdb) tfind start
Found trace frame 0, tracepoint 11
#0 func0 () at ../.././../git/gdb/testsuite/gdb.trace/circ.c:11
11 }
(gdb) p testload
$4 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
(gdb) tfind 4
Found trace frame 4, tracepoint 5
27 }
(gdb) p testload
$5 = {<unavailable> <repeats 13 times>}

Regards,
Abid

gdb/testsuite:

2013-03-20 Hafiz Abid Qadeer <abidh@codesourcery.com>

* gdb.trace/circ.exp: (run_trace_experiment): Test
setup_tracepoints and 'break end' in it.
(trace_buffer_normal): Refactor it to...
(support_trace_packet). ..this.
(gdb_trace_circular_tests): Remove. Move tests to...
(top level): ... here. Call 'runto_main' before checking for
trace support. Call 'support_trace_packets' to check the
support for QTBuffer:size and QTBuffer:circular.

[-- Attachment #2: circ.patch --]
[-- Type: text/x-patch, Size: 9067 bytes --]

diff --git a/gdb/testsuite/gdb.trace/circ.exp b/gdb/testsuite/gdb.trace/circ.exp
index 4c47228..5c50132 100644
--- a/gdb/testsuite/gdb.trace/circ.exp
+++ b/gdb/testsuite/gdb.trace/circ.exp
@@ -15,7 +15,6 @@

load_lib "trace-support.exp"

-
standard_testfile

if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug nowarnings}]} {
@@ -35,23 +34,8 @@ if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug nowarnings}]} {
# several frames are collected, but the first several are not.
#

-# return 0 for success, 1 for failure
-proc run_trace_experiment { pass } {
- gdb_run_cmd
-
- if [gdb_test "tstart" \
- "\[\r\n\]*" \
- "start trace experiment, pass $pass"] then { return 1 }
- if [gdb_test "continue" \
- "Continuing.*Breakpoint \[0-9\]+, end.*" \
- "run to end, pass $pass"] then { return 1 }
- if [gdb_test "tstop" \
- "\[\r\n\]*" \
- "stop trace experiment, pass $pass"] then { return 1 }
- return 0
-}
-
-# return 0 for success, 1 for failure
+# Set a tracepoint on given func. Return 0 for success,
+# 1 for failure.
proc set_a_tracepoint { func } {
if [gdb_test "trace $func" \
"Tracepoint \[0-9\]+ at .*" \
@@ -66,7 +50,8 @@ proc set_a_tracepoint { func } {
return 0
}

-# return 0 for success, 1 for failure
+# Sets the tracepoints from func0 to func9 using
+# set_a_tracepoint. Return 0 for success, 1 for failure.
proc setup_tracepoints { } {
gdb_delete_tracepoints
if [set_a_tracepoint func0] then { return 1 }
@@ -82,27 +67,33 @@ proc setup_tracepoints { } {
return 0
}

-# return 0 for success, 1 for failure
-proc trace_buffer_normal { } {
- global gdb_prompt
+# Start the trace, run to end and then stop the trace.
+# Return 0 for success, 1 for failure.
+proc run_trace_experiment { pass } {
+ global decimal

- set ok 0
- set test "maint packet QTBuffer:size:ffffffff"
- gdb_test_multiple $test $test {
- -re "received: .OK.\r\n$gdb_prompt $" {
- set ok 1
- pass $test
- }
- -re "\r\n$gdb_prompt $" {
- }
- }
- if { !$ok } {
- unsupported $test
- return 1
- }
+ if [setup_tracepoints] then { return 1 }
+ if [gdb_test "break end" "Breakpoint $decimal.*" \
+ "breakpoint at end, pass $pass"] then { return 1 }
+ if [gdb_test "tstart" \
+ "\[\r\n\]*" \
+ "start trace experiment $pass"] then { return 1 }
+ if [gdb_test "continue" \
+ "Continuing.*Breakpoint \[0-9\]+, end.*" \
+ "run to end, pass $pass"] then { return 1 }
+ if [gdb_test "tstop" \
+ "\[\r\n\]*" \
+ "stop trace experiment $pass"] then { return 1 }
+ return 0
+}
+
+# Test if the target support the gien packet.
+# Return 0 for success, 1 for failure
+proc support_trace_packet { packet } {
+ global gdb_prompt

set ok 0
- set test "maint packet QTBuffer:circular:0"
+ set test "maint packet $packet"
gdb_test_multiple $test $test {
-re "received: .OK.\r\n$gdb_prompt $" {
set ok 1
@@ -119,98 +110,103 @@ proc trace_buffer_normal { } {
return 0
}

-# return 0 for success, 1 for failure
-proc gdb_trace_circular_tests { } {
- if { ![gdb_target_supports_trace] } then {
- unsupported "Current target does not support trace"
- return 1
- }
-
- if [trace_buffer_normal] then { return 1 }
-
- gdb_test "break begin" ".*" ""
- gdb_test "break end" ".*" ""
- gdb_test "tstop" ".*" ""
- gdb_test "tfind none" ".*" ""
-
- if [setup_tracepoints] then { return 1 }
-
- # First, run the trace experiment with default attributes:
- # Make sure it behaves as expected.
- if [run_trace_experiment 1] then { return 1 }
- if [gdb_test "tfind start" \
- "#0 func0 .*" \
- "find frame zero, pass 1"] then { return 1 }
-
- if [gdb_test "tfind 9" \
- "#0 func9 .*" \
- "find frame nine, pass 1"] then { return 1 }
-
- if [gdb_test "tfind none" \
- "#0 end .*" \
- "quit trace debugging, pass 1"] then { return 1 }
-
- # Then, shrink the trace buffer so that it will not hold
- # all ten trace frames. Verify that frame zero is still
- # collected, but frame nine is not.
- if [gdb_test "maint packet QTBuffer:size:200" \
- "received: .OK." "shrink the target trace buffer"] then {
- return 1
- }
- if [run_trace_experiment 2] then { return 1 }
- if [gdb_test "tfind start" \
- "#0 func0 .*" \
- "find frame zero, pass 2"] then { return 1 }
-
- if [gdb_test "tfind 9" \
- ".* failed to find .*" \
- "fail to find frame nine, pass 2"] then { return 1 }
-
- if [gdb_test "tfind none" \
- "#0 end .*" \
- "quit trace debugging, pass 2"] then { return 1 }
-
- # Finally, make the buffer circular. Now when it runs out of
- # space, it should wrap around and overwrite the earliest frames.
- # This means that:
- # 1) frame zero will be overwritten and therefore unavailable
- # 2) the earliest frame in the buffer will be other-than-zero
- # 3) frame nine will be available (unlike on pass 2).
- if [gdb_test "maint packet QTBuffer:circular:1" \
- "received: .OK." "make the target trace buffer circular"] then {
- return 1
- }
- if [run_trace_experiment 3] then { return 1 }
- if [gdb_test "tfind start" \
- "#0 func\[1-9\] .*" \
- "first frame is NOT frame zero, pass 3"] then { return 1 }
+if { ![runto_main] } {
+ fail "can't run to main to check for trace support"
+ return -1
+}

- if [gdb_test "tfind 9" \
- "#0 func9 .*" \
- "find frame nine, pass 3"] then { return 1 }
+if { ![gdb_target_supports_trace] } then {
+ unsupported "target does not support trace"
+ return 1
+}

- if [gdb_test "tfind none" \
- "#0 end .*" \
- "quit trace debugging, pass 3"] then { return 1 }
+if { [support_trace_packet "QTBuffer:size:-1"] } then {
+ unsupported "target does not support changing trace buffer size"
+ return 1
+}

- return 0
+if { [support_trace_packet "QTBuffer:circular:0"] } then {
+ unsupported "target does not support circular trace buffer"
+ return 1
}

gdb_test_no_output "set circular-trace-buffer on" \
"set circular-trace-buffer on"

-gdb_test "show circular-trace-buffer" "Target's use of circular trace buffer is on." "show circular-trace-buffer (on)"
+gdb_test "show circular-trace-buffer" \
+ "Target's use of circular trace buffer is on." \
+ "show circular-trace-buffer (on)"

gdb_test_no_output "set circular-trace-buffer off" \
"set circular-trace-buffer off"

-gdb_test "show circular-trace-buffer" "Target's use of circular trace buffer is off." "show circular-trace-buffer (off)"
+gdb_test "show circular-trace-buffer" \
+ "Target's use of circular trace buffer is off." \
+ "show circular-trace-buffer (off)"
+
+set pass 1
+if { [run_trace_experiment $pass] } then {
+ return 1
+}
+
+# Check that frame 0 is actually at func0.
+gdb_test "tfind start" ".*#0 func0 .*" \
+ "find frame zero $pass"
+
+gdb_test "tfind 9" ".*Found trace frame 9.*" \
+ "find frame nine $pass"
+
+# Pass 2. We will have smaller buffer with circular mode off.
+# We should get frame 0 at func0 but should not get frame 9.
+set buffer_size 512
+set pass 2
+clean_restart $testfile
+
+if { ![runto_main] } {
+ fail "can't run to main $pass"
+ return -1
+}
+
+# Shrink the trace buffer so that it will not hold
+# all ten trace frames.
+gdb_test_no_output "set trace-buffer-size $buffer_size" \
+ "shrink the target trace buffer, $pass"

-# Body of test encased in a proc so we can return prematurely.
-if { ![gdb_trace_circular_tests] } then {
- # Set trace buffer attributes back to normal
- trace_buffer_normal;
+if { [run_trace_experiment $pass] } then {
+ return 1
}

-# Finished!
-gdb_test "tfind none" ".*" ""
+gdb_test "tfind start" ".*#0 func0 .*" \
+ "find frame zero $pass"
+
+gdb_test "tfind 9" ".* failed to find .*" \
+ "find frame nine $pass";
+
+# Pass 3. We will have smaller and circular buffer.
+# Now when it runs out of space, it should wrap around
+# and overwrite the earliest frames.
+set pass 3
+clean_restart $testfile
+
+if { ![runto_main] } {
+ fail "can't run to main $pass"
+ return -1
+}
+
+gdb_test_no_output "set trace-buffer-size $buffer_size" \
+ "shrink the target trace buffer $pass"
+
+gdb_test_no_output "set circular-trace-buffer on" \
+ "make the target trace buffer circular"
+
+if { [run_trace_experiment $pass] } then {
+ return 1
+}
+
+gdb_test "tstatus" \
+ ".*Buffer contains $decimal trace frames \\(of $decimal created total\\).*Trace buffer is circular.*" \
+ "trace buffer is circular"
+
+# Frame 0 should not be at func0
+gdb_test "tfind start" ".*#0 func\[1-9\] .*" \
+ "first frame is NOT frame zero";