Debugging segmentation fault
2016-08-22 14:25
357 查看
Debugging segmentation fault
Type 1 Seg Fault has backtrace of shared objects (most of the times we face this)The PC holds the offset and it has to be traced in the top most 'so' file present in back trace. This can be done by using addr2line or objdump tool
a. Using addr2line:
Syntax: <path to arm-eabi-addr2line> -f -e <path to so file> <offset which is the PC value>
Example: #00 pc 0000e234 /system/lib/libc.so ./prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/arm-eabi-addr2line -f -e ./out/target/product/generic/symbols/system/lib/libc.so 0x0000e234
Returns strlen bionic/libc/arch-arm/bionic/strlen.c:62
b. Using objdump:
Syntax: <path to arm-eabi-objdump> -S <path to so file>
Example: prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/arm-eabi-objdump -S out/target/product/zoom2/symbols/system/lib/libOMX.TI.Video.encoder.so > ObjDumpFile.txt Output is redirected to ObjDumpFile file
Now the ObjDumpFile has the Intermix of source code with disassembly. We can search using the PC offset in it to see the exact line number
Tip: Make sure to use the debug version of 'so' files which are within the symbols dir in out folder otherwise we would not get the source code symbols in obj dump
Type 2 Seg fault print has the thread name along with register values. The backtrace of shared objects is not present
1. The PC holds a virtual address
2. The first '3' digits of PC provide info on the virtual memory mapping where the shared object('so') is loaded and remaining digits provide the offset within the 'so'
3. Use the 'ps' call to get the Process ID of the thread where it fails.
4. Get the memory map of the process using the following:
In device console/adb shell, print values of 'maps' file within the process id <pid>. Syntax: cat proc/<pid>/maps It is recommended that we get the memory map during the normal execution before the failure itself otherwise it is possible for process to be killed and might lead to mismatch.
5. Use the first '3' digits of PC value to identify the shared object which has caused the failure(using memory map)
6. Get the obj dump of the 'so' and search with the offset to get the exact line of failure. (this can be done in the similar way as in Type 1 seg fault debugging mentioned above)
Example:
Seg Fault Message: PV author: unhandled page fault (11) at 0x00000004, code 0x017 pgd = ccfc8000 [00000004] *pgd=8cbe1031, *pte=00000000, *ppte=00000000 Pid: 9691, comm: PV author CPU: 0 Not tainted (2.6.29-omap1 #20) PC is at 0x81b23140 LR is at 0x81b23049 ...
Based on PC, the shared object is in range of 0x81bxxxxx and offset within that is 0x23140
PV author runs in context of Media server process (PID: 944) Using cat /proc/944/maps we can identify the ‘so’ loaded in this region 81b00000-81b2a000 r-xp 00000000 b3:02 34574 /system/lib/libOMX.TI.Video.encoder.so So appears to be in OMX TI Video encoder
Now with the offset we can use the addr2line or objdump to get the line causing this issue
http://omappedia.org/wiki/Android_Debugging
相关文章推荐
- gdb教程:7.2 Example Debugging Session: Segmentation Fault Example
- Example Debugging Session: Segmentation Fault Example
- 段错误(segmentation fault)总结及调试
- pthread_kill Segmentation fault
- Segmentation fault (core dumped)
- child pid xxx exit signal Segmentation fault (11)
- Segmentation fault(core dumped) 调试
- Linux Segmentation Fault 段错误 产生原因调试方法
- linux段错误(Segmentation fault)调试方式
- Segmentation fault in Linux(一)
- Mac segmentation fault :11
- Bus error vs Segmentation fault
- Segmentation Fault
- debug information: Program received signal SIGSEGV,segmentation fault.
- apt-get "Segmentation faultsts ... x%":升级Ubuntu9.04到10.04中的错误
- 总结段错误(Segmentation fault)
- ./common/ptypes2tcl > gen/ptypes.cc Segmentation fault
- Segmentation Fault in Linux (2.指针越界和SIGSEGV)
- About Segmentation Fault in Linux ( SIGSEGV )
- gcc 编译的segmentation fault诡异问题