当我的Android应用程序崩溃(或命中断言)时,我从未获得超过四行的回溯。搜索类似的问题,我只发现了一两个提到这一点的地方,并且库存响应是:“确保它是一个调试版本”和“你可能有堆栈损坏”。我看到许多地方发生了很多崩溃,框架看起来很精确,没有腐败的迹象。
以下是在调试版本中断言失败后从“adb logcat”中摘录的典型摘录:
I/DEBUG ( 187): d28 3f824fc6ced25306 d29 3fabdfebb8fe14dc
I/DEBUG ( 187): d30 fff0000000000000 d31 fffffffeffffffd2
I/DEBUG ( 187): scr 88000010
I/DEBUG ( 187):
I/DEBUG ( 187): backtrace:
I/DEBUG ( 187): #00 pc 00018516 /system/lib/libc.so
I/DEBUG ( 187): #01 pc 0000dc44 /system/lib/libc.so (abort+4)
I/DEBUG ( 187): #02 pc 0000168d /system/lib/liblog.so (__android_log_assert+88)
I/DEBUG ( 187): #03 pc 00170bcc /data/data/com.jsam.crag/lib/libmain.so (sim::TouchObserverController::HandleEvent(SDL_Event const&)+340)
I/DEBUG ( 187):
I/DEBUG ( 187): stack:
I/DEBUG ( 187): 6f4be770 6f4be76c [stack:17025]
I/DEBUG ( 187): 6f4be774 00000000
I/DEBUG ( 187): 6f4be778 00000000
正如您所看到的,大多数可用的回溯甚至不在我自己的代码中。我正在使用开箱版操作系统HTC One进行开发,使用NDK版本8e并针对android-10构建,尽管android-15没有什么不同。我正在使用toolchain v4.7,gnustl_static STL和我的C ++标志是:
-std=c++11 -g -pthread -DPROFILE -D__STRICT_ANSI__ -DdSINGLE -Wall -Wextra -Wfatal-errors -fno-rtti -fno-exceptions
我如何进行更长时间(最好是完整的)回溯?
答案 0 :(得分:1)
您可以在android上使用gdb进行本机应用程序调试,请参阅 Generate core dump in android
这可以为您提供更多的堆栈跟踪。
答案 1 :(得分:1)
调试器堆栈跟踪机制使用异常展开机制来向上走树。这是通过gcc -funwind-tables
参数启用的。
gdb忽略那些并使用它自己的机制,它依赖于反汇编代码来确定返回值在堆栈上的位置。这通常适用于gcc生成的代码,但可能会混淆。有时gdb或debuggerd将能够解码另一个不能的堆栈跟踪。
(编辑:更多备注)
基本问题是编译器配置为生成不使用帧指针的代码。调用者将返回地址放在LR寄存器中,被调用的函数在完成后分支到它。 LR是一个通用寄存器,所以通常将它溢出到堆栈并在返回之前恢复它。遍历堆栈的代码需要确定它是否已溢出,如果是,则可以在堆栈中找到它。
由于某种原因,debuggerd似乎认为它不能越过堆栈。一个原因是没有展开信息。
答案 2 :(得分:0)
答案似乎是升级到Android 4.3。我的手机今天收到了更新(自定义HTC版本推出到开发人员版设备),并且转储到系统日志的回溯现在显示完整的堆栈。但是,正如@ user1034749建议的那样,掌握GDB是一个很好的选择,还有许多额外的好处。