标准方法如下:
if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1) printf("traced!\n");
在这种情况下,如果跟踪当前进程(例如,使用gdb运行或附加到该进程),则ptrace返回错误。
但这有一个严重的问题:如果调用成功返回,则gdb稍后可能不会附加到它。这是一个问题,因为我没有尝试实现反调试的东西。我的目的是在满足条件(即断言失败)并且gdb正在运行时发出“ int 3”(否则,我会得到SIGTRAP来停止应用程序)。
禁用SIGTRAP并每次发出’int 3’并不是一个很好的解决方案,因为我正在测试的应用程序可能出于其他其他目的使用SIGTRAP(在这种情况下,我还是被搞砸了,所以没关系,但这是事情的原理:))
谢谢
以前作为注释:您可以派生一个将尝试与PTRACE_ATTACH其父对象(然后在必要时分离)的孩子并将结果传达回去。看起来确实有点不雅。
PTRACE_ATTACH
如您所述,这是非常昂贵的。我认为断言不定期失败并不太糟。也许值得一个长期运行的孩子来做这件事- 在父母与孩子之间共享两个管道,孩子在读取字节后会进行检查,然后将状态发送回字节。