我正在使用NDK的Android應用程序。不幸的是,我在最近寫了一些代碼時遇到了段錯誤。我試過讓ndk-gdb工作了很長時間,但它根本不起作用(我得到了段錯誤,並且它在程序中完全不相關的部分中斷了,堆棧也完全損壞了,它也不會中斷在我設置的任何斷點上...)。所以我決定看看程序段錯誤時得到的奇怪輸出。C++ Segfault輸出
在Linux上一般寫C++程序時,我已經看到了,但我不知道其所謂的,或如何建設性地使用它:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/nakasi/grouper:4.2.2/JDQ39/573038:user/release-keys'
Revision: '0'
pid: 23369, tid: 23369, name: xxx.xxx >>> com.xxx.xxx <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 22e1ee54
r0 beddee50 r1 00003e99 r2 00003e99 r3 22e1ee54
r4 620b1e78 r5 4007e010 r6 00000004 r7 40099de4
r8 beddf658 r9 40099ddc sl 4007e020 fp beddeda4
ip beddee50 sp bedded88 lr 653c7c64 pc 653c8e64 cpsr 80000010
...
backtrace:
#00 pc 00006e64 /data/app-lib/com.xxx.xxx-1/libxxx.so (void anotherFunction<int>(int*, int, int, int&, int)+196)
#01 pc 00005c60 /data/app-lib/com.xxx.xxx-1/libxxx.so (aFunction(AStruct*, int&, int*, int&, unsigned short const*, int)+856)
#02 pc 000060c4 /data/app-lib/com.xxx.xxx-1/libxxx.so (Java_com_xxx_xxx_ClassName_f66+1072)
#03 pc 0001e290 /system/lib/libdvm.so (dvmPlatformInvoke+112)
#04 pc 0004d411 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+396)
#05 pc 0004f56f /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+174)
#06 pc 000276a0 /system/lib/libdvm.so
#07 pc 0002b57c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#08 pc 0005ff07 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+374)
#09 pc 000677e1 /system/lib/libdvm.so
...
stack:
bedded48 c0000000
bedded4c beddf508 [stack]
bedded50 00000003
bedded54 00000100
...之後不久各種寄存器
內存這是否被稱爲核心轉儲?
我對程序崩潰的條件特別不感興趣,就在它所在的位置。如何將函數名稱和指令偏移量從回溯轉換爲我可以使用的行號?從那裏我可以打印調試。到現在爲止,我基本已經用二進制的printf ...的機器人相當於搜索我的代碼,而這是真的,真的,真的很慢...
乾杯
http://stackoverflow.com/questions/2314273/get-function-names-from-call-stack/2480465#2480465 – fadden