如何分析CoreDump文件

如何分析CoreDump文件

CoreDump文件一般位于手机/data/core/目录下,如/data/core/!system!bin!app_process32.8115.QSTileHost

1.使用Eclipse ADT分析coredump

     Eclipse-->Run-->Debug Configurations-->C/C++ Postmortem Debugger 右击New或者双击生成一个New configuration:

Eclipse Debug configurations 1.png

Name: 随便取一个标识此次debug的名字

C/C++ Application: /data1/AJ9_3/out/target/product/idol347/symbols/system/bin/app_process32
 (通过查看从手机导出来的coredump文件名,来看具体填哪个bin,本次调试用corefile文件名为!system!bin!app_process32.7740.QSTileHost,很明显就是app_process32 )

Core file: /data1/AJ9_3/coredump/!system!bin!app_process32.7740.QSTileHost
(从手机data/core目录导出来)

GDB debugger: /data1/AJ9_3/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gdb

Shared Libraries: /data1/AJ9_3/out/target/product/idol347/symbols/system/lib/
(带symbol的共享库文件)

Eclipse Debug configurations 2.png Eclipse Debug configurations 3.png

待这以上几项都配置好了,点击Debug,确认OK就可显示crash信息。

Eclipse Debug configurations 4.png

点击Yes确认,进入Debug界面:

Eclipse Debug configurations 5.png

通过Debug栏依照Thread ID从小到大查看,发现Thread[1] 定位SetTorchBrightness() at torchnative.cpp:157, 发现strcpy()有问题。

2.直接通过gdb工具分析CoreDump定位问题

1)shell终端执行命令:gdb文件 手机可执行程序文件名 core文件名

user@aclgcl-ubnt:/data1/AJ9_3$ ./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gdb out/target/product/idol347/symbols/system /bin/app_process32 ./coredump/\!system\!bin\!app_process32.7740.QSTileHost

3)gdb终端执行命令:set solib-search-patch 共享库位置

(gdb) set solib-search-path out/target/product/idol347/symbols/system/lib/

4)gdb终端执行bt命令查看backstack信息

(gdb) bt

user@aclgcl-ubnt:/data1/AJ9_3$./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gdb out/target/product/idol347/symbols/system
/bin/app_process32 ./coredump/\!system\!bin\!app_process32.7740.QSTileHost
GNU gdb (GDB) 7.6 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law.  Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-linux-android". 
For bug reporting instructions, please see: 
<http://source.android.com/source/report-bugs.html>... 
Reading symbols from /data1/AJ9_3/out/target/product/idol347/symbols/system/bin/app_process32...done. 

warning: core file may not match specified executable file. 
[New LWP 7804] 
[New LWP 7749] 
[New LWP 7757] 
.
.
.
[New LWP 7740] 
[New LWP 7803] 
[New LWP 7802] 

warning: Could not load shared library symbols for 115 libraries, e.g. /system/bin/linker. 
Use the "info sharedlibrary" command to see the complete listing. 
Do you need "set solib-search-path" or "set sysroot"? 
Core was generated by `com.android.systemui                                                       '. 
Program terminated with signal 11, Segmentation fault. 
#0  0xb6f880b2 in ?? () 
(gdb) set solib-search-path out/target/product/idol347/symbols/system/lib/ 
Reading symbols from /data1/AJ9_3/out/target/product/idol347/symbols/system/lib/libc.so...done. 
Loaded symbols for /data1/AJ9_3/out/target/product/idol347/symbols/system/lib/libc.so 
Reading symbols from /data1/AJ9_3/out/target/product/idol347/symbols/system/lib/libm.so...done. 
.
.
.
Loaded symbols for /data1/AJ9_3/out/target/product/idol347/symbols/system/lib/libmemalloc.so 
Reading symbols from /data1/AJ9_3/out/target/product/idol347/symbols/system/lib/libqdMetaData.so...done. 
Loaded symbols for /data1/AJ9_3/out/target/product/idol347/symbols/system/lib/libqdMetaData.so 
(gdb) bt 
#0  0xb6f880b2 in strcpy () at bionic/libc/arch-arm/cortex-a15/bionic/strcpy.S:81 
#1  0xa5bf26e6 in strcpy (src=0xa5bf299d "TEST", dest=0xa5bf2998 "test") at bionic/libc/include/string.h:119 
#2  SetTorchBrightness (env=<optimized out>, thiz=<optimized out>, brightness=200) at frameworks/base/packages/SystemUI/jni/torchnative.cpp:157 
#3  0x00000024 in ?? () 
#4  0x00000024 in ?? () 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 
(gdb)

同样定位问题在torchnative.cpp:157 strcpy函数

<think>嗯,用户想了解如何用GDB调试和分析coredump文件。我需要根据提供的引用内容来整理步骤。首先,确认用户可能已经生成了core文件,但需要知道如何启用core文件生成。引用1提到在core目录下用gdb -c core启动调试器,这可能是一个关键步骤。 接下来,用户可能需要知道如何加载可执行文件和core文件。引用2中的例子显示编译时需要-g选项,所以应该提醒用户编译时加上调试信息。另外,运行gdb的时候要指定可执行文件和core文件,比如gdb ./a.out core,这可能比仅用-c更准确。 然后,分析core文件时,查看调用栈是重要的,如引用3中的bt命令。这能帮助用户定位崩溃位置。可能需要提到使用bt full查看详细信息,以及info locals查看局部变量。 还有,引用4提到动态的问题,可能需要检查动态是否加载正确,或者使用readelf查看的大小。这部分可能比较高级,但用户可能需要知道如何确认地址是否在的范围内。 用户可能的问题还包括如何生成core文件,所以需要步骤如ulimit设置和core_pattern配置。此外,常见错误如空指针解引用,如引用2中的例子,可以通过GDB的x命令检查内存地址。 最后,生成相关问题时要覆盖GDB调试的其他方面,比如性能分析、优化方法等,但根据用户当前问题,应集中在coredump分析上。需要确保回答结构清晰,分步骤说明,并引用正确的引用来源。</think>### 如何用GDB调试和分析coredump文件? #### **1. 准备工作:生成core文件** - **启用core文件生成** 在Linux系统中执行命令: ```bash ulimit -c unlimited # 解除core文件大小限制 echo "core.%e.%p" > /proc/sys/kernel/core_pattern # 定义core文件命名格式 ``` - **编译程序时添加调试信息** 使用`-g`参数编译代码(如`g++ -g -o demo main.cpp`)[^2]。 --- #### **2. 加载coredump文件** 在core文件所在目录执行以下命令: ```bash gdb <可执行文件路径> <core文件路径> # 例如:gdb ./demo core.demo.12345 ``` 或通过GDB交互模式加载: ```bash gdb -q ./demo (gdb) core-file core.demo.12345 ``` --- #### **3. 关键调试步骤** 1. **查看崩溃位置** 使用`bt`(backtrace)命令显示函数调用栈: ```bash (gdb) bt # 输出类似: #0 0x0000562f8287f249 in func4(char*) () #1 0x0000562f8287f223 in func3(char*) () #2 0x0000562f8287f204 in func2(char*) () ... [^3] ``` 结合`bt full`查看局部变量详细信息。 2. **检查内存地址有效性** - 若崩溃地址属于动态(如`0x0000000078cf3ff8`),需确认动态是否加载: ```bash (gdb) info sharedlibrary # 查看已加载的动态 ``` - 使用`readelf -l <动态路径>`检查内存映射范围[^4]。 3. **定位具体代码行** 使用`list`或`frame <编号>`跳转到特定栈帧: ```bash (gdb) frame 0 # 查看最顶层栈帧 (gdb) list # 显示附近代码 ``` 4. **分析变量状态** - `p <变量名>`:打印变量值(如`p *ptr`检查空指针)[^2]。 - `info locals`:显示当前函数所有局部变量。 --- #### **4. 常见问题场景** - **空指针解引用** 若`bt`显示类似`*d = 5`的代码(如引用2中的示例),用`x <地址>`命令检查指针是否为`0x0`。 - **内存越界** 结合`valgrind`工具辅助分析堆内存问题。 --- #### **5. 调试示例** 以引用2的代码为例: ```cpp // main.cpp中调用 create_core(0) 传递空指针 int d = create_core(0); // 导致解引用空指针 ``` 调试时通过`bt`定位到`create_core`函数,用`p d`会发现指针值为`0x0`,从而确认崩溃原因。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值