Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6033
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-14 11:21
个人简介

技术至上

文章分类
文章存档

2014年(1)

我的朋友

分类: LINUX

2014-08-14 17:50:36

    在执行print_audit_info函数时,出现了coredump现象,相关代码如下所示。

static void print_audit_read(struct audit_item **items,int audit_num)

{

    int j = 0;

    static int i = 0;

    while(j++ < audit_num) {

        print info;

        i++;  }   

}

audit_read_callback func = print_audit_read;

audit_start_read(func, 5, 20);

int audit_start_read(audit_read_callback func,int interval,int audit_num)

{

    pthread_t pid;

    g_audit_num = audit_num;

    g_interval  = interval;

    g_func = func;

    pthread_create(&pid, NULL, (void *)thread_read, NULL);

}

int thread_read(void *arg)

{

    pthread_detach(pthread_self());

......

g_func(g_items, num);

}

ubuntu下默认情况是不生成core文件的,需要用户以root权限去更改相关配置,涉及到的命令如下:

#设置core大小为无限

ulimit -c unlimited

#设置文件大小为无限

ulimit unlimited

而后重新程序,在make命令的-o之前,添加-g参数,以便gdb调试。以gdb ./process core进入调试,以r命令运行,后打印信息如下:

     Program received signal SIGSEGV, Segmentation fault.

SIGSEGV是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。一个程序接收到SIGSEGV时的默认动作是异常终止。这个动作也许会结束进程,但是可能生成一个核心文件以帮助调试,或者执行一些其他特定于某些平台的动作。SIGSEGV通常由操作系统生成,但是有适当权限的用户可以在需要时使用kill系统调用或kill命令(一个用户级程序,或者一个shell内建命令)来向一个进程发送信号。

通过调试,发现问题所在,因为生成线程相关的函数thread_read执行时调用pthread_detach函数,从而不能获取父进程相关的数据。子进程能够调用g_funcg_items变量,因为它们是全局可见的,而对于print_audit_read下的i参数,则无法正确读取,导致失败。

 

阅读(869) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~