2014-01-06 80 views
0

我正在研究在Linux上运行的C++应用程序。该应用程序有几组信号处理程序相互干扰。我的任务是了解如何设置这些处理程序并使其处于有序状态。我对他们中的一些人很熟悉,需要找到其他人。我试图在源代码中搜索像'signal'和'sigaction'这样的词,但找不到任何我不知道的处理程序。C++应用程序中的多个信号处理程序

还有什么可以找到这些处理程序的其他方法?

有没有办法在运行时看到/跟踪那些处理程序的安装?

+0

它们可能被图书馆使用。你可以“拉紧”你的应用程序,以了解它正在安装的信号。绝对读[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)? –

+0

我已经运行strace。它显示了多个对rt_sigaction()的调用。尽管如此,它并没有显示电话来自哪里。 应用程序非常大。它由几个模块组成(文件总数为几千)。它可以与多种第三方工具(如Oracle,ACE等)协同工作。我们拥有其中一些第三方工具的源代码,并且可以访问整套源代码文件。每个模块都是共享库。其中一些链接到可执行文件,而其他人通过dlopen()加载() – GMichael

回答

0

可以使用sigaction(2)NULLact参数和非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) ...)

+0

您的提议给出的地址,而不是我需要的函数/方法名称。 – GMichael

1
Is there any way to see/trace installing of those handlers during run time? 

您可以设置的sigaction()函数中设置断点,并打印回溯到达断点时。

ADDED:作为评论,一些代码可能使用signal()函数来设置信号处理程序,因此您也可以跟踪该函数。

+0

第三方库可能使用旧的'signal(2)'设置信号处理程序... –

+0

我试着在两个调用中设置一个断点。没有显示一件事。 – GMichael

+1

@Michael尝试先在'main'上设置一个断点。当它命中时,在'signal'和'sigaction'上设置断点。 –

0

我设法了解创建我自己的signal()和sigaction()调用会发生什么。它们什么都不做,只是在调用时打印堆栈跟踪。由于它们出现在我的代码中,它们影响真实的代码,我可以看到所有设置信号处理程序的地方。我使用了backtrace()调用族进行堆栈打印。 谢谢所有帮助过的人。

相关问题