我正在尝试在 ptrace 的控制下运行使用 clang 的地址清理程序构建的二进制文件,并且我遇到了虚假 SIGTRAP 的问题。
我的程序以标准方式使用 ptrace: child does ptrace(PT_TRACE_ME,...)
then exec
; parent 在 child 中等待SIGTRAP
,表明调用exec
已完成;父母确实ptrace(PT_CONTINUE,...)
让孩子跑步。
这一切都适用于普通的二进制文件。另一方面,当运行使用地址清理程序构建的二进制文件时,在执行PT_CONTINUE
恢复进程之后,子进程会立即收到意外的 SIGTRAP。
这可以使用 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)。