我现在计划使用backtrace来制作一个调试工具,捆绑一个执行文件后,对其产生的信号进行捕获,并将其堆栈打印出来,从而能够定位程序的异常.
我现在发现,原来在主程序中注册的信号捕获,再执行了exec后,不起作用.
代码如下.
UNIX环境高级编成有一段话:当执行一个程序时,所有信号的状态都是系统默认或忽略.通常所有信号都被设置为系统默认动作.除非调用exec的进程忽略该信号.比较特殊的是,exec函数将原来设置为要捕捉的信号都更改为默认动作,其他信号的状态则不便.
请问怎么突破这个限制,gdb是如何做的呢?
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <execinfo.h>
#include <sys/types.h>
#include <unistd.h>
#include <linux/user.h>
static void sig_usr(int);
int PrintStack()
{
void *array[25];
int nSize=backtrace(array,25);
char **symbols=backtrace_symbols(array,nSize);
printf("------------stack----------\n");
int i=0;
for(i=0;i<nSize;i++)
{
printf("%s\n",symbols);
}
printf("------------------------\n");
/* free(symbols);*/
return 0;
}
int main(void)
{
if(signal(SIGFPE,sig_usr) == SIG_ERR)
{
printf("can't catch SIGFPE");
return 0;
}
execl("/home/e11963/szw/debugtools/test/hello","hello",NULL);
}
static void sig_usr(int signo)
{
if(signo == SIGFPE)
printf("receive the SIGFPE \n");
PrintStack();
}