使用clang地址清理程序构建的二进制文件在OS X ptrace

时间:2015-11-19 03:22:12

标签: macos clang ptrace address-sanitizer

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

0 个答案:

没有答案