Linux下Core文件能够帮助我们定位信息,Android下同样也可以生成Core文件。下面举例说明:
首先请阅读上面章节中,如何生成带调试信息的可调式执行程序以及so库。
然后,adb push到虚拟仿真机中。
for(int i = 0;i<3;i++)
{
printf("i = %d\n",i);
char * p=NULL;
char src[]="1232222222";
strcpy(p, src);
}
上面程序中strcpy(p, src);会出现内存访问错误。下面举例如何定位该问题。
程序运行一次for循环后,出现内存访问错误,异常停止。
如果需要生成core文件,而不采用gdb调试,则需要设置仿真机中的adb shell文件。
进入adb shell环境:
# ulimit -c unlimited
# ulimit -a
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) 8192
coredump(blocks) unlimited
memory(kbytes) unlimited
locked memory(kbytes) 64
process(processes) 4096
nofiles(descriptors) 1024
#
使用命令
# ulimit -c unlimited
开启core文件生成机制。
使用命令
# ulimit -a
可以看到是否开启。
再次执行被测程序:
# ./temptest
main enter
i = 0
[1] + Stopped (signal) ./temptest
# ls
core
gdb.setup
gdbserver
libcrystax.so
libgnustl_shared.so
temptest
[1] Segmentation fault (core dumped) ./temptest
#
可以发现生成了core文件。
在另一个终端中找到arm-linux-androideabi-gdb工具所在目录
#cd /opt/android-ndk-r7-crystax-1/toolchains/arm-linux-androideabi-4.6.3/prebuilt/linux-x86/bin
使用命令adb pull把core文件下载下来:
[root@bogon bin]# adb pull /data/data/xtest/core
1155 KB/s (1601536 bytes in 1.353s)
[root@bogon bin]#
使用arm-linux-androideabi-gdb进行core文件调试。
[root@bogon bin]# arm-linux-androideabi-gdb -c core /home/testCodes/obj/local/armeabi-v7a/temptest