Code:
$ gcc -D_GNU_SOURCE -g -Wall main.c
$ gdb -q ./a.out
Reading symbols from ./a.out...done.
(gdb) b handler_readPipeSIGIO
Breakpoint 1 at 0x400a25: file main.c, line 14.
(gdb) run
Starting program: ./a.out
Breakpoint 1, handler_readPipeSIGIO (sig=29, info=0x7fffffffd5b0, secret=0x7fffffffd480) at main.c:14
14 {
(gdb) p *info
$1 = {si_signo = 29, si_errno = 0, si_code = 1, _sifields = {_pad = {65, 0, 3, 0, 0, 0, -136507304, 32767, -9600, 32767, -134229952, 32767, 0, 0, 0, 0, 1024, 0, -136418554, 32767, 1, 0,
0, 0, 404, 0, -136481568, 32767}, _kill = {si_pid = 65, si_uid = 0}, _timer = {si_tid = 65, si_overrun = 0, si_sigval = {sival_int = 3, sival_ptr = 0x3}}, _rt = {si_pid = 65,
si_uid = 0, si_sigval = {sival_int = 3, sival_ptr = 0x3}}, _sigchld = {si_pid = 65, si_uid = 0, si_status = 3, si_utime = 0, si_stime = 140737351848024}, _sigfault = {
si_addr = 0x41, si_addr_lsb = 3, si_addr_bnd = {_lower = 0x0, _upper = 0x7ffff7dd1058}}, _sigpoll = {si_band = 65, si_fd = 3}, _sigsys = {_call_addr = 0x41, _syscall = 3,
_arch = 0}}}
(gdb) ptype info
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;
struct {...} _sigsys;
} _sifields;
} *
You need to use si_code to figure out which union member of _sifields to go looking in.