我在Linux上测试它,似乎当tracee在信号处理程序中时,跟踪器可以像往常一样使用ptrace()附加到它。但由于tracee位于信号处理程序中,因为asyn信号安全问题,某些函数可能无法调用。那么,调用ptrace()后是否有任何方法可以检测到这种情况?
答案 0 :(得分:4)
此recent discussion可能会让您感兴趣。
简短的回答是,可以通过展开其堆栈并查找rt_sigreturn条目来判断劣质(tracee)是否在信号处理程序中。
这是GDB打印为<signal handler called>
的条目。
然而,问题是:你为什么关心?
当您的最终用户要求您执行相当于(gdb) call malloc(10)
的操作时,可能是为了防止您的调试器调用tracee。
请注意:
GDB确实 阻止最终用户这样做。如果这个过程破坏了它的堆或死锁,那么它就是最终用户的问题,而不是GDB的问题。
调试器无法知道应该允许或禁止哪些功能,并且此确定取决于信号是否同步以及信号源自何处。例如:
void handler(int signo)
{
while (1)
{
char *p = malloc(20); // perfectly safe (but only in this program)
free(p);
}
}
int main()
{
signal(SIGINT, handler);
kill(getpid(), SIGINT);
return 0; // control never reaches here
}