Как получить информацию о сигнале процесса в GDB? - PullRequest
6 голосов
/ 01 августа 2011

Есть ли способ получить информацию о сигнале (какие сигналы включены, какие заблокированы, каковы обработчики / опции) для процесса в gdb?Есть info signals, но это дает мне информацию об обработке сигналов GDB, и мне нужна эта информация для отлаживаемого процесса - например, чтобы увидеть, блокирует ли он определенный сигнал или чтобы узнать, какой обработчик он устанавливает для этого сигнала.

Если это подходит, мой GDB будет GNU gdb 6.3.50-20050815 (Apple version gdb-1515) (Sat Jan 15 08:33:48 UTC 2011).

1 Ответ

10 голосов
/ 19 августа 2011

Предполагая, что вы подключены к работающему процессу и не проверяете дамп ядра, и предполагаете, что GDB может обращаться к символам, вы должны иметь возможность вызывать (через GDB) функции обработки сигналов POSIX, чтобы определить информацию, например, какие сигналызаблокированы, и каковы обработчики сигналов регистра.

Например, что-то вроде следующего может использоваться, чтобы определить, зарегистрирован ли обработчик для сигнала SIGSEGV == 11 с использованием функции sigaction:

(gdb) call malloc(sizeof(struct sigaction))
$1 = (void *) 0x...
(gdb) call malloc(sizeof(struct sigaction))
$2 = (void *) 0x...
(gdb) call memset($2, 0, sizeof(struct sigaction))
...
(gdb) call sigaction(11, $2, $1)
$... = 0
(gdb) print *((struct sigaction *)$1)
<prints struct sigaction info>

Эта информация должна позволить вам определить адрес обработчика, а затем вы можете просто передать его в команду 'info symbol', чтобы определить, какая функция используется в качестве обработчика.

Подобные операции могутчтобы определить, какие сигналы заблокированы.

Также вам может пригодиться специальная переменная GDB $ _siginfo.См. Здесь для получения дополнительной информации: http://sourceware.org/gdb/onlinedocs/gdb/Signals.html

Хотя я предполагаю, что $ _siginfo недоступен для целей Apple / darwin.

...