logcat中的回溯不完整
incomplete backtrace in logcat
当我的Android应用程序崩溃(或命中断言)时,我永远不会得到超过四行的回溯。在搜索类似的问题时,我只找到了一两个提到这一点的地方,通常的回答是:"确保这是一个调试构建"answers"你可能有堆栈损坏"。我见过许多地方发生车祸,画面准确,没有腐败的证据。
以下是调试构建中断言失败后从"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也没什么不同。我使用的是工具链v4.7,gnustl_static STL和我的C++标志是:
-std=c++11 -g -pthread -DPROFILE -D__STRICT_ANSI__ -DdSINGLE -Wall -Wextra -Wfatal-errors -fno-rtti -fno-exceptions
我该如何获得更长的(最好是完整的)回溯?
您可以在android上使用gdb进行本机应用程序调试,请参阅在android 中生成核心转储
这可以提供比堆栈跟踪更多的信息。
debuggerd堆栈跟踪机制使用异常展开机制来遍历树。这是通过gcc -funwind-tables
参数启用的。
gdb忽略这些,并使用自己的机制,该机制依赖于对代码进行反汇编来确定返回值在堆栈中的位置。这通常适用于gcc生成的代码,但可能会混淆。有时gdb或debuggerd能够解码另一方无法解码的堆栈跟踪。
(编辑:更多注释)
基本问题是编译器被配置为生成不使用帧指针的代码。调用者将返回地址放在LR寄存器中,完成后被调用的函数分支到它。LR是一个通用寄存器,因此通常将其溢出到堆栈并在返回之前立即恢复。遍历堆栈的代码需要弄清楚它是否被溢出,如果是,在堆栈上的哪里可以找到它。
出于某种原因,debuggerd似乎不认为它可以在堆栈中向上遍历。其中一个原因是缺少展开信息。
答案似乎是升级到Android 4.3。我的手机今天收到了更新(HTC的自定义版本已推出到开发者版设备),转储到系统日志的回溯现在显示了完整的堆栈。然而,正如@user1034749所建议的那样,掌握GDB是一个很好的选择,还有很多额外的好处。
- 当回溯以零开始时,如何调试崩溃
- 回溯C++不打印函数,因此文件
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 如何解释GDB中回溯的模板函数签名?
- 重新引发异常保留回溯
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 这种针对 N Queen 问题的回溯方法不正确吗?
- 我们能否使 GDB 在回溯中显示非平凡的参数
- 回溯 N 女王算法
- C++ 使用递归回溯的数独求解器不起作用
- 国际象棋骑士巡回赛使用递归回溯
- 递归回溯打印长度为N的二进制数的所有组合,而不使用循环
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 这不应该使用回溯算法吗?
- iOS 13 崩溃 - 回溯不可用
- 如何在 CentOS 7 中为应用程序生成具有完整回溯C++的核心转储文件
- 如何在C++中通过回溯获得正确的代码行?
- logcat中的回溯不完整