2012-05-11 Stan Shebs <stan@codesourcery.com>
Kwok Cheung Yeung <kcy@codesourcery.com> * NEWS: Describe new info os commands. * common/linux-osdata.c (PID_T, TIME_T): Define. (MAX_PID_T_STRLEN): New. (linux_common_core_of_thread): Add comment. Change to use PID_T and MAX_PID_T_STRLEN. (command_from_pid): Add comment. Change to use PID_T. (commandline_from_pid): Change to use PID_T. (user_from_pid): Add comment. (get_process_owner): Add comment. Change to use PID_T and MAX_PID_T_STRLEN. (get_number_of_cpu_cores): Add comment. (get_cores_used_by_process): Add comment. Change to use PID_T and MAX_PID_T_STRLEN. (linux_xfer_osdata_processes): Change to use PID_T and MAX_PID_T_STRLEN. (compare_processes): New function. (linux_xfer_osdata_processgroups): New function. (linux_xfer_osdata_threads): Change to use PID_T. (linux_xfer_osdata_fds): New function. (format_socket_state, print_sockets): New functions. (union socket_addr): New union. (linux_xfer_osdata_isockets): New function. (time_from_time_t, group_from_gid): New functions. (linux_xfer_osdata_shm): New function. (linux_xfer_osdata_sem): New function. (linux_xfer_osdata_msg): New function. (linux_xfer_osdata_modules): New function. (osdata_table): Add new entries. * common/buffer.c (buffer_xml_printf): Add support for long and long long format specifiers. * gdb.texinfo (Operating System Auxiliary Information): Document new 'info os' subcommands. * gdb.base/info-os.exp: New file. * gdb.base/info-os.c: New file.
This commit is contained in:
parent
f24afd6d9f
commit
85d4a67695
@ -1,3 +1,37 @@
|
||||
2012-05-11 Stan Shebs <stan@codesourcery.com>
|
||||
Kwok Cheung Yeung <kcy@codesourcery.com>
|
||||
|
||||
* NEWS: Describe new info os commands.
|
||||
* common/linux-osdata.c (PID_T, TIME_T): Define.
|
||||
(MAX_PID_T_STRLEN): New.
|
||||
(linux_common_core_of_thread): Add comment. Change to use PID_T and
|
||||
MAX_PID_T_STRLEN.
|
||||
(command_from_pid): Add comment. Change to use PID_T.
|
||||
(commandline_from_pid): Change to use PID_T.
|
||||
(user_from_pid): Add comment.
|
||||
(get_process_owner): Add comment. Change to use PID_T and
|
||||
MAX_PID_T_STRLEN.
|
||||
(get_number_of_cpu_cores): Add comment.
|
||||
(get_cores_used_by_process): Add comment. Change to use PID_T and
|
||||
MAX_PID_T_STRLEN.
|
||||
(linux_xfer_osdata_processes): Change to use PID_T and
|
||||
MAX_PID_T_STRLEN.
|
||||
(compare_processes): New function.
|
||||
(linux_xfer_osdata_processgroups): New function.
|
||||
(linux_xfer_osdata_threads): Change to use PID_T.
|
||||
(linux_xfer_osdata_fds): New function.
|
||||
(format_socket_state, print_sockets): New functions.
|
||||
(union socket_addr): New union.
|
||||
(linux_xfer_osdata_isockets): New function.
|
||||
(time_from_time_t, group_from_gid): New functions.
|
||||
(linux_xfer_osdata_shm): New function.
|
||||
(linux_xfer_osdata_sem): New function.
|
||||
(linux_xfer_osdata_msg): New function.
|
||||
(linux_xfer_osdata_modules): New function.
|
||||
(osdata_table): Add new entries.
|
||||
* common/buffer.c (buffer_xml_printf): Add support for long and
|
||||
long long format specifiers.
|
||||
|
||||
2012-05-11 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* amd64-linux-tdep.h (tdesc_x32_linux): New.
|
||||
|
10
gdb/NEWS
10
gdb/NEWS
@ -3,6 +3,16 @@
|
||||
|
||||
*** Changes since GDB 7.4
|
||||
|
||||
* The "info os" command on GNU/Linux can now display information on
|
||||
several new classes of objects managed by the operating system:
|
||||
"info os procgroups" lists process groups
|
||||
"info os files" lists file descriptors
|
||||
"info os sockets" lists internet-domain sockets
|
||||
"info os shm" lists shared-memory regions
|
||||
"info os semaphores" lists semaphores
|
||||
"info os msg" lists message queues
|
||||
"info os modules" lists loaded kernel modules
|
||||
|
||||
* GDB now has support for SDT (Static Defined Tracing) probes. Currently,
|
||||
the only implemented backend is for SystemTap probes (<sys/sdt.h>). You
|
||||
can set a breakpoint using the new "-probe, "-pstap" or "-probe-stap"
|
||||
|
@ -101,6 +101,7 @@ buffer_xml_printf (struct buffer *buffer, const char *format, ...)
|
||||
char buf[32];
|
||||
char *p;
|
||||
char *str = buf;
|
||||
const char *f_old = f;
|
||||
|
||||
switch (*f)
|
||||
{
|
||||
@ -119,14 +120,56 @@ buffer_xml_printf (struct buffer *buffer, const char *format, ...)
|
||||
case 'o':
|
||||
sprintf (str, "%o", va_arg (ap, unsigned int));
|
||||
break;
|
||||
case 'l':
|
||||
f++;
|
||||
switch (*f)
|
||||
{
|
||||
case 'd':
|
||||
sprintf (str, "%ld", va_arg (ap, long));
|
||||
break;
|
||||
case 'u':
|
||||
sprintf (str, "%lu", va_arg (ap, unsigned long));
|
||||
break;
|
||||
case 'x':
|
||||
sprintf (str, "%lx", va_arg (ap, unsigned long));
|
||||
break;
|
||||
case 'o':
|
||||
sprintf (str, "%lo", va_arg (ap, unsigned long));
|
||||
break;
|
||||
case 'l':
|
||||
f++;
|
||||
switch (*f)
|
||||
{
|
||||
case 'd':
|
||||
sprintf (str, "%lld", va_arg (ap, long long));
|
||||
break;
|
||||
case 'u':
|
||||
sprintf (str, "%llu", va_arg (ap, unsigned long long));
|
||||
break;
|
||||
case 'x':
|
||||
sprintf (str, "%llx", va_arg (ap, unsigned long long));
|
||||
break;
|
||||
case 'o':
|
||||
sprintf (str, "%llo", va_arg (ap, unsigned long long));
|
||||
break;
|
||||
default:
|
||||
str = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
str = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
str = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (str)
|
||||
{
|
||||
buffer_grow (buffer, prev, f - prev - 1);
|
||||
buffer_grow (buffer, prev, f_old - prev - 1);
|
||||
p = xml_escape_text (str);
|
||||
buffer_grow_str (buffer, p);
|
||||
xfree (p);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,9 @@
|
||||
2012-05-11 Stan Shebs <stan@codesourcery.com>
|
||||
Kwok Cheung Yeung <kcy@codesourcery.com>
|
||||
|
||||
* gdb.texinfo (Operating System Auxiliary Information): Document new
|
||||
'info os' subcommands.
|
||||
|
||||
2012-05-11 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.texinfo (Auto-loading, Init File in the Current Directory)
|
||||
|
@ -9409,23 +9409,109 @@ most appropriate form for a recognized tag, and in hexadecimal for
|
||||
an unrecognized tag.
|
||||
@end table
|
||||
|
||||
On some targets, @value{GDBN} can access operating-system-specific information
|
||||
and display it to user, without interpretation. For remote targets,
|
||||
this functionality depends on the remote stub's support of the
|
||||
On some targets, @value{GDBN} can access operating system-specific
|
||||
information and show it to you. The types of information available
|
||||
will differ depending on the type of operating system running on the
|
||||
target. The mechanism used to fetch the data is described in
|
||||
@ref{Operating System Information}. For remote targets, this
|
||||
functionality depends on the remote stub's support of the
|
||||
@samp{qXfer:osdata:read} packet, see @ref{qXfer osdata read}.
|
||||
|
||||
@table @code
|
||||
@kindex info os
|
||||
@item info os
|
||||
List the types of OS information available for the target. If the
|
||||
target does not return a list of possible types, this command will
|
||||
report an error.
|
||||
@item info os @var{infotype}
|
||||
|
||||
Display OS information of the requested type.
|
||||
|
||||
On @sc{gnu}/Linux, the following values of @var{infotype} are valid:
|
||||
|
||||
@anchor{linux info os infotypes}
|
||||
@table @code
|
||||
@kindex info os processes
|
||||
@item info os processes
|
||||
@item processes
|
||||
Display the list of processes on the target. For each process,
|
||||
@value{GDBN} prints the process identifier, the name of the user, and
|
||||
the command corresponding to the process.
|
||||
@value{GDBN} prints the process identifier, the name of the user, the
|
||||
command corresponding to the process, and the list of processor cores
|
||||
that the process is currently running on. (To understand what these
|
||||
properties mean, for this and the following info types, please consult
|
||||
the general @sc{gnu}/Linux documentation.)
|
||||
|
||||
@kindex info os procgroups
|
||||
@item procgroups
|
||||
Display the list of process groups on the target. For each process,
|
||||
@value{GDBN} prints the identifier of the process group that it belongs
|
||||
to, the command corresponding to the process group leader, the process
|
||||
identifier, and the command line of the process. The list is sorted
|
||||
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 shm
|
||||
@item shm
|
||||
Display the list of all System V shared-memory regions on the target.
|
||||
For each shared-memory region, @value{GDBN} prints the region key,
|
||||
the shared-memory identifier, the access permissions, the size of the
|
||||
region, the process that created the region, the process that last
|
||||
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 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.
|
||||
@end table
|
||||
|
||||
@item info os
|
||||
If @var{infotype} is omitted, then list the possible values for
|
||||
@var{infotype} and the kind of OS information available for each
|
||||
@var{infotype}. If the target does not return a list of possible
|
||||
types, this command will report an error.
|
||||
@end table
|
||||
|
||||
@node Memory Region Attributes
|
||||
|
@ -1,3 +1,8 @@
|
||||
2011-12-26 Kwok Cheung Yeung <kcy@codesourcery.com>
|
||||
|
||||
* gdb.base/info-os.exp: New file.
|
||||
* gdb.base/info-os.c: New file.
|
||||
|
||||
2012-05-10 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* config/djgpp/fnchange.lst: Add entries for print-file-var-lib1.c,
|
||||
|
115
gdb/testsuite/gdb.base/info-os.c
Normal file
115
gdb/testsuite/gdb.base/info-os.c
Normal file
@ -0,0 +1,115 @@
|
||||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2011 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <sys/shm.h>
|
||||
#include <sys/sem.h>
|
||||
#include <sys/msg.h>
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
void *
|
||||
thread_proc (void *args)
|
||||
{
|
||||
pthread_mutex_lock (&mutex);
|
||||
pthread_mutex_unlock (&mutex);
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
const int flags = IPC_CREAT | 0666;
|
||||
int shmid, semid, msqid;
|
||||
FILE *fd;
|
||||
pthread_t thread;
|
||||
struct sockaddr_in sock_addr;
|
||||
int sock;
|
||||
unsigned short port;
|
||||
socklen_t size;
|
||||
int status;
|
||||
|
||||
if ((shmid = shmget (3925, 4096, flags | IPC_EXCL)) < 0)
|
||||
{
|
||||
/* Attempt to delete the existing shared-memory region, then
|
||||
recreate it. */
|
||||
shmctl (shmget (3925, 4096, flags), IPC_RMID, NULL);
|
||||
if ((shmid = shmget (3925, 4096, flags | IPC_EXCL)) < 0)
|
||||
{
|
||||
printf ("Cannot create shared-memory region.\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
semid = semget (7428, 1, flags);
|
||||
msqid = msgget (5294, flags);
|
||||
fd = fopen ("/dev/null", "r");
|
||||
|
||||
/* Lock the mutex to prevent the new thread from finishing immediately. */
|
||||
pthread_mutex_lock (&mutex);
|
||||
pthread_create (&thread, NULL, thread_proc, 0);
|
||||
|
||||
sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (sock < 0)
|
||||
{
|
||||
printf ("Cannot create socket.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
sock_addr.sin_family = AF_INET;
|
||||
sock_addr.sin_port = 0; /* Bind to a free port. */
|
||||
sock_addr.sin_addr.s_addr = htonl (INADDR_ANY);
|
||||
|
||||
status = bind (sock, (struct sockaddr *) &sock_addr, sizeof (sock_addr));
|
||||
if (status < 0)
|
||||
{
|
||||
printf ("Cannot bind socket.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Find the assigned port number of the socket. */
|
||||
size = sizeof (sock_addr);
|
||||
status = getsockname (sock, (struct sockaddr *) &sock_addr, &size);
|
||||
if (status < 0)
|
||||
{
|
||||
printf ("Cannot find name of socket.\n");
|
||||
return 1;
|
||||
}
|
||||
port = ntohs (sock_addr.sin_port);
|
||||
|
||||
status = listen (sock, 1);
|
||||
if (status < 0)
|
||||
{
|
||||
printf ("Cannot listen on socket.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Set breakpoint here. */
|
||||
|
||||
shmctl (shmid, IPC_RMID, NULL);
|
||||
semctl (semid, 0, IPC_RMID, NULL);
|
||||
msgctl (msqid, IPC_RMID, NULL);
|
||||
fclose (fd);
|
||||
close (sock);
|
||||
|
||||
pthread_mutex_unlock (&mutex);
|
||||
pthread_join (thread, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
110
gdb/testsuite/gdb.base/info-os.exp
Normal file
110
gdb/testsuite/gdb.base/info-os.exp
Normal file
@ -0,0 +1,110 @@
|
||||
# Copyright 2011 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
set testfile "info-os"
|
||||
set srcfile ${testfile}.c
|
||||
|
||||
# This test is Linux-only.
|
||||
if ![istarget *-*-linux*] then {
|
||||
unsupported "info-os.exp"
|
||||
return -1
|
||||
}
|
||||
|
||||
# Support for XML-output is needed to run this test.
|
||||
if [gdb_skip_xml_test] then {
|
||||
unsupported "info-os.exp"
|
||||
return -1
|
||||
}
|
||||
|
||||
# Compile test program.
|
||||
if { [prepare_for_testing ${testfile}.exp $testfile $srcfile {debug additional_flags=-lpthread}] } {
|
||||
fail "cannot compile test program"
|
||||
return -1
|
||||
}
|
||||
|
||||
if ![runto_main] then {
|
||||
fail "cannot run to main"
|
||||
return -1;
|
||||
}
|
||||
|
||||
# Get PID of test program.
|
||||
set inferior_pid -1
|
||||
set test "get inferior process ID"
|
||||
gdb_test_multiple "call getpid()" $test {
|
||||
-re ".* = ($decimal).*$gdb_prompt $" {
|
||||
set inferior_pid $expect_out(1,string)
|
||||
pass $test
|
||||
}
|
||||
}
|
||||
|
||||
gdb_breakpoint ${srcfile}:[gdb_get_line_number "Set breakpoint here"]
|
||||
gdb_continue_to_breakpoint "Set breakpoint here"
|
||||
|
||||
# Get IDs of the IPC object instances.
|
||||
set shmid -1
|
||||
set test "get shared memory ID"
|
||||
gdb_test_multiple "print shmid" $test {
|
||||
-re ".* = ($decimal).*$gdb_prompt $" {
|
||||
set shmid $expect_out(1,string)
|
||||
pass $test
|
||||
}
|
||||
}
|
||||
|
||||
set semid -1
|
||||
set test "get semaphore ID"
|
||||
gdb_test_multiple "print semid" $test {
|
||||
-re ".* = ($decimal).*$gdb_prompt $" {
|
||||
set semid $expect_out(1,string)
|
||||
pass $test
|
||||
}
|
||||
}
|
||||
|
||||
set msqid -1
|
||||
set test "get message queue ID"
|
||||
gdb_test_multiple "print msqid" $test {
|
||||
-re ".* = ($decimal).*$gdb_prompt $" {
|
||||
set msqid $expect_out(1,string)
|
||||
pass $test
|
||||
}
|
||||
}
|
||||
|
||||
# Get port number of test socket.
|
||||
set port -1
|
||||
set test "get socket port number"
|
||||
gdb_test_multiple "print port" $test {
|
||||
-re ".* = ($decimal).*$gdb_prompt $" {
|
||||
set port $expect_out(1,string)
|
||||
pass $test
|
||||
}
|
||||
}
|
||||
|
||||
# Test output of the 'info os' commands against the expected results.
|
||||
gdb_test "info os processes" ".*pid +user +command +cores.*$inferior_pid +\\S+ +\\S*info-os +\[0-9\]+.*" "get process list"
|
||||
gdb_test "info os procgroups" ".*pgid +leader command +pid +command line.*$inferior_pid +info-os +$inferior_pid +\\S*info-os.*" "get process groups"
|
||||
gdb_test "info os threads" ".*pid +command +tid +core.*$inferior_pid +info-os +\\d+ +\\d+.*" "get threads"
|
||||
gdb_test "info os files" ".*pid +command +file descriptor +name.*$inferior_pid +info-os +\\d+ +/dev/null.*" "get file descriptors"
|
||||
gdb_test "info os sockets" ".*local address +local port +remote address +remote port +state +user +family +protocol.*0\\.0\\.0\\.0 +$port +0\\.0\\.0\\.0 +0 +LISTEN +\\S+ +INET +STREAM.*" "get internet-domain sockets"
|
||||
gdb_test "info os shm" ".*key +shmid +permissions +size +creator command +last op\\. command +num attached +user +group +creator user +creator group +last shmat\\(\\) time +last shmdt\\(\\) time +last shmctl\\(\\) time.*3925 +$shmid +666 +4096 +info-os +.*" "get shared-memory regions"
|
||||
gdb_test "info os semaphores" ".*key +semid +permissions +num semaphores +user +group +creator user +creator group +last semop\\(\\) time +last semctl\\(\\) time.*7428 +$semid +666 +1 +.*" "get semaphores"
|
||||
gdb_test "info os msg" ".*key +msqid +permissions +num used bytes +num messages +last msgsnd\\(\\) command +last msgrcv\\(\\) command +user +group +creator user +creator group +last msgsnd\\(\\) time +last msgrcv\\(\\) time +last msgctl\\(\\) time.*5294 +$msqid +666 +.*" "get message queues"
|
||||
|
||||
# The SysV IPC primitives linger on after the creating process is killed
|
||||
# unless they are destroyed explicitly, so allow the test program to tidy
|
||||
# up after itself. Note that the test program attempts to delete and
|
||||
# recreate the shared-memory region if it already exists, in case a
|
||||
# previous run failed before having a chance to clean up. The tests for
|
||||
# semaphores and message queues should still work with primitives from
|
||||
# previous runs.
|
||||
send_gdb "continue\n"
|
Loading…
Reference in New Issue
Block a user