怎么打开core文件

怎么打开core文件,第1张

core文件是由应用程序收到系统信号后崩溃产生的,该文件中记录了程序崩溃的原因(例如含亩收到闭枯那种信号),调用堆栈和崩溃时的内存及变量值等等的信息。 打开core文件与编译时使用的编译器有关,但绝大多数linux程序是使用gcc编译器编译的,因此可使用对应gdb调试器打开,命令格谈态森式如下: $ gdb 应用程序文件名 core文件名 举例: $ gdb /usr/bin/gedit ~/core------ 查看由gedit崩溃产生的core文件 (gdb) bt------ 或者backtrace, 查看程序运行到当前位置之前所有的堆栈帧情况) (gdb) quit ------ 退出 如果不知道core文件由哪个文件产生的,可使用file命令显示 $ file cor

在Unix系统下,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要旦毁的,本文对此做简单介绍。

例如,一个程序cmm_test_tool在运行的时候发生了错误,并生成了一个core文件,如下:

-rw-r–r– 1 root cmm_test_tool.c

-rw-r–r– 1 root

cmm_test_tool.o

-rwxr-xr-x 1 root cmm_test_tool

-rw--- 1 root

core.19344

-rw--- 1 root core.19351

-rw-r–r– 1 root

cmm_test_tool.cfg

-rw-r–r– 1 root cmm_test_tool.res

-rw-r–r– 1 root

cmm_test_tool.log

[root@AUTOTEST_SIM2 mam2cm]#

就可以利用命令gdb进行查找,参数一是应用程序的名称,参数二是core文件,运余历行

gdb

cmm_test_tool core.19344结果如下:

[root@AUTOTEST_SIM2 mam2cm]# gdb cmm_test_tool core.19344

GNU gdb Red Hat

Linux (5.2.1-4)

Copyright 2002 Free Software Foundation, Inc.

GDB is free

software, covered by the GNU General Public License, and you are

welcome to

change it and/or distribute copies of it under certain conditions.

Type “show

copying” to see the conditions.

There is absolutely no warranty for GDB. Type

“show warranty” for details.

This GDB was configured as

“i386-redhat-linux”…

Core was generated by `./cmm_test_tool’.

Program

terminated with signal 11, Segmentation fault.

Reading symbols from

/lib/i686/libpthread.so.0…done.

Loaded symbols for

/lib/i686/libpthread.so.0

Reading symbols from

/lib/i686/libm.so.6…done.

Loaded symbols for /lib/i686/libm.so.6

Reading

symbols from /usr/lib/libz.so.1…done.

Loaded symbols for

/usr/lib/libz.so.1

Reading symbols from

/usr/lib/libstdc++.so.5…done.

Loaded symbols for

/usr/lib/libstdc++.so.5

Reading symbols from

/lib/i686/libc.so.6…done.

Loaded symbols for /lib/i686/libc.so.6

Reading

symbols from /lib/libgcc_s.so.1…done.

Loaded symbols for

/lib/libgcc_s.so.1

Reading symbols from /lib/竖迟搜ld-linux.so.2…done.

Loaded

symbols for /lib/ld-linux.so.2

Reading symbols from

/lib/libnss_files.so.2…done.

Loaded symbols for /lib/libnss_files.so.2

#0

0×4202cec1 in __strtoul_internal () from

/lib/i686/libc.so.6

(gdb)

进入gdb提示符,输入where,找到错误发生的位置和堆栈,如下:

(gdb) where

#0 0×4202cec1 in __strtoul_internal () from

/lib/i686/libc.so.6

#1 0×4202d4e7 in strtoul () from

/lib/i686/libc.so.6

#2 0×0804b4da in GetMaxIDFromDB (get_type=2,

max_id=0×806fd20) at cmm_test_tool.c:788

#3 0×0804b9d7 in ConstrctVODProgram

(vod_program=0×40345bdc) at cmm_test_tool.c:946

#4 0×0804a2f4 in

TVRequestThread (arg=0×0) at cmm_test_tool.c:372

#5 0×40021941 in

pthread_start_thread () from /lib/i686/libpthread.so.0

(gdb)

至此,可以看出文件出错的位置是函数 GetMaxIDFromDB

,两个参数分别是2和0×806fd20,这个函数位于源代码的788行,基于此,我们就可以有针对性的找到问题的根源,并加以解决。

这个限制是在/etc/profile里面设置的: ulimit -S -c 0 >/dev/null 2>1 有几种方法可以让系统产生core文件。第一个方法是修改/etc/profile里面的ulimit命令,如下: ulimit -S -c unlimited >/dev/null 2>1 上面的设置允许系统上的所有用户产生没有文件大小限制的core文件。 如果只需要对部分用户或组开腊明放产生core文件的权限,需要编辑/etc/security/limits.conf文件。例如,所有在"devel"组里面的用户可以产生core文件:#@devel soft core 是core文件的最大块大小。 在/etc/security/limits.conf文件里面有配置参数的详细说明。提示,如果想通过limits.conf里面的设置来控制用户是否 可以产生core文件,需要把/etc/profile里面的ulimits设置注释掉: # No core files by default # ulimit -S -c 0 >/dev/null 2>1 如果应用是通过daemon命令来启动的,编辑/etc/init.d/functions,注释掉ulimit的设置或改变这行: ulimit -S -c 0 >/dev/null 2>1 通过上面的设置,应用程序者好应该可以产生core文件。如果不能产生core文件,请检查您的应用程序是否拥有正确的uid,在程序执行的时候是否有 使用setuid改变程序的uid。 在红帽企业Linux 3上面, 可以通过下面的命令允许使用setuid的首局铅应用程序产生core文件: echo 1 >/proc/sys/kernel/core_setuid_ok 另外,您也可以在应用程序中添加下面的代码来实现: prctl(PR_SET_DUMPABLE, 1)默认情况下,core文件会创建在应用程序的工作目录下。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8156994.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存