#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