使用ptrace时检测tracee是否在信号处理程序中

时间:2017-11-27 03:39:28

标签: gdb signals ptrace

我在Linux上测试它,似乎当tracee在信号处理程序中时,跟踪器可以像往常一样使用ptrace()附加到它。但由于tracee位于信号处理程序中,因为asyn信号安全问题,某些函数可能无法调用。那么,调用ptrace()后是否有任何方法可以检测到这种情况?

1 个答案:

答案 0 :(得分:4)

recent discussion可能会让您感兴趣。

简短的回答是,可以通过展开其堆栈并查找rt_sigreturn条目来判断劣质(tracee)是否在信号处理程序中。

这是GDB打印为<signal handler called>的条目。

然而,问题是:你为什么关心?

当您的最终用户要求您执行相当于(gdb) call malloc(10)的操作时,可能是为了防止您的调试器调用tracee。

请注意:

  1. GDB确实 阻止最终用户这样做。如果这个过程破坏了它的堆或死锁,那么它就是最终用户的问题,而不是GDB的问题。

  2. 调试器无法知道应该允许或禁止哪些功能,并且此确定取决于信号是否同步以及信号源自何处。例如:

    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
    }