GDB как зарегистрировать код выхода?

#gdb

#gdb

Вопрос:

Я пытаюсь отладить ошибку сегментации PHP в моем CI. Мне удалось получить GDB stacktrace, запустив phpunit следующим образом:

 gdb php -ex "run vendor/bin/phpunit" -ex bt -ex quit
  

Проблема в том, что таким образом я не знаю, удался ли phpunit или произошел сбой (не имеет значения, произошел ли сбой из-за segfault или из-за сбоя теста). Мне нужно каким-то образом зарегистрировать код выхода vendor/bin/phpunit команды и использовать его в if инструкции позже — чтобы решить, удалась сборка или нет.

Ответ №1:

Проблема в том, что таким образом я не знаю, удался ли phpunit или произошел сбой (не имеет значения, произошел ли сбой из-за segfault или из-за сбоя теста)

Вы можете напечатать значение $_exitsignal переменной. В случае сигнала SIGSEGV он был бы равен 11. Также вы можете использовать $_isvoid функцию, чтобы узнать, завершилась ли программа или был подан сигнал. Для этого кода:

 #include <signal.h>

int main (int argc, char *argv[])
{
  raise (SIGSEGV);
  return 0;
}
  

вы можете вызвать gdb таким образом:

 $ gdb -q -ex run -ex bt -ex c -ex "print $_isvoid($_exitsignal)" -ex quit a.out 
Reading symbols from a.out...
Starting program: /tmp/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7e1e9e5 in raise () from /lib64/libc.so.6
#0  0x00007ffff7e1e9e5 in raise () from /lib64/libc.so.6
#1  0x000000000040113f in main (argc=1, argv=0x7fffffffd6e8) at 1.c:5
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
$1 = 0
  

В конце вывода вы можете видеть, что программа завершилась сигналом, $_isvoid($_exitsignal) возвращенным 0 :

 $1 = 0