本文部分内容转载自网络, 如涉及版权, 请联系我, 删除。
先讲core 文件产生及gdb查看的方法
对于想要每次都产生core 文件的同志:
1、vim /etc/profile 修改对应的ulimit 处, 改为
ulimit -S -c unlimited > /dev/null 2>&1
2、echo "1" > /proc/sys/kernel/core_uses_pid //设置core文件名带pid号
3、echo "./core-%e-%p-%t" > core_pattern //设置core 文件路径及文件名
接着
[root@localhost testcode]# gcc 1.c -g -o 1
[root@localhost testcode]# ./1
段错误 (core dumped)
[root@localhost testcode]# gdb ./1 core.11162 即可查看core文件
对于只需要一次性的同志:
第一步骤改为ulimit -c unlimited 即可。
下面是详细介绍:
core文件的生成开关和大小限制
1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。Example:
ulimit -c 0 不产生core文件
ulimit -c 100 限制文件大小最大为100k
ulimit -c unlimited 不限制core文件大小
2.core文件的名称和生成路径
core文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成的core文件不带其它任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。
1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid
2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
Ps : 发现无法在根目录下创建corefile目录, 所以改成创建在当前目录下,看了下可以成功。
当然我们可以在/etc/profile 修改
ulimit -S -c unlimited > /dev/null 2>&1
上面的设置允许系统上的所有用户产生没有文件大小限制的core文件。 一劳永逸
看一段代码:
#include <stdio.h>
int main()
{
char *ptr ="linux";
*ptr = 0;
}
[root@localhost testcode]# gcc -g 1.c -o 1
[root@localhost testcode]# ./1
段错误 (core dumped)
产生core文件了,
[root@localhost testcode]# ls -al core*
-rw------- 1 root root 139264 07-12 22:33 core-1-10757-1342103638
[root@localhost testcode]# gdb ./1 core-1-10757-1342103638
GNU gdb Red Hat Linux (6.5-25.el5rh)
Copyright (C) 2006 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-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
warning: Can't read pathname for load map: 输入/输出错误.
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./1'.
Program terminated with signal 11, Segmentation fault.
#0 0x0804836f in main () at 1.c:16
16 *ptr = 0;
(gdb)
在多线程调试的时候, 可以使用info threads,查看了一下当时线程的情况。
(gdb)info threads
gdb)info threads
21 process 5797 0x00000038e8d7186d in memset () from /lib64/tls/libc.so.6
20 process 5839 0x00000038e8dc6c8c in epoll_wait () from /lib64/tls/libc.so.6
19 process 5842 0x00000038e8d8f7d5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6
18 process 5845 0x00000038e8d8f7d5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6
通过命令thread 21,进入到thread 21的调用栈。
(gdb) thread 21
[Switching to thread 21 (process 5797)]#0 0x00000038e8d7186d in memset () from /lib64/tls/libc.so.6
(gdb)bt
#0 0x00000038e8d7186d in memset () from /lib64/tls/libc.so.6
#1 0x000000000049da0d in CGSPduFactory::streamStringFrom (is=@0x7fff9b436360, strFrom=@0x2aaaec979760) at common/pdu/gspdu.cpp:422
(gdb)f 3
#3 0x000000000049cb2d in CGSPduFactory::derivePdu (is=@0x7fff9b436360, ulPDULen=30506) at common/pdu/gspdu.cpp:79
79 common/pdu/gspdu.cpp: No such file or directory.
in common/pdu/gspdu.cpp
使用命令 i locals,打印所有的变量的值。
(gdb)i locals
pPdu = (CBasePdu *) 0x2aaaec951650
pPduHeader = (CPduHeader *) 0x2aaaea1c4190
ulPduType = 50