2013-06-26 44 views
3

我正在使用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 ...的機器人相當於搜索我的代碼,而這是真的,真的,真的很慢...

乾杯

+0

http://stackoverflow.com/questions/2314273/get-function-names-from-call-stack/2480465#2480465 – fadden

回答

1

建設時,用ndk-build NDK_DEBUG=1這可能會給你瞭解更多關於回溯的信息。

如果這並不奇蹟般的幫助,你可以使用addr2line(你仍然需要用符號來構建)。

addr2line <addr> -e <filename> 

在你的情況,你應該讓你像這裏

$addr2line 0x6e64 -e libxxx.so 
XXX.c:406 

一個可能的問題,如果你的libxxx.so不是在0x0映射,那麼所有的地址都被抵消一些其他的基值。然而,你的地址看起來足夠小,所以它可能工作,甚至可能是內核直接打印正確的值(從指針值中減去映射的地址並在日誌中正確打印地址)。