summaryrefslogtreecommitdiff
path: root/gdb/nbsd-nat.c
diff options
context:
space:
mode:
authorKamil Rytarowski <n54@gmx.com>2020-04-12 21:09:48 +0200
committerKamil Rytarowski <n54@gmx.com>2020-04-12 21:33:06 +0200
commit49d1d1f53df552f0592b1cc4cc9a74db70d5ffa7 (patch)
tree00e8d6449239504dd1781e6e82a8be5e10abf18c /gdb/nbsd-nat.c
parentb4848d2a7b63d6001051f39d50ca965cb4210951 (diff)
downloadbinutils-gdb-49d1d1f53df552f0592b1cc4cc9a74db70d5ffa7.tar.gz
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.
Diffstat (limited to 'gdb/nbsd-nat.c')
-rw-r--r--gdb/nbsd-nat.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c
index 1bb35f82c18..fa49ac26c9b 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);