diff options
author | Kamil Rytarowski <n54@gmx.com> | 2020-04-12 21:09:48 +0200 |
---|---|---|
committer | Kamil Rytarowski <n54@gmx.com> | 2020-04-12 21:33:06 +0200 |
commit | 49d1d1f53df552f0592b1cc4cc9a74db70d5ffa7 (patch) | |
tree | 00e8d6449239504dd1781e6e82a8be5e10abf18c | |
parent | b4848d2a7b63d6001051f39d50ca965cb4210951 (diff) | |
download | gdb-49d1d1f53df552f0592b1cc4cc9a74db70d5ffa7.zip gdb-49d1d1f53df552f0592b1cc4cc9a74db70d5ffa7.tar.gz gdb-49d1d1f53df552f0592b1cc4cc9a74db70d5ffa7.tar.bz2 |
Implement "info proc cmdline" for NetBSD
Add nbsd_pid_to_cmdline() to query the program command line.
gdb/ChangeLog:
* nbsd-nat.c (nbsd_pid_to_cmdline): Add.
(nbsd_nat_target::info_proc): Add do_cmdline.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/nbsd-nat.c | 39 |
2 files changed, 44 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9e49cf9c..6fd3836 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2020-04-12 Kamil Rytarowski <n54@gmx.com> + * nbsd-nat.c (nbsd_pid_to_cmdline): Add. + (nbsd_nat_target::info_proc): Add do_cmdline. + +2020-04-12 Kamil Rytarowski <n54@gmx.com> + * nbsd-nat.c (nbsd_pid_to_cwd): Add. (nbsd_nat_target::info_proc): Add do_cwd. diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c index 1bb35f8..fa49ac2 100644 --- a/gdb/nbsd-nat.c +++ b/gdb/nbsd-nat.c @@ -58,6 +58,33 @@ nbsd_pid_to_cwd (int pid) return buf; } +/* Return the command line for the process identified by PID. */ + +static gdb::unique_xmalloc_ptr<char[]> +nbsd_pid_to_cmdline (int pid) +{ + int mib[4] = {CTL_KERN, KERN_PROC_ARGS, pid, KERN_PROC_ARGV}; + + size_t size = 0; + if (sysctl (mib, ARRAY_SIZE (mib), NULL, &size, NULL, 0) == -1 || size == 0) + return nullptr; + + gdb::unique_xmalloc_ptr<char[]> args (XNEWVAR (char, size)); + + if (sysctl (mib, ARRAY_SIZE (mib), args.get (), &size, NULL, 0) == -1 + || size == 0) + return nullptr; + + /* Arguments are returned as a flattened string with NUL separators. + Join the arguments with spaces to form a single string. */ + for (size_t i = 0; i < size - 1; i++) + if (args[i] == '\0') + args[i] = ' '; + args[size - 1] = '\0'; + + return args; +} + /* Generic thread (LWP) lister within a specified process. The callback parameters is a C++ function that is called for each detected thread. */ @@ -313,6 +340,7 @@ bool nbsd_nat_target::info_proc (const char *args, enum info_proc_what what) { pid_t pid; + bool do_cmdline = false; bool do_cwd = false; bool do_exe = false; bool do_mappings = false; @@ -322,6 +350,9 @@ nbsd_nat_target::info_proc (const char *args, enum info_proc_what what) case IP_MAPPINGS: do_mappings = true; break; + case IP_CMDLINE: + do_cmdline = true; + break; case IP_EXE: do_exe = true; break; @@ -346,6 +377,14 @@ nbsd_nat_target::info_proc (const char *args, enum info_proc_what what) printf_filtered (_("process %d\n"), pid); + if (do_cmdline) + { + gdb::unique_xmalloc_ptr<char[]> cmdline = nbsd_pid_to_cmdline (pid); + if (cmdline != nullptr) + printf_filtered ("cmdline = '%s'\n", cmdline.get ()); + else + warning (_("unable to fetch command line")); + } if (do_cwd) { std::string cwd = nbsd_pid_to_cwd (pid); |