博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

飞翔,嵌入式linux

linux嵌入式系统必将大行于天下。专注于linux嵌入式系统的搭建,专注于高效稳定软件的开发,专注底层程序调试技术。
  feixiang.cublog.cn

关于作者
姓名:飞翔
Email:loughsky@sina.com
职业:IT
年龄:32
位置:北京
个性介绍:专注在嵌入式操作系统,以及高效程序调试
|| << >> ||
我的分类


如何捕获exec所执行程序产生的信号.
我现在计划使用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();
}

发表于: 2007-03-05,修改于: 2007-04-04 10:38,已浏览325次,有评论1条 推荐 投诉


网友评论
网友: 本站网友 时间:2008-05-20 16:42:20 IP地址:64.104.170.★
请问这个问题有解决的方法了吗?

 发表评论