From d33279b3bb1c89550b26e7b07e3610ab7f87e211 Mon Sep 17 00:00:00 2001 From: Antoine Tremblay Date: Wed, 25 Mar 2015 11:49:05 -0400 Subject: [PATCH] Add cpu information to the info os command on linux. This patch adds cpu information on linux based on /proc/cpuinfo as : cpus Listing of all cpus/cores on the system This patch also reorders the info os commands so that they are listed in alphabetical order. gdb/ChangeLog: * NEWS: Mention info os cpus support. * gdb/nat/linux-osdata.c (linux_xfer_osdata_cpus): New function. (struct osdata_type): Add cpus entry, reorder the entries in alphabetical order. gdb/doc/ChangeLog: * gdb.texinfo (Operating System Auxiliary Information): Add info os cpus documentation, reorder the info os entries in alphabetical order. --- gdb/ChangeLog | 7 +++ gdb/NEWS | 4 ++ gdb/doc/ChangeLog | 5 ++ gdb/doc/gdb.texinfo | 132 ++++++++++++++++++++++------------------- gdb/nat/linux-osdata.c | 124 ++++++++++++++++++++++++++++++++++---- 5 files changed, 199 insertions(+), 73 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0dcb3a3d7f4..757ffd24d46 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2015-03-31 Antoine Tremblay + + * NEWS: Mention info os cpus support. + * gdb/nat/linux-osdata.c (linux_xfer_osdata_cpus): New function. + (struct osdata_type): Add cpus entry, reorder the entries in + alphabetical order. + 2015-03-31 Matthias Klose * compile/compile.c (compile_to_object): Allow triplets with or diff --git a/gdb/NEWS b/gdb/NEWS index 3fa33c90247..4d8619dfa5b 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -3,6 +3,10 @@ *** Changes since GDB 7.9 +* The "info os" command on GNU/Linux can now display information on + cpu information : + "info os cpus" Listing of all cpus/cores on the system + * GDB has two new commands: "set serial parity odd|even|none" and "show serial parity". These allows to set or show parity for the remote serial I/O. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index ea35e627e1d..ffeb2947bb3 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2015-03-31 Antoine Tremblay + + * gdb.texinfo (Operating System Auxiliary Information): Add info os cpus + documentation, reorder the info os entries in alphabetical order. + 2015-03-26 Simon Marchi * gdb.texinfo (GDB/MI Data Manipulation): Fix copy-paste typo in diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index c97ec04f327..9391eeae9b4 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -10606,6 +10606,40 @@ On @sc{gnu}/Linux, the following values of @var{infotype} are valid: @anchor{linux info os infotypes} @table @code +@kindex info os cpus +@item cpus +Display the list of all CPUs/cores. For each CPU/core, @value{GDBN} prints +the available fields from /proc/cpuinfo. For each supported architecture +different fields are available. Two common entries are processor which gives +CPU number and bogomips; a system constant that is calculated during +kernel initialization. + +@kindex info os files +@item files +Display the list of open file descriptors on the target. For each +file descriptor, @value{GDBN} prints the identifier of the process +owning the descriptor, the command of the owning process, the value +of the descriptor, and the target of the descriptor. + +@kindex info os modules +@item modules +Display the list of all loaded kernel modules on the target. For each +module, @value{GDBN} prints the module name, the size of the module in +bytes, the number of times the module is used, the dependencies of the +module, the status of the module, and the address of the loaded module +in memory. + +@kindex info os msg +@item msg +Display the list of all System V message queues on the target. For each +message queue, @value{GDBN} prints the message queue key, the message +queue identifier, the access permissions, the current number of bytes +on the queue, the current number of messages on the queue, the processes +that last sent and received a message on the queue, the user and group +of the owner and creator of the message queue, the times at which a +message was last sent and received on the queue, and the time at which +the message queue was last changed. + @kindex info os processes @item processes Display the list of processes on the target. For each process, @@ -10625,28 +10659,13 @@ first by the process group identifier, then by the process identifier, so that processes belonging to the same process group are grouped together and the process group leader is listed first. -@kindex info os threads -@item threads -Display the list of threads running on the target. For each thread, -@value{GDBN} prints the identifier of the process that the thread -belongs to, the command of the process, the thread identifier, and the -processor core that it is currently running on. The main thread of a -process is not listed. - -@kindex info os files -@item files -Display the list of open file descriptors on the target. For each -file descriptor, @value{GDBN} prints the identifier of the process -owning the descriptor, the command of the owning process, the value -of the descriptor, and the target of the descriptor. - -@kindex info os sockets -@item sockets -Display the list of Internet-domain sockets on the target. For each -socket, @value{GDBN} prints the address and port of the local and -remote endpoints, the current state of the connection, the creator of -the socket, the IP address family of the socket, and the type of the -connection. +@kindex info os semaphores +@item semaphores +Display the list of all System V semaphore sets on the target. For each +semaphore set, @value{GDBN} prints the semaphore set key, the semaphore +set identifier, the access permissions, the number of semaphores in the +set, the user and group of the owner and creator of the semaphore set, +and the times at which the semaphore set was operated upon and changed. @kindex info os shm @item shm @@ -10658,32 +10677,21 @@ attached to or detached from the region, the current number of live attaches to the region, and the times at which the region was last attached to, detach from, and changed. -@kindex info os semaphores -@item semaphores -Display the list of all System V semaphore sets on the target. For each -semaphore set, @value{GDBN} prints the semaphore set key, the semaphore -set identifier, the access permissions, the number of semaphores in the -set, the user and group of the owner and creator of the semaphore set, -and the times at which the semaphore set was operated upon and changed. - -@kindex info os msg -@item msg -Display the list of all System V message queues on the target. For each -message queue, @value{GDBN} prints the message queue key, the message -queue identifier, the access permissions, the current number of bytes -on the queue, the current number of messages on the queue, the processes -that last sent and received a message on the queue, the user and group -of the owner and creator of the message queue, the times at which a -message was last sent and received on the queue, and the time at which -the message queue was last changed. +@kindex info os sockets +@item sockets +Display the list of Internet-domain sockets on the target. For each +socket, @value{GDBN} prints the address and port of the local and +remote endpoints, the current state of the connection, the creator of +the socket, the IP address family of the socket, and the type of the +connection. -@kindex info os modules -@item modules -Display the list of all loaded kernel modules on the target. For each -module, @value{GDBN} prints the module name, the size of the module in -bytes, the number of times the module is used, the dependencies of the -module, the status of the module, and the address of the loaded module -in memory. +@kindex info os threads +@item threads +Display the list of threads running on the target. For each thread, +@value{GDBN} prints the identifier of the process that the thread +belongs to, the command of the process, the thread identifier, and the +processor core that it is currently running on. The main thread of a +process is not listed. @end table @item info os @@ -31785,28 +31793,30 @@ like this: @smallexample @value{GDBP} -info-os -^done,OSDataTable=@{nr_rows="9",nr_cols="3", +^done,OSDataTable=@{nr_rows="10",nr_cols="3", hdr=[@{width="10",alignment="-1",col_name="col0",colhdr="Type"@}, @{width="10",alignment="-1",col_name="col1",colhdr="Description"@}, @{width="10",alignment="-1",col_name="col2",colhdr="Title"@}], -body=[item=@{col0="processes",col1="Listing of all processes", +body=[item=@{col0="cpus",col1="Listing of all cpus/cores on the system", + col2="CPUs"@}, + item=@{col0="files",col1="Listing of all file descriptors", + col2="File descriptors"@}, + item=@{col0="modules",col1="Listing of all loaded kernel modules", + col2="Kernel modules"@}, + item=@{col0="msg",col1="Listing of all message queues", + col2="Message queues"@}, + item=@{col0="processes",col1="Listing of all processes", col2="Processes"@}, item=@{col0="procgroups",col1="Listing of all process groups", col2="Process groups"@}, - item=@{col0="threads",col1="Listing of all threads", - col2="Threads"@}, - item=@{col0="files",col1="Listing of all file descriptors", - col2="File descriptors"@}, - item=@{col0="sockets",col1="Listing of all internet-domain sockets", - col2="Sockets"@}, - item=@{col0="shm",col1="Listing of all shared-memory regions", - col2="Shared-memory regions"@}, item=@{col0="semaphores",col1="Listing of all semaphores", col2="Semaphores"@}, - item=@{col0="msg",col1="Listing of all message queues", - col2="Message queues"@}, - item=@{col0="modules",col1="Listing of all loaded kernel modules", - col2="Kernel modules"@}]@} + item=@{col0="shm",col1="Listing of all shared-memory regions", + col2="Shared-memory regions"@}, + item=@{col0="sockets",col1="Listing of all internet-domain sockets", + col2="Sockets"@}, + item=@{col0="threads",col1="Listing of all threads", + col2="Threads"@}] @value{GDBP} -info-os processes ^done,OSDataTable=@{nr_rows="190",nr_cols="4", diff --git a/gdb/nat/linux-osdata.c b/gdb/nat/linux-osdata.c index 0ed5d34101e..502356fd90c 100644 --- a/gdb/nat/linux-osdata.c +++ b/gdb/nat/linux-osdata.c @@ -662,6 +662,104 @@ linux_xfer_osdata_threads (gdb_byte *readbuf, return len; } +/* Collect data about the cpus/cores on the system */ + +static LONGEST +linux_xfer_osdata_cpus (gdb_byte *readbuf, + ULONGEST offset, ULONGEST len) +{ + static const char *buf; + static LONGEST len_avail = -1; + static struct buffer buffer; + + if (offset == 0) + { + FILE *fp; + int first_item = 1; + + if (len_avail != -1 && len_avail != 0) + buffer_free (&buffer); + len_avail = 0; + buf = NULL; + buffer_init (&buffer); + buffer_grow_str (&buffer, "\n"); + + fp = gdb_fopen_cloexec ("/proc/cpuinfo", "r"); + if (fp != NULL) + { + char buf[8192]; + + do + { + if (fgets (buf, sizeof (buf), fp)) + { + char *key, *value; + int i = 0; + + key = strtok (buf, ":"); + if (key == NULL) + continue; + + value = strtok (NULL, ":"); + if (value == NULL) + continue; + + while (key[i] != '\t' && key[i] != '\0') + i++; + + key[i] = '\0'; + + i = 0; + while (value[i] != '\t' && value[i] != '\0') + i++; + + value[i] = '\0'; + + if (strcmp (key, "processor") == 0) + { + if (first_item) + buffer_grow_str (&buffer, ""); + else + buffer_grow_str (&buffer, ""); + + first_item = 0; + } + + buffer_xml_printf (&buffer, + "%s", + key, + value); + } + } + while (!feof (fp)); + + if (first_item == 0) + buffer_grow_str (&buffer, ""); + + fclose (fp); + } + + buffer_grow_str0 (&buffer, "\n"); + buf = buffer_finish (&buffer); + len_avail = strlen (buf); + } + + if (offset >= len_avail) + { + /* Done. Get rid of the buffer. */ + buffer_free (&buffer); + buf = NULL; + len_avail = 0; + return 0; + } + + if (len > len_avail - offset) + len = len_avail - offset; + memcpy (readbuf, buf + offset, len); + + return len; +} + /* Collect all the open file descriptors found in /proc and put the details found about them into READBUF. */ @@ -1532,24 +1630,26 @@ struct osdata_type { char *description; LONGEST (*getter) (gdb_byte *readbuf, ULONGEST offset, ULONGEST len); } osdata_table[] = { + { "cpus", "CPUs", "Listing of all cpus/cores on the system", + linux_xfer_osdata_cpus }, + { "files", "File descriptors", "Listing of all file descriptors", + linux_xfer_osdata_fds }, + { "modules", "Kernel modules", "Listing of all loaded kernel modules", + linux_xfer_osdata_modules }, + { "msg", "Message queues", "Listing of all message queues", + linux_xfer_osdata_msg }, { "processes", "Processes", "Listing of all processes", linux_xfer_osdata_processes }, { "procgroups", "Process groups", "Listing of all process groups", linux_xfer_osdata_processgroups }, - { "threads", "Threads", "Listing of all threads", - linux_xfer_osdata_threads }, - { "files", "File descriptors", "Listing of all file descriptors", - linux_xfer_osdata_fds }, - { "sockets", "Sockets", "Listing of all internet-domain sockets", - linux_xfer_osdata_isockets }, - { "shm", "Shared-memory regions", "Listing of all shared-memory regions", - linux_xfer_osdata_shm }, { "semaphores", "Semaphores", "Listing of all semaphores", linux_xfer_osdata_sem }, - { "msg", "Message queues", "Listing of all message queues", - linux_xfer_osdata_msg }, - { "modules", "Kernel modules", "Listing of all loaded kernel modules", - linux_xfer_osdata_modules }, + { "shm", "Shared-memory regions", "Listing of all shared-memory regions", + linux_xfer_osdata_shm }, + { "sockets", "Sockets", "Listing of all internet-domain sockets", + linux_xfer_osdata_isockets }, + { "threads", "Threads", "Listing of all threads", + linux_xfer_osdata_threads }, { NULL, NULL, NULL } }; -- 2.30.2