Check tracefile is generated by binary execution
authorYao Qi <yao@codesourcery.com>
Fri, 21 Mar 2014 04:52:24 +0000 (12:52 +0800)
committerYao Qi <yao@codesourcery.com>
Tue, 22 Apr 2014 01:57:44 +0000 (09:57 +0800)
In gdb.trace/tfile.exp, we execute binary to generate tracefile,

  remote_exec target "$binfile"

however, this fails on bare metal target.  This patch is to
handle binary execution failure by running binary in GDB.
The binary will do some io operation to generate tracefile, so
we need a check 'target_info exists gdb,nofileio'.

This patch is to check whether tracefile is generated.  tfile.exp can
be skipped if generation is failed, while test_tfind_tfile in
mi-traceframe-changed.exp is skipped if generated failed.  The rest of
the mi-traceframe-changed.exp can still be executed, because on some
bare metal targets, the remote stub supports tracepoint but doesn't
support fileio.

gdb/testsuite:

2014-04-22  Yao Qi  <yao@codesourcery.com>

* lib/trace-support.exp (generate_tracefile): New procedure.
* gdb.trace/tfile.exp: Skip the test if generate_tracefile
return 0.
* gdb.trace/mi-traceframe-changed.exp: Invoke test_tfind_tfile
if generate_tracefile returns 1.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.trace/mi-traceframe-changed.exp
gdb/testsuite/gdb.trace/tfile.exp
gdb/testsuite/lib/trace-support.exp

index 08a3a61bf4088ddd5f0318b9e18df44a5f6e7ffa..865fd0c1e3c20cb3e2e85f8f98d4e5f882df5c5b 100644 (file)
@@ -1,3 +1,11 @@
+2014-04-22  Yao Qi  <yao@codesourcery.com>
+
+       * lib/trace-support.exp (generate_tracefile): New procedure.
+       * gdb.trace/tfile.exp: Skip the test if generate_tracefile
+       return 0.
+       * gdb.trace/mi-traceframe-changed.exp: Invoke test_tfind_tfile
+       if generate_tracefile returns 1.
+
 2014-04-18  Tom Tromey  <palves@redhat.com>
            Pedro alves  <tromey@redhat.com>
 
index 4bcf3799bb7e3d86741d1cc1ed146f6ab65d13f5..a4c06b08a7b0336b487ebdc3bbc7a19aff9f53c3 100644 (file)
@@ -43,14 +43,6 @@ if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
 remote_file host delete $tfile_basic
 remote_file target delete $tfile_basic
 
-remote_exec target "$binfile"
-
-if {!$purely_local} {
-    # Copy tracefile from target to host.
-    remote_download host [remote_upload target tfile-basic.tf] \
-       tfile-basic.tf
-}
-
 proc test_tfind_tfile { } {
     with_test_prefix "tfile" {
        global binfile
@@ -88,7 +80,17 @@ proc test_tfind_tfile { } {
     }
 }
 
-test_tfind_tfile
+# If tracefile is generated successfully, copy tracefile to host and
+# run tests.
+if [generate_tracefile $binfile] {
+    if {!$purely_local} {
+       # Copy tracefile from target to host.
+       remote_download host [remote_upload target tfile-basic.tf] \
+           tfile-basic.tf
+    }
+
+    test_tfind_tfile
+}
 
 # Change to a different test case in order to run it on target, and get
 # several traceframes.
index c98e64cc7bf451862532d8fecc3e98fea7e31f27..d6a60e5397b51b3e5ec7e6b86b4024874994d8df 100644 (file)
@@ -34,8 +34,6 @@ if {![is_remote host] && ![is_remote target]} {
     set purely_local 0
 }
 
-gdb_exit
-gdb_start
 standard_testfile
 if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
          executable \
@@ -45,7 +43,6 @@ if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
     untested ${testfile}.exp
     return -1
 }
-gdb_reinitialize_dir $srcdir/$subdir
 
 # Make sure we are starting fresh.
 remote_file host delete $tfile_basic
@@ -53,14 +50,17 @@ remote_file host delete $tfile_error
 remote_file target delete $tfile_basic
 remote_file target delete $tfile_error
 
-remote_exec target "$binfile"
+if { ![generate_tracefile $binfile] } {
+    unsupported "Unable to generate trace file"
+}
+
 if {!$purely_local} {
     # Copy tracefile from target to host through build.
     remote_download host [remote_upload target tfile-basic.tf] tfile-basic.tf
     remote_download host [remote_upload target tfile-error.tf] tfile-error.tf
 }
 
-gdb_load $binfile
+clean_restart $binfile
 
 # Program has presumably exited, now target a trace file it created.
 
index 34c01cbf03d425b0dc9b447c9004bd00a8c50903..a076bacdd66980591a0d6ecd89edd5c995812876 100644 (file)
@@ -327,3 +327,30 @@ proc get_in_proc_agent {} {
        return $objdir/../gdbserver/libinproctrace.so
     }
 }
+
+# Execute BINFILE on target to generate tracefile.  Return 1 if
+# tracefile is generated successfully, return 0 otherwise.
+
+proc generate_tracefile { binfile } {
+    set status [remote_exec target "$binfile"]
+
+    if { [lindex $status 0] != 0 } {
+       # Failed to execute $binfile, for example on bare metal targets.
+       # Alternatively, load the binary and run it.  If target doesn't
+       # have fileio capabilities, tracefile can't be generated.  Skip
+       # the test.
+       if [target_info exists gdb,nofileio] {
+           return 0
+       }
+
+       clean_restart $binfile
+
+       if ![runto_main] then {
+           return 0
+       }
+       gdb_continue_to_end "" continue 1
+       gdb_exit
+    }
+
+    return 1
+}