Message ID | 1413440712-3645-1-git-send-email-yao@codesourcery.com |
---|---|
State | New |
Headers | show |
On 10/16/2014 07:25 AM, Yao Qi wrote: > > When the program is running with gdbserver, argv[1] to argv[N] aren't > available, but argv[0] is. Fortunately, argv0-symlink.exp only > requires argv[0]. argv0-symlink.exp can be run with gdbserver board > file, as what we do now. > > What we need to check is whether argv[0] is available, so I add a new > proc gdb_has_argv0 to do so by starting a program, and check > argc/argv[0] to see whether argv[0] is available. Sounds good. > --- a/gdb/testsuite/gdb.base/argv0-symlink.exp > +++ b/gdb/testsuite/gdb.base/argv0-symlink.exp > @@ -13,6 +13,11 @@ > # You should have received a copy of the GNU General Public License > # along with this program. If not, see <http://www.gnu.org/licenses/>. > > +if { ![gdb_has_argv0] } { > + unsupported "Can't get argv\[0\]." > + return > +} > + I think we shouldn't skip the whole test though; only the printing argv[0] test. The test file also makes sure that "info inferiors" shows the symlink name, not the target of the symlink, and that is host-dependent, not target dependent. See git 4856b6bc. > > # Check that the dereferenced value is sane > - if { ! [target_info exists noargs] } { > + global has_argv0 > + if { $has_argv0 } { > gdb_test "python print (arg0)" "0x.*$testfile\"" "verify dereferenced value" > } > > diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp > index 7b2a402..dd525dc 100644 > --- a/gdb/testsuite/lib/gdb.exp > +++ b/gdb/testsuite/lib/gdb.exp > @@ -4227,6 +4227,85 @@ gdb_caching_proc gdb_skip_xml_test { > return $xml_missing > } > > +# Return true if argv[0] is available. > + > +gdb_caching_proc gdb_has_argv0 { > + set result 0 > + > + # Set up, compile, and execute a test program to check whether > + # argv[0] is available. > + set src [standard_temp_file has_argv0[pid].c] > + set exe [standard_temp_file has_argv0[pid].x] > + > + gdb_produce_source $src { > + int main (int argc, char **argv) { > + return 0; > + } > + } > + > + gdb_compile $src $exe executable {debug} > + > + # Helper proc. > + proc gdb_has_argv0_1 { exe } { > + global srcdir subdir > + global gdb_prompt hex decimal > + > + gdb_exit > + gdb_start > + gdb_reinitialize_dir $srcdir/$subdir > + gdb_load "$exe" > + > + # Set breakpoint on main. > + send_gdb "break main\n" > + gdb_expect { > + -re "Breakpoint.*${gdb_prompt} $" { > + } > + -re "${gdb_prompt} $" { > + return 0 > + } > + } > + > + # Run to main. > + gdb_run_cmd > + gdb_expect { > + -re "Breakpoint.*${gdb_prompt} $" { > + } > + -re "${gdb_prompt} $" { > + return 0 > + } > + } > + > + # Check whether argc is 1. > + send_gdb "p argc\n" > + gdb_expect { > + -re " = 1\r\n${gdb_prompt} $" { > + > + send_gdb "p argv\[0\]\n" > + gdb_expect { > + -re " = $hex \".*$exe\"\r\n${gdb_prompt} $" { I suspect this may break if remote (host|target) testing, and not sharing the filesystem between build/host/target. Isn't $exe here a full path on the build? > + return 1 > + } > + -re "${gdb_prompt} $" { > + return 0 > + } > + } > + } > + -re "${gdb_prompt} $" { > + return 0 > + } > + } > + return 0 > + } > + I think these gdb_expect's should be gdb_test_multiple's instead. Thanks, Pedro Alves
diff --git a/gdb/testsuite/gdb.base/argv0-symlink.exp b/gdb/testsuite/gdb.base/argv0-symlink.exp index d849b4c..183fd70 100644 --- a/gdb/testsuite/gdb.base/argv0-symlink.exp +++ b/gdb/testsuite/gdb.base/argv0-symlink.exp @@ -13,6 +13,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +if { ![gdb_has_argv0] } { + unsupported "Can't get argv\[0\]." + return +} + standard_testfile if { [build_executable ${testfile}.exp ${testfile} ${srcfile}] == -1 } { diff --git a/gdb/testsuite/gdb.guile/scm-value.exp b/gdb/testsuite/gdb.guile/scm-value.exp index ae80d1b..2b49134 100644 --- a/gdb/testsuite/gdb.guile/scm-value.exp +++ b/gdb/testsuite/gdb.guile/scm-value.exp @@ -20,6 +20,8 @@ load_lib gdb-guile.exp standard_testfile +set has_argv0 [gdb_has_argv0] + # Build inferior to language specification. # LANG is one of "c" or "c++". proc build_inferior {exefile lang} { @@ -86,7 +88,8 @@ proc test_value_in_inferior {} { "set arg0" # Check that the dereferenced value is sane. - if { ! [target_info exists noargs] } { + global has_argv0 + if { $has_argv0 } { gdb_test "gu (print arg0)" \ "0x.*$testfile\"" "verify dereferenced value" } diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py-value.exp index 0d18bef..afa55a5 100644 --- a/gdb/testsuite/gdb.python/py-value.exp +++ b/gdb/testsuite/gdb.python/py-value.exp @@ -20,6 +20,8 @@ load_lib gdb-python.exp standard_testfile +set has_argv0 [gdb_has_argv0] + # Build inferior to language specification. # LANG is one of "c" or "c++". proc build_inferior {exefile lang} { @@ -221,7 +223,8 @@ proc test_value_in_inferior {} { gdb_py_test_silent_cmd "python arg0 = argv.dereference ()" "dereference value" 1 # Check that the dereferenced value is sane - if { ! [target_info exists noargs] } { + global has_argv0 + if { $has_argv0 } { gdb_test "python print (arg0)" "0x.*$testfile\"" "verify dereferenced value" } diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 7b2a402..dd525dc 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -4227,6 +4227,85 @@ gdb_caching_proc gdb_skip_xml_test { return $xml_missing } +# Return true if argv[0] is available. + +gdb_caching_proc gdb_has_argv0 { + set result 0 + + # Set up, compile, and execute a test program to check whether + # argv[0] is available. + set src [standard_temp_file has_argv0[pid].c] + set exe [standard_temp_file has_argv0[pid].x] + + gdb_produce_source $src { + int main (int argc, char **argv) { + return 0; + } + } + + gdb_compile $src $exe executable {debug} + + # Helper proc. + proc gdb_has_argv0_1 { exe } { + global srcdir subdir + global gdb_prompt hex decimal + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load "$exe" + + # Set breakpoint on main. + send_gdb "break main\n" + gdb_expect { + -re "Breakpoint.*${gdb_prompt} $" { + } + -re "${gdb_prompt} $" { + return 0 + } + } + + # Run to main. + gdb_run_cmd + gdb_expect { + -re "Breakpoint.*${gdb_prompt} $" { + } + -re "${gdb_prompt} $" { + return 0 + } + } + + # Check whether argc is 1. + send_gdb "p argc\n" + gdb_expect { + -re " = 1\r\n${gdb_prompt} $" { + + send_gdb "p argv\[0\]\n" + gdb_expect { + -re " = $hex \".*$exe\"\r\n${gdb_prompt} $" { + return 1 + } + -re "${gdb_prompt} $" { + return 0 + } + } + } + -re "${gdb_prompt} $" { + return 0 + } + } + return 0 + } + + set result [gdb_has_argv0_1 $exe] + + gdb_exit + file delete $src + file delete $exe + + return $result +} + # Note: the procedure gdb_gnu_strip_debug will produce an executable called # ${binfile}.dbglnk, which is just like the executable ($binfile) but without # the debuginfo. Instead $binfile has a .gnu_debuglink section which contains