标准方法如下:

if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1)
  printf("traced!\n");

在这种情况下,如果跟踪当前进程(例如,使用GDB运行它或附加到它),ptrace将返回一个错误.

但这有一个严重的问题:如果呼叫成功返回,GDB可能以后不会连接到它.这是一个问题,因为我没有try 实现反调试的东西.我的目的是在满足一个条件(例如,断言失败)并且GDB正在运行时(否则我会得到一个停止应用程序的SIGTRAP)发出一个"int 3".

禁用SIGTRAP并每次都发出一个"int 3"不是一个好的解决方案,因为我正在测试的应用程序可能会将SIGTRAP用于其他目的(在这种情况下,我仍然被搞砸了,所以这无关紧要,但这是原理:)

推荐答案

您可以派生一个try 将其父级设置为PTRACE_ATTACH的子级(如有必要,然后分离),并将结果传回.不过,这看起来确实有点不雅观.

正如你所说,这是相当昂贵的.我想如果断言不规则地失败也不算太糟糕.也许有必要让一个长时间运行的子进程来完成这项工作——在父进程和子进程之间共享两个管道,子进程在读取一个字节时进行判断,然后返回一个字节的状态.

C++相关问答推荐

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

%p与char* 等组合缺少的GCC Wform警告

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

创建一个fork导致fget无限地重新读取文件

不会停在空格或换行符上的错误

非正规化边缘毛刺

将uintptr_t添加到指针是否对称?

如何在下面的C代码中正确管理内存?

如何按顺序将所有CSV文件数据读入 struct 数组?

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

链接到底是如何工作的,我在这里到底做错了什么

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

错误:字符串在C中获得意外输出

将复合文字数组用作临时字符串缓冲区是否合理?

Dlsym()的手册页解决方法仍然容易出错?

在我的函数中实现va_arg的问题

C: NULL>;NULL总是false?

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

如何使crc32的结果与cksum匹配?

macos/arm64 上地址空间不使用第一位吗?