2024年4月19日发(作者:)

Coredump

关于程序core dump的调试方法简述:

首先,在程序不正常退出时,内核会在当前工作目录下生成一个core文件(是一个内存

映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码

所在文件和行数。这个能给debug带来极大方便。

查看core dump位置方法:"gdb ./app core".

故,我们需要gdb,可执行文件app,以及core文件。下面将根据这3个需求,依次

得到它们;

一、

1,得到gdb;

其实这个是最简单的,Linux PC上gdb不用说了。Android的是

~/opt/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/

bin/arm-linux-androideabi-gdb(其中~/opt/,与个人设置有关;android-ndk-r7与编译

器版本有关,貌似android-ndk-r4没有toolchains目录,不知是否可以用gdbserver调试

程序,当然这就不在本文档的讨论范围之内了).

2,得到可执行文件app

由于要使用gdb,所以app必须是"not stripped".Linux PC上"gcc hello.c"编译出来

的默认就是"not stripped".Android工程中jni目录下,我们使用"ndk-build"默认

是"stripped"的。因此需要更改编译脚本:在~/opt/android-ndk-r7/build/core/中打开

文件,将"cmd-strip = $(PRIVATE_STRIP)

--strip-unneeded $(call host-path,$1)"这一行注释掉.这一行就是做的"strip"操作。再用

"ndk-build"编译就是"not stripped"的了。

3,得到core文件(程序异常退出时,当前目录已经有core文件了,当然,此步可以跳

过)

Linux PC和Android,命令"ulimit -c"查看生成的core文件的大小限制。一般输出是

"0",即不允许生成core文件,命令"ulimit -c unlimited"将其设置成无限制。再次运行程序

时,就会生成core文件了。此外"ulimit -a"可以查看所有设置。另外一个重要参数是core

文件的路径,“cat /proc/sys/kernel/core_pattern”输出core文件的路径,当然也可以修

改路径,例如“echo core > /proc/sys/kernel/core_pattern”将其保存在当前路径下.

4,到此仅需运行"gdb ./app core"(Linux PC)或android :

"~/opt/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86

/bin/arm-linux-androideabi-gdb ./app core",就可以看到程序出错的位置。如果不够详

细,用"bt"命令,将会列出函数调用关系。下面是一个实际例子(程序代码已经在gdb中

列出):

hat@SIGMA:~/sigma/process/libs/armeabi$ ~/opt/android-ndk-r7/toolchains

/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb ./

testcore core