标准方法如下:
if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1)
printf("traced!\n");
在这种情况下,如果跟踪当前进程(例如,使用GDB运行它或附加到它),ptrace将返回一个错误.
但这有一个严重的问题:如果呼叫成功返回,GDB可能以后不会连接到它.这是一个问题,因为我没有try 实现反调试的东西.我的目的是在满足一个条件(例如,断言失败)并且GDB正在运行时(否则我会得到一个停止应用程序的SIGTRAP)发出一个"int 3".
禁用SIGTRAP并每次都发出一个"int 3"不是一个好的解决方案,因为我正在测试的应用程序可能会将SIGTRAP用于其他目的(在这种情况下,我仍然被搞砸了,所以这无关紧要,但这是原理:)