1

我正在尝试在 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)。

4

0 回答 0