Implement "info proc cmdline" for NetBSD
authorKamil Rytarowski <n54@gmx.com>
Sun, 12 Apr 2020 19:09:48 +0000 (21:09 +0200)
committerKamil Rytarowski <n54@gmx.com>
Sun, 12 Apr 2020 19:33:06 +0000 (21:33 +0200)
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.

gdb/ChangeLog
gdb/nbsd-nat.c

index 9e49cf9cf97f49835049666d86df8abc98ecd034..6fd38361d3cb9548bc1f084a0782a78b0f7028b7 100644 (file)
@@ -1,3 +1,8 @@
+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.
index 1bb35f82c1853cd9f6e37eceb6c0f10f6341d27c..fa49ac26c9bfa4ede635163c053041b902b8b4c0 100644 (file)
@@ -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);