[0/2] Inspect extra signal information

Pedro Alves
2009-01-12T18:47:08Z

Hi!

This mini series adds support for inspecting extra signal information.

What this means is, we get a new $_siginfo convenience variable that
is typed to look like the siginfo_t object on unix-ish platforms (but
can be any other type appropriate for the target platform).

E.g., on x86_64-linux,

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400770 in main () at ../../../src/gdb/testsuite/gdb.base/siginfo-obj.c:68
68 *(int *)p = 0;
(gdb) p $_siginfo
$1 = {si_signo = 11, si_errno = 0, si_code = 2, _sifields = {_pad = {-134254592, 32767, 0, 0, 0, 0, 1, 5, 12462832,
0, 4196201, 0, 0, 0, 4196208, 0, 12337488, 0, 12337488, 0, 4196208, 0, 12518720, 0, 12518864, 0, 12518848, 0},
_kill = {si_pid = -134254592, si_uid = 32767}, _timer = {si_tid = -134254592, si_overrun = 32767, si_sigval = {
sival_int = 0, sival_ptr = 0x0}}, _rt = {si_pid = -134254592, si_uid = 32767, si_sigval = {sival_int = 0,
sival_ptr = 0x0}}, _sigchld = {si_pid = -134254592, si_uid = 32767, si_status = 0, si_utime = 0,
si_stime = 4294967296}, _sigfault = {si_addr = 0x7ffff7ff7000}, _sigpoll = {si_band = 140737354100736,
si_fd = 0}}}

(gdb) ptype $_siginfo
type = struct {
int si_signo;
int si_errno;
int si_code;
union {
int _pad[28];
struct {...} _kill;
struct {...} _timer;
struct {...} _rt;
struct {...} _sigchld;
struct {...} _sigfault;
struct {...} _sigpoll;
} _sifields;
}

(gdb) p $_siginfo._sifields._sigfault.si_addr
$2 = (void *) 0x7ffff7ff7000

part 1:

- Adds some infrastracture to be able to register reader and writer
functions that are responsible for reading and writing
a ``struct value'''s value. We called those lval_computed values. We've
been using these kinds of values for other things in our tree for a
couple of years already --- I've piggy-backed on that, so I got to
push it. :-)

This first patch applies on top of this other one:

http://sourceware.org/ml/gdb-patches/2009-01/msg00252.html

part 2:

- Adds a new target object ``TARGET_OBJECT_SIGNAL_INFO'', used to transfer the
siginfo_t data from the target to GDB core.

- Adds a way for a convenience variable's type and value be lazy. This is because
the actual type of the $_siginfo variable may change between archs (across runs, or
across threads).

- Adds a new gdbarch method (get_siginfo_type) whose job is to return a type
suitable to print/inspect a TARGET_OBJECT_SIGNAL_INFO of a given arch.

- Adds the $_siginfo convenience variable, whose type is lval_computed. The read and
writer functions of this lval_computed variable take care of transfering
a TARGET_OBJECT_SIGINFO to/from the target.

- Adds a generic linux implementation of get_siginfo_type, suitable for linux archs
that use the default siginfo_t structure type, and registers it in x86, x86_64
and arm. Other archs that diverge from the default, will need to implement
their own version, which will be very similar to linux_get_siginfo_type.

- Adds linux native target and remote targets implementations of
transfering TARGET_OBJECT_SIGNAL_INFO.

- Adds gdbserver support for same.

- Docs, and,

- New test.

--
Pedro Alves