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:
Stan Shebs 2012-05-11 22:24:24 +00:00
parent f24afd6d9f
commit 85d4a67695
9 changed files with 1507 additions and 50 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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;
}

View 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"