【问题标题】:GDB how to log exit code?GDB如何记录退出代码?
【发布时间】:2020-08-20 10:35:14
【问题描述】:

我正在尝试在我的 CI 中调试 PHP 分段错误。我设法通过像这样运行 phpunit 来获取 GDB 堆栈跟踪:

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

问题是这样我不知道 phpunit 是成功还是失败(不管它是否因 segfault 或测试失败而失败)。我需要以某种方式记录vendor/bin/phpunit 命令的退出代码并稍后在if 语句中使用它 - 以确定构建是否成功。

【问题讨论】:

    标签: gdb


    【解决方案1】:

    问题是这样我不知道 phpunit 是成功还是失败(不管它是否因 segfault 或测试失败而失败)

    您可以打印$_exitsignal variable 的值。如果是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多