GDB如何记录退出代码



我正在尝试调试CI中的PHP分段错误。我通过运行如下phpunit成功地获得了GDB堆栈:

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

问题是,通过这种方式,我不知道phpunit是成功还是失败(无论它是因segfault还是测试失败而失败都无关紧要(。我需要以某种方式记录vendor/bin/phpunit命令的退出代码,并在稍后的if语句中使用它来决定构建是否成功。

问题是,通过这种方式,我不知道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

最新更新