我有一个 C++ 程序,我用它来测试另一个程序不会崩溃。父代码(我们称之为“parentProg”)看起来像这样:
int run(const char * command)
{
...
int retCode = system(command);
printf("Code is %d\n",retCode);
if(retCode == 134) //128 + SIGABORT
{
// Record error conditions
...
}
}
命令变量包含正在测试的程序(我们将其称为“childProg”)。在以前的 Linux 发行版中,此代码按预期工作。如果 a.out 崩溃或遇到断言,它将返回 134 并且错误处理代码将运行。但是,在我升级到更新的 Linux 发行版后,情况就不再如此了。相反,当使用 GDB 或 nemiver 作为衍生程序运行时,我看到返回码为 6。奇怪的是,如果我单独运行子程序或使用 DDD,它会恢复到 134。
对于以下测试,我将 childProg 修改为以下代码:
#include <assert.h>
int main(int argc, char * argv[])
{
assert(0);
return 0;
}
childProg 本身
[user@localhost multi]$ ./childProg
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Abort
[user@localhost multi]$ echo $?
134
产生 childProg 的 parentProg
[user@localhost multi]$ ./parentProg 1 o
Running 1 times
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Code is 6
Done 0
[user@localhost multi]$
使用 GDB
(gdb) run
Starting program: parentProg 1 o
Running 1 times
Detaching after fork from child process 3311.
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Code is 6
Done 0
[Inferior 1 (process 3295) exited normally]
(gdb)
使用 DDD
(gdb) run 1 o
Starting program: parentProg 1 o
Running 1 times
Detaching after fork from child process 3336.
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Code is 134
Done 0
[Inferior 1 (process 3319) exited normally]
(gdb)
这按预期工作
[me@localhost multi]$ /bin/sh -c ./childProg
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Abort
[me@localhost multi]$ echo $?
134
这里可能发生了什么?除了检查退出代码之外,还有更好的方法来检查崩溃/段错误/断言吗?