[英]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方法:
整體解決方案基於處理信號,然后在信號處理程序中觸發java調用以轉儲堆棧跟蹤等,在我的代碼中我啟動另一個活動來獲取logcat信息並通過電子郵件發送給我。
ACRA可以捕獲應用程序崩潰。 然后,您可以實例化第二個進程,該進程將執行logcat(請參閱此問題 )命令,按應用程序名稱進行篩選,然后讓進程將轉儲的文件發送給您。 這遠非最佳,因為:
但我沒有找到另一種方法來做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.