当前位置:  技术问答>linux和unix

怎么知道程序当中引起异常的地方?

    来源: 互联网  发布时间:2016-03-06

    本文导语:  在Linux 中,如果我们的程序出现了异常,LINUX 内核会给我们程序发一些特定的信号来控制我们的程序,要么让我们程序终止,要么进行其他的操作。现在我想问大家的是,我自己在程序中定义了信号处理函数来处理...

在Linux 中,如果我们的程序出现了异常,LINUX 内核会给我们程序发一些特定的信号来控制我们的程序,要么让我们程序终止,要么进行其他的操作。现在我想问大家的是,我自己在程序中定义了信号处理函数来处理,怎么能知道出现异常的位置呢?(精确到一个文件就可以了,不用其他的工具)
举个例子,下面的程序怎么能让 系统打印出出错的文件及行号呢?


#include 
#include 
#include 
#include 

void write_log_with_time(char *error)
{//Write the log string to the log file.
long timezone = 8;
time_t timep;
char *time_str = NULL;
time(&timep);
FILE *fp=fopen("sys_log","a+");
time_str = asctime(localtime(&timep));
fprintf(fp,"%s%sn",time_str,error);
fclose(fp);
exit(0);
}

void abrt_handler(int sig)
{
write_log_with_time("aborted with some exception");
}

void fpe_handler(int sig)
{
write_log_with_time("arithmetic exception");
}

void io_handler(int sig)
{
write_log_with_time("io exception");
}

void poll_handler(int sig)
{
write_log_with_time("poll exception");
}

void segv_handler(int sig)
{
write_log_with_time("access the invalidation's district");
}

void sys_handler(int sig)
{
write_log_with_time("invalid system called");
}

void xcpu_handler(int sig)
{
write_log_with_time("exceed the cpu's limit");
}

void xfsz_handler(int sig)
{
write_log_with_time("exceed the file's  limit length");
}



int main()
{char hanframe_buf[10]="456789";
int hanframe[3]={1,2,3},i;
char *p=NULL;

signal(SIGABRT,abrt_handler);
signal(SIGFPE,fpe_handler);
signal(SIGIO,io_handler);
signal(SIGPOLL,poll_handler);
signal(SIGSEGV,segv_handler);
signal(SIGSYS,sys_handler);
signal(SIGXCPU,xcpu_handler);
signal(SIGXFSZ,xfsz_handler);
//strcpy(p,"23456");
i = 100/0;
puts("test 1n");
// hanframe[10]=100;
puts("test 2n");
// hanframe_buf[100]='';
puts("test 3n");
return 0;
}

|
那里有gdb那么复杂? gdb用的是ptrace.


#include   
#include   
#include   
#include   
#include   

#include "bfd.h"

static bfd_vma pc;
static const char *filename;
static const char *functionname;
static unsigned int line;
static bfd_boolean found;

static char *file_name=NULL;
static asymbol **syms;          /* Symbol table.  */

static void find_address_in_section (bfd *abfd, asection *section, void *data)
{
        bfd_vma vma;
        bfd_size_type size;

        if (found)
                return;

        if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0)
                return;

        vma = bfd_get_section_vma (abfd, section);
        if (pc = vma + size)
                return;

        found = bfd_find_nearest_line (abfd, section, syms, pc - vma,
                        &filename, &functionname, &line);
}

void   write_log_with_time(char   *error)
{//Write   the   log   string   to   the   log   file.
        long   timezone   =   8;
        time_t   timep;
        char   *time_str   =   NULL;
        char **matching=NULL;
        void *addr[60];
        bfd *abfd;
        int i;

        time(&timep);
        FILE   *fp=fopen("sys_log","a+");
        time_str   =   asctime(localtime(&timep));
        fprintf(fp,"%s%sn",time_str,error);

        memset(addr, 0, sizeof(addr));
        backtrace(addr, 60);
        for (i=0; i

    
 
 

您可能感兴趣的文章:

  • Linux(Oracle系统在上面)系统无缘无故死机 , 可能是由于应用程序引起 , 可是由于重新启动查不到相关信息 , 不知道在哪里有记录系统CPU Lo
  • red linux8.0下,GCC在什么地方呀?什么地方有文档与样例程序?哪位大哥知道请告知?
  • 誰知道MYsql数据库下载的地方,(包含LINUX及window版本的)
  • 那位知道关于swing的电子书籍下载的地方,下谢了
  • 哪位大侠知道Linux哪个C函数可以获得目录还有多大地方可用?
  • 请问如何知道linux系统下硬盘空间用在哪什么地方?
  • 关于高等数学中积分的问题,不知道发什么地方,就发这里吧!
  • 我安装redhat时,把默认登陆设成了图形界面登陆,不知道在什么地方可以修改成为启动后为字符界面登陆
  • 有哪位知道Java调用标准DLL的参考书(或地方)
  • 大家有谁熟悉Nano-X的嘛?知道nanowm在什么地方可以下载啊?(给分100)
  • 我想买个REDHAT光盘,不知道在什么地方可以买到?
  • linux UDP 发送数据失败,不知道错在什么地方,请指教!!
  • 基于tslib的触摸屏,出现怪异的现在,不知道什么地方出问题了,请大家帮忙
  • web.xml别人配好了的,但我不知道servlet放在什么地方。那个名字访问。tomcate 1.2
  • C++你可能不知道地方小结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 哪位大哥知道?我怎样知道LINUX redhat 7.2下声音设备由哪个应用程序占用?
  • HTML教程 iis7站长之家
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • 怎样知道一个程序是否在运行?
  • 程序中用何函数或方法才知道所运行的java程序名?
  • 请问,如何知道一个应用程序用到了那个库函?
  • unix 下 怎样知道在某个端口监听的程序是什么
  • FEDROA8 下装的rpm程序包,怎么知道启动器放在哪里?
  • 经常听人调试程序时说程序“core了”,不知道所说的“core了”是什么意思?望大虾指点迷津......
  • 有人知道怎么在程序中生成pdf格式的文件吗??高分悬赏!!!!
  • 在程序中启动一个进程(不是线程),如何知道该进程已运行结束
  • 小弟急需要知道程序员查分网站。多谢!!!
  • 听说在linux里面安装一个什么X的程序就可以运行windows的软件,不知道是什么软件
  • 如何知道某个程序有多少个进程在运行?
  • 如何知道程序中调用的库在哪个路径下?
  • 如何知道程序运行过程
  • who知道如何开发linux下的摄像头之类的设备程序?
  • 现在我要写一个UNIX系统上的服务程序,但不知道如何对键盘事件进行响应
  • 如何知道应用程序链接了库里的哪些函数
  • 想写个磁盘空间检测的程序,不知道是perl 还是 shell?
  • 如何知道在linux下面如何知道mysql服务是用哪个端口啊
  • 那位知道怎样能知道 linux C/C++文件它所依赖的文件
  • 我做了个简单的留言板,不知道如何知道留言者的ip地址?
  • 只知道一个命令, 不知道其进程,问如何停止它?
  • red hat linux 9.0安装问题,不知道有人知道吗?
  • 知道进程的ID,有什么函数知道这个进程还活不活?
  • 我插入USB设备,知道是1-1:1.0下面,如何知道ttyUSB?
  • UI小问题,可我就是不知道怎么实现,或许您知道……
  • 我在rh8下装了wine,可是我不知道装到哪里了,那位知道默认路径?
  • 请问如何在不知道对方IP,仅知道MAC地址的情况下和对方通信呢?
  • 已知一个进程的PID,但不知道这个进程是否停止,如何能知道系统中是否有相应的进程在运行。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3