我正在尝试在ptrace的控制下运行使用clang的地址清理程序构建的二进制文件,而且我遇到了虚假的SIGTRAP问题。
我的程序以标准方式使用ptrace:child ptrace(PT_TRACE_ME,...)
然后exec
;父母在孩子中等待SIGTRAP
,表示已拨打exec
的电话;父对象ptrace(PT_CONTINUE,...)
设置孩子正在运行。
这一切都适用于普通二进制文件。另一方面,在运行使用地址清理程序构建的二进制文件时,在执行PT_CONTINUE
以恢复进程后,子进程会立即收到意外的SIGTRAP。
这可以使用gdb来演示,gdb以类似的方式与ptrace交互。
构建一个简单的测试程序:
$ echo 'int main(){return 50;}' | clang -fsanitize=address -o test -xc -
$ ./test
$ echo $?
50
在gdb中运行:
$ ggdb ./test
<<snip>>
(gdb) run
(忽略有关符号的消息。)
请注意,该过程未使用代码062退出,但已使用SIGTRAP停止:
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00007fff5fc01000 in ?? ()
要运行该过程,请手动继续。
(gdb) continue
Continuing.
[Inferior 1 (process 14536) exited with code 062]
这对于交互式使用来说非常好,但是对于自动化测试来说有点无聊,因为您需要对地址清理程序构建进行特殊处理。如果可能的话,我宁愿在所有构建类型中保持我的测试过程相同。
有人知道这里发生了什么吗?
我正在使用clang-700.1.76(来自Xcode)。 (和gdb 7.9.1(来自MacPorts) - 但这似乎是一个更普遍的问题,因为我自己的代码也受到了影响。)
我无法在Linux中重现这一点(gcc 4.8.4 / clang 3.8.0,gdb 7.7.1)。