技术至上
全部博文(1)
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_func和g_items变量,因为它们是全局可见的,而对于print_audit_read下的i参数,则无法正确读取,导致失败。