簡體   English   中英

找不到android NDK堆棧跟蹤

[英]Unable to find android NDK stack-trace

我正在開發使用SIG_SEGV在NDK代碼中崩潰的應用程序。 這會導致該應用程序掛起約15秒鍾,然后Android會提示我強制將其關閉。 這會將java堆棧跟蹤打印到logcat,但是我看不到NDK的任何堆棧跟蹤。 我已使用ADB重定向了stdio,但仍然看不到堆棧跟蹤。 如何將C ++堆棧跟蹤信息打印到logcat或在哪里打印?
使用Android 2.3.4
NDK r8b

崩潰的應用程序將發布“強制關閉”對話框。 這聽起來像是Dalvik崩潰,而不是本機崩潰。 如果該進程正在接收SIGSEGV,則應通知調試器並退出,並在日志中保留跟蹤。 將崩潰中的logcat輸出包括在您的問題中可能會有所幫助。

無論如何,當線程在本機代碼中時,最新版本的Android都將本機跟蹤與Dalvik堆棧轉儲混合在一起。 如果您的設備運行的是最新版本的Android,則可以要求debuggerd使用adb shell debuggerd -b <pid>轉儲所有線程的跟蹤。

不過,您使用的是Android 2.3.x,因此這對您沒有幫助。 最好的選擇是向進程發送致命信號,以獲取debuggerd故障轉儲。 信號必須發送兩次,例如:

adb shell kill -6 <pid> ; sleep 1 ; adb shell kill -6 <pid>

這需要有根設備,因為“外殼”用戶無法將信號發送到任意進程。 根據實際發生的情況,您應該可以在“強制關閉”對話框仍在屏幕上的情況下執行此操作...但是,如果線程成功崩潰而又沒有關閉進程,那么可能沒有堆棧可以獲取痕跡。

您可以使用以下代碼獲取日志

 __android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "%s", Str);

並添加以下庫

#include <android/log.h>

有一個名為CheckJNI的工具,並且在那里進行設置的教程。

暫無
暫無

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

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