我正在研究在Linux上运行的C++应用程序。该应用程序有几组信号处理程序相互干扰。我的任务是了解如何设置这些处理程序并使其处于有序状态。我对他们中的一些人很熟悉,需要找到其他人。我试图在源代码中搜索像'signal'和'sigaction'这样的词,但找不到任何我不知道的处理程序。C++应用程序中的多个信号处理程序
还有什么可以找到这些处理程序的其他方法?
有没有办法在运行时看到/跟踪那些处理程序的安装?
我正在研究在Linux上运行的C++应用程序。该应用程序有几组信号处理程序相互干扰。我的任务是了解如何设置这些处理程序并使其处于有序状态。我对他们中的一些人很熟悉,需要找到其他人。我试图在源代码中搜索像'signal'和'sigaction'这样的词,但找不到任何我不知道的处理程序。C++应用程序中的多个信号处理程序
还有什么可以找到这些处理程序的其他方法?
有没有办法在运行时看到/跟踪那些处理程序的安装?
可以使用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
进行编译,即带有调试信息)连接...
读也因为我评论...
参见/proc/self/status
或/proc/$PID/status
(例如proc(5) ...)
您的提议给出的地址,而不是我需要的函数/方法名称。 – GMichael
Is there any way to see/trace installing of those handlers during run time?
您可以设置的sigaction()函数中设置断点,并打印回溯到达断点时。
ADDED:作为评论,一些代码可能使用signal()函数来设置信号处理程序,因此您也可以跟踪该函数。
第三方库可能使用旧的'signal(2)'设置信号处理程序... –
我试着在两个调用中设置一个断点。没有显示一件事。 – GMichael
@Michael尝试先在'main'上设置一个断点。当它命中时,在'signal'和'sigaction'上设置断点。 –
我设法了解创建我自己的signal()和sigaction()调用会发生什么。它们什么都不做,只是在调用时打印堆栈跟踪。由于它们出现在我的代码中,它们影响真实的代码,我可以看到所有设置信号处理程序的地方。我使用了backtrace()调用族进行堆栈打印。 谢谢所有帮助过的人。
它们可能被图书馆使用。你可以“拉紧”你的应用程序,以了解它正在安装的信号。绝对读[signal(7)](http://man7.org/linux/man-pages/man7/signal.7.html)和[sigaction(2)](http://man7.org/linux/man -pages/man2/sigaction.2.html)并告诉我们更多关于您的应用程序的信息:您是否拥有其所有源代码以及库的所有源代码;它加载插件通过[dlopen(3)](http://man7.org/linux/man-pages/man3/dlopen.3.html)? –
我已经运行strace。它显示了多个对rt_sigaction()的调用。尽管如此,它并没有显示电话来自哪里。 应用程序非常大。它由几个模块组成(文件总数为几千)。它可以与多种第三方工具(如Oracle,ACE等)协同工作。我们拥有其中一些第三方工具的源代码,并且可以访问整套源代码文件。每个模块都是共享库。其中一些链接到可执行文件,而其他人通过dlopen()加载() – GMichael