簡體   English   中英

如何在Android中獲取堆棧跟蹤C ++函數名稱

[英]how to get stack trace c++ functions names in android

我正在尋找我的應用程序中的本機崩潰,但是我找不到一個工具可以幫助我將地址轉換為庫中的函數名,我看到了這篇文章: 如何使用addr2line,但似乎只有在有跟蹤時才能工作像這樣 :

I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
I/DEBUG   (   31): pid: 378, tid: 386  >>> com.example.gltest <<<
I/DEBUG   (   31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG   (   31):  r0 001dbdc0  r1 00000001  r2 00000000  r3 00000000
I/DEBUG   (   31):  r4 00000000  r5 40a40000  r6 4051a480  r7 42ddbee8
I/DEBUG   (   31):  r8 43661b24  r9 42ddbed0  10 42ddbebc  fp 41e462d8
I/DEBUG   (   31):  ip 00000001  sp 436619d0  lr 83a12f5d  pc 8383deb4  cpsr 20000010
I/DEBUG   (   31):          #00  pc 0003deb4  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #01  pc 00039b76  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #02  pc 00017d34  /system/lib/libdvm.so

正如您在最后三行中看到的那樣,您的應用程序的庫在那里: ibnativemaprender.so

並且只有當您的媒體庫出現在其中時,addr2line應用程序才能運行

但在我的追蹤中,我有這個:

I/DEBUG   (16251):          #00  pc 000161c0  /system/lib/libc.so 
I/DEBUG   (16251):          #01  lr afd196f1  /system/lib/libc.so

我的圖書館直到那里才顯示:

/DEBUG   (16251): stack: 
I/DEBUG   (16251):     46f0c818  afd426a4     
I/DEBUG   (16251):     46f0c81c  000b7290     
I/DEBUG   (16251):     46f0c820  00000afa    
I/DEBUG   (16251):     46f0c824  afd187b9  /system/lib/libc.so    
I/DEBUG   (16251):     46f0c828  afd42644     
I/DEBUG   (16251):     46f0c82c  afd467c4     
I/DEBUG   (16251):     46f0c830  00000000     
I/DEBUG   (16251):     46f0c834  afd196f1  /system/lib/libc.so   
I/DEBUG   (16251):     46f0c838  00000001     
I/DEBUG   (16251):     46f0c83c  46f0c86c     
I/DEBUG   (16251):     46f0c840  81b6a4a0  /data/data/com.android.ANMP/lib/mylib.so

有沒有可以幫助我的工具? 或使用addr2line的另一種方式?

不,不是。 為此,您需要手動執行搜索。

手動有三個選項:

  • 添加調試打印以找出發生的時間和地點

  • 使用IDA pro(這是非常昂貴的工具),將您的庫加載到其中並查找地址81b6a4a0 ,嘗試找出它的功能。 如果使用調試符號進行編譯,它應該很容易。

  • 找到您的庫的基地址,使用objdump(來自NDK工具鏈)查找地址81b6a4a0 (從基地址中刪除后)。

在后兩種方法中,如果找不到任何有用的方法,請使用adb從設備中拉出libc.solibdvm.so並嘗試查找出現在堆棧跟蹤中的函數,然后檢查在哪里調用這些函數在您的代碼中。

看看這個 我還沒有時間嘗試,所以請告訴是否為您工作

您可以使用GDB獲取堆棧跟蹤。 如果您的手機已扎根或使用仿真器,則可以啟用核心轉儲。 然后,您可以使用GDB檢查核心轉儲。

有關在Eclipse中設置GDB的信息,請參見以下問題:

android如何將ndk gdb與純本地可執行文件一起使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM