diff options
author | Andreas Arnez <arnez@linux.vnet.ibm.com> | 2018-03-22 10:02:18 +0100 |
---|---|---|
committer | Andreas Arnez <arnez@linux.vnet.ibm.com> | 2018-03-22 10:02:18 +0100 |
commit | 26d6cec4a9291f154e549fb6f4318ace6cfaa2a5 (patch) | |
tree | da74df9be23e23763ab675b4380dc57d8ed679f5 /gdb | |
parent | f69c5afb18871a773af88484a24d7da12c3a104c (diff) | |
download | gdb-26d6cec4a9291f154e549fb6f4318ace6cfaa2a5.zip gdb-26d6cec4a9291f154e549fb6f4318ace6cfaa2a5.tar.gz gdb-26d6cec4a9291f154e549fb6f4318ace6cfaa2a5.tar.bz2 |
Make "info proc cmdline" show args on GNU/Linux
Currently "info proc cmdline" on GNU/Linux does not show the full command
line, but only argument 0. And even a warning is shown if there are more.
This was discussed in 2014 already:
https://sourceware.org/ml/gdb-patches/2014-04/msg00212.html
Follow the advice there and avoid target_fileio_read_stralloc. Instead,
use target_fileio_read_alloc to read the whole command line and then
replace NUL characters by spaces. Also add an appropriate test case.
Note that gdbserver already handles this correctly.
gdb/ChangeLog:
* linux-tdep.c (linux_info_proc): For "info proc cmdline", print
command line args instead of emitting a warning.
gdb/testsuite/ChangeLog:
* gdb.base/info-proc.exp: Add test for "info proc cmdline".
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/linux-tdep.c | 20 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/info-proc.exp | 13 |
4 files changed, 38 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9b41fe1..f169909 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-03-22 Andreas Arnez <arnez@linux.vnet.ibm.com> + + * linux-tdep.c (linux_info_proc): For "info proc cmdline", print + command line args instead of emitting a warning. + 2018-03-22 Simon Marchi <simon.marchi@polymtl.ca> * tracepoint.h (struct static_tracepoint_marker): Initialize diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index b4b87dd..0ac78c2 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -754,10 +754,22 @@ linux_info_proc (struct gdbarch *gdbarch, const char *args, if (cmdline_f) { xsnprintf (filename, sizeof filename, "/proc/%ld/cmdline", pid); - gdb::unique_xmalloc_ptr<char> cmdline - = target_fileio_read_stralloc (NULL, filename); - if (cmdline) - printf_filtered ("cmdline = '%s'\n", cmdline.get ()); + gdb_byte *buffer; + ssize_t len = target_fileio_read_alloc (NULL, filename, &buffer); + + if (len > 0) + { + gdb::unique_xmalloc_ptr<char> cmdline ((char *) buffer); + ssize_t pos; + + for (pos = 0; pos < len - 1; pos++) + { + if (buffer[pos] == '\0') + buffer[pos] = ' '; + } + buffer[len - 1] = '\0'; + printf_filtered ("cmdline = '%s'\n", buffer); + } else warning (_("unable to open /proc file '%s'"), filename); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ca0dadf..bbd0991 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-03-22 Andreas Arnez <arnez@linux.vnet.ibm.com> + + * gdb.base/info-proc.exp: Add test for "info proc cmdline". + 2018-03-20 Stephen Roberts <stephen.roberts@arm.com> * gdb.perf/template-breakpoints.cc: New file. diff --git a/gdb/testsuite/gdb.base/info-proc.exp b/gdb/testsuite/gdb.base/info-proc.exp index 72355bf..7dbf740 100644 --- a/gdb/testsuite/gdb.base/info-proc.exp +++ b/gdb/testsuite/gdb.base/info-proc.exp @@ -38,6 +38,16 @@ gdb_test_multiple "info proc" "info proc without a process" { } } +# Set command line arguments to be verified later with "info proc +# cmdline". However, if we're using a stub, then "set args" would not +# have any effect, so then just skip this. + +set cmdline "" +if { ! [use_gdb_stub] } { + set cmdline "-i foo bar -o baz 1234" + gdb_test_no_output "set args $cmdline" "set args" +} + if { ! [ runto_main ] } then { untested "could not run to main" return -1 @@ -50,6 +60,9 @@ gdb_test "info proc mapping" \ "info proc mapping" if {[istarget "*-*-linux*"]} { + if { $cmdline != "" } { + gdb_test "info proc cmdline" "cmdline = '.* $cmdline'" + } set gcorefile [standard_output_file $testfile.gcore] if {[gdb_gcore_cmd $gcorefile "save a core file"]} { clean_restart $binfile |