From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9831 invoked by alias); 20 Mar 2013 18:23:33 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 9810 invoked by uid 89); 20 Mar 2013 18:23:25 -0000 X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.1 Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Wed, 20 Mar 2013 18:23:21 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1UINfT-0001ns-HK from Hafiz_Abid@mentor.com for gdb-patches@sourceware.org; Wed, 20 Mar 2013 11:23:19 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Wed, 20 Mar 2013 11:23:19 -0700 Received: from abidh-ubunto1104 (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server (TLS) id 14.1.289.1; Wed, 20 Mar 2013 18:23:17 +0000 Date: Wed, 20 Mar 2013 18:26:00 -0000 From: "Abid, Hafiz" Subject: [patch] circ.exp To: Message-ID: <1363803795.2570.4@abidh-ubunto1104> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-wL6qyYkaMHbqh6JjLjR3" X-SW-Source: 2013-03/txt/msg00761.txt.bz2 --=-wL6qyYkaMHbqh6JjLjR3 Content-Type: text/plain; charset="us-ascii"; delsp=Yes; format=Flowed Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-length: 1966 Hi All, This is patch to refactor circ.exp. I noticed that it was quitting=20=20 early as gdb_target_supports_trace was failing. There were some other=20=20 issues too. After the changes, it is running to completion. How does=20=20 it look? One test is failing that probably shows a defect. Following session,=20=20 which is edited for clarity, shows the problem. When there is not=20=20 enough buffer left (3rd frame onward), target does not stop the trace.=20= =20=20 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 =3D {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 =3D { } Regards, Abid gdb/testsuite: 2013-03-20 Hafiz Abid Qadeer * 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.= --=-wL6qyYkaMHbqh6JjLjR3 Content-Type: text/x-patch; charset="us-ascii"; name="circ.patch" Content-Disposition: attachment; filename="circ.patch" Content-Transfer-Encoding: quoted-printable Content-length: 8849 diff --git a/gdb/testsuite/gdb.trace/circ.exp b/gdb/testsuite/gdb.trace/cir= c.exp index 4c47228..5c50132 100644 --- a/gdb/testsuite/gdb.trace/circ.exp +++ b/gdb/testsuite/gdb.trace/circ.exp @@ -15,7 +15,6 @@ =20 load_lib "trace-support.exp" =20 - standard_testfile =20 if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug nowarning= s}]} { @@ -35,23 +34,8 @@ if {[prepare_for_testing $testfile.exp $testfile $srcfil= e {debug nowarnings}]} { # several frames are collected, but the first several are not. # =20 -# return 0 for success, 1 for failure -proc run_trace_experiment { pass } { - gdb_run_cmd=20 - - 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 } =20 -# 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 } =20 -# 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 =20 - 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 =20 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 } =20 -# return 0 for success, 1 for failure -proc gdb_trace_circular_tests { } { - if { ![gdb_target_supports_trace] } then {=20 - 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 {=20 - 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 {=20 - 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 +} =20 - if [gdb_test "tfind 9" \ - "#0 func9 .*" \ - "find frame nine, pass 3"] then { return 1 } +if { ![gdb_target_supports_trace] } then {=20 + unsupported "target does not support trace" + return 1 +} =20 - 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"=20 + return 1 +} =20 - return 0 +if { [support_trace_packet "QTBuffer:circular:0"] } then { + unsupported "target does not support circular trace buffer"=20 + return 1 } =20 gdb_test_no_output "set circular-trace-buffer on" \ "set circular-trace-buffer on" =20 -gdb_test "show circular-trace-buffer" "Target's use of circular trace buff= er 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)" =20 gdb_test_no_output "set circular-trace-buffer off" \ "set circular-trace-buffer off" =20 -gdb_test "show circular-trace-buffer" "Target's use of circular trace buff= er 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=20 +} + +# 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" =20 -# 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=20 } =20 -# 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"; --=-wL6qyYkaMHbqh6JjLjR3--