我正在研究在Linux上运行的C ++应用程序。该应用程序有几组信号处理程序相互干扰。我的任务是了解如何设置这些处理程序并将它们整理好。我熟悉其中的一些,需要找到所有其他的。我试图在源代码中搜索“signal”和“sigaction”之类的单词,但找不到任何我不知道的处理程序。
找到这些处理程序的其他方法是什么?
有没有办法在运行时查看/跟踪这些处理程序的安装?
答案 0 :(得分:1)
Is there any way to see/trace installing of those handlers during run time?
您可以在sigaction()函数上设置断点,并在到达断点时打印回溯。
ADDED:如评论所述,某些代码可能会使用signal()函数来设置信号处理程序,因此您也可以跟踪该函数。
答案 1 :(得分:0)
您可以sigaction(2)使用NULL
秒act
参数和非NULL
第三个oldact
参数来查询(即检查)信号处理给定signum
,sigaction
的第一个参数:
struct sigaction oldactst;
memset (&oldactst, 0, sizeof(oldactst));
if (sigaction (signum, NULL, &oldactst))) {
perror("examining sigaction"); exit (EXIT_FAILURE);
}
// do something with oldactst
然后可能使用调试器或dladdr(3)将地址转换为合理的名称....不要忘记将整个应用程序与-rdynamic
链接(如果可能的话,将其编译为-g
,即有调试信息)......
正如我评论的那样阅读signal(7) ......
另请参阅/proc/self/status
或/proc/$PID/status
(例如proc(5) ...)
答案 2 :(得分:0)
我设法通过创建自己的signal()和sigaction()调用来了解会发生什么。它们只会在调用时打印堆栈跟踪。由于它们出现在我的代码中,它们会影响真实的代码,我可以看到所有设置信号处理程序的地方。我使用backtrace()调用系列进行堆栈打印。 感谢所有帮助过的人。