簡體   English   中英

本機代碼 - 如何以編程方式獲取函數調用堆棧(回溯)

[英]Native code - how to get function call stack (backtrace) programmatically

我在Android上運行C ++代碼庫,並希望用戶發送崩潰報告。

我正在使用ACRA庫 ,它可以很好地用於Java代碼,但是當本機代碼崩潰時,我得不到足夠的信息。 實際上我想收到本機函數調用的堆棧跟蹤。 我知道在我的進程結束后會將崩潰信息打印到logcat中,我可以配置ACRA來讀取/發送logcat。 我已經設置了我的代碼,使用信號處理程序檢測本機崩潰,並回調Java以便ACRA報告。 它也很好用。

然而,這種方法的時機不合適 - ACRA在崩潰進程仍然存活時讀取日志,並且在崩潰進程完全結束后,Android(不確切知道哪個部分)將崩潰報告寫入logcat。 所以我在使用ACRA時沒有收到堆棧跟蹤。

所以我正在尋找一種以編程方式從C ++代碼中讀取當前堆棧跟蹤的方法,並將此信息提供給ACRA(或者其他崩潰報告工具)。

我只需要寫一些寫入logcat的報告:

10-10 08:29:13.868: INFO/DEBUG(1121):          #00  pc 0003fc7c  /data/data/com.ex.lib/libapp.so
10-10 08:29:13.891: INFO/DEBUG(1121):          #04  pc 00016df4  /system/lib/libdvm.so
10-10 08:29:13.891: INFO/DEBUG(1121):          #05  pc 00045284  /system/lib/libdvm.so
10-10 08:29:13.899: INFO/DEBUG(1121):          #15  pc 00047c56  /system/lib/libdvm.so
10-10 08:29:13.922: INFO/DEBUG(1121):          #16  pc 00030e4c  /system/lib/libandroid_runtime.so

有沒有辦法從我的代碼中獲取這個堆棧跟蹤?

我在我的游戲基礎項目中完成了這個 - 您可以在這里看到處理此問題的JNI代碼:

https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/jni/NativeActivityJNI.cpp#cl-40

它調用此處定義的Java方法:

https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/src/com/gmail/whittock/tom/Util/NativeActivity.java#cl-91

整體解決方案基於處理信號,然后在信號處理程序中觸發java調用以轉儲堆棧跟蹤等,在我的代碼中我啟動另一個活動來獲取logcat信息並通過電子郵件發送給我。

ACRA可以捕獲應用程序崩潰。 然后,您可以實例化第二個進程,該進程將執行logcat(請參閱此問題 )命令,按應用程序名稱進行篩選,然后讓進程將轉儲的文件發送給您。 這遠非最佳,因為:

  • 跨越logcat的應用程序必須具有WRITE_EXTERNAL_STORAGE和READ_LOGS權限
  • 可能用戶會因為必須安裝新程序而感到惱火

但我沒有找到另一種方法來做到這一點。

暫無
暫無

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

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