Implement "info proc cmdline" for NetBSD

Message ID 20200412191546.19996-1-n54@gmx.com
State New
Headers show
Series
  • Implement "info proc cmdline" for NetBSD
Related show

Commit Message

Kamil Rytarowski April 12, 2020, 7:15 p.m.
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  |  5 +++++
 gdb/nbsd-nat.c | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

--
2.25.0

Comments

Simon Marchi April 12, 2020, 7:30 p.m. | #1
On 2020-04-12 3:15 p.m., Kamil Rytarowski wrote:
> 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  |  5 +++++

>  gdb/nbsd-nat.c | 39 +++++++++++++++++++++++++++++++++++++++

>  2 files changed, 44 insertions(+)

> 

> diff --git a/gdb/ChangeLog b/gdb/ChangeLog

> index 9e49cf9cf97..6fd38361d3c 100644

> --- a/gdb/ChangeLog

> +++ b/gdb/ChangeLog

> @@ -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.

> diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c

> index 1bb35f82c18..ebd8e113a3b 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


The space in `args. get()` is not at the right place.

> +      || size == 0)

> +    return nullptr;

> +

> +  /* Arguments are returned as a flattned string with NUL separators.


flattened

The patch is ok with those fixed.

Simon
Kamil Rytarowski April 12, 2020, 7:43 p.m. | #2
On 12.04.2020 21:30, Simon Marchi wrote:
> On 2020-04-12 3:15 p.m., Kamil Rytarowski wrote:

>> 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  |  5 +++++

>>  gdb/nbsd-nat.c | 39 +++++++++++++++++++++++++++++++++++++++

>>  2 files changed, 44 insertions(+)

>>

>> diff --git a/gdb/ChangeLog b/gdb/ChangeLog

>> index 9e49cf9cf97..6fd38361d3c 100644

>> --- a/gdb/ChangeLog

>> +++ b/gdb/ChangeLog

>> @@ -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.

>> diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c

>> index 1bb35f82c18..ebd8e113a3b 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

>

> The space in `args. get()` is not at the right place.

>


Fixed.

>> +      || size == 0)

>> +    return nullptr;

>> +

>> +  /* Arguments are returned as a flattned string with NUL separators.

>

> flattened

>


Fixed.

> The patch is ok with those fixed.

>


Pushed. Thanks!

> Simon

>

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9e49cf9cf97..6fd38361d3c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c
index 1bb35f82c18..ebd8e113a3b 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 flattned 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);