Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android logcat中的不完全回溯_Android_C++_Android Ndk - Fatal编程技术网

Android logcat中的不完全回溯

Android logcat中的不完全回溯,android,c++,android-ndk,Android,C++,Android Ndk,当我的Android应用程序崩溃(或点击断言)时,我从未得到超过四行的回溯。在搜索类似的问题时,我只发现了一两个地方提到了这一点,而股票的反应是:“确保这是一个调试版本”和“您可能有堆栈损坏”。我在很多地方看到过很多车祸,画面精确,没有腐败迹象 下面是一个典型摘录,摘自调试版本中出现断言失败后的“adb logcat”: I/DEBUG ( 187): d28 3f824fc6ced25306 d29 3fabdfebb8fe14dc I/DEBUG ( 187):

当我的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也不例外。我使用的是工具链V4.7,GnUSTLYSTATE STL和我的C++标志是:

-std=c++11 -g -pthread -DPROFILE -D__STRICT_ANSI__ -DdSINGLE -Wall -Wextra -Wfatal-errors -fno-rtti -fno-exceptions

如何获得更长的(最好是完整的)回溯?

您可以使用gdb在android上调试本机应用程序,请参阅


这可以提供比堆栈跟踪更多的功能。

debuggerd堆栈跟踪机制使用异常展开机制来遍历树。这是通过gcc
-funwind tables
参数启用的

gdb忽略这些,并使用自己的机制,该机制依赖于反汇编代码来确定返回值在堆栈上的位置。这通常适用于gcc生成的代码,但可能会混淆。有时gdb或debuggerd能够解码另一个无法解码的堆栈跟踪

(编辑:更多注释)

基本问题是编译器被配置为生成不使用帧指针的代码。调用者将返回地址放入LR寄存器,被调用的函数在完成后分支到它。LR是一个通用寄存器,因此通常会将其溢出到堆栈中,并在返回之前将其恢复。遍历堆栈的代码需要确定它是否已溢出,如果是,在堆栈上的何处可以找到它


出于某种原因,debuggerd似乎不认为它可以遍历堆栈的更高层。一个原因是缺少展开信息。

答案似乎是升级到Android 4.3。我的手机今天收到了一个更新(定制的HTC版本发布到开发者版设备上),现在转储到系统日志的回溯显示了完整的堆栈。然而,正如@user1034749所建议的,掌握GDB是一个很好的选择,它有许多额外的好处。

谢谢。这在调试应用程序时非常有用,但是如果它在我连接调试器之前崩溃,我假设logcat是我唯一的信息源。(如果Android应用程序转储了一个核心文件,我会非常惊讶。)在另一个主题(现在找不到链接)中,有一个注意事项,在根设备上,如果运行控制台应用程序核心转储工作,如果使用ulimit-c unlimited的模拟。但如果涉及核心转储的java代码不起作用,可能是因为java运行时在某个地方禁用了它。谢谢。虽然我很确定我的两部手机都已解锁,并且只有一部有此限制,但我会查看此信息。谢谢,我会查看此信息,虽然我很确定我的两部手机都已解锁,但是当在其上运行相同的二进制文件时,只有一部手机有此限制。谢谢提供信息。我确实尝试添加了-funwind表,但没有任何明显的区别。debuggerd(或者任何产生logcat信息的东西)似乎对表示栈的前四行绝对没有问题;它始终打印四行准确信息,不再打印。在全世界看来,它就像是在某个地方,故意对信息进行了限制——可能是为了节省记录器的输出。(我在答案中添加了更多的细节。)debuggerd中有一个限制,但它被设置为32帧。尝试删除
-fno异常
,或者确保在
-funwind表
之前指定该异常。我想知道是否没有异常正在禁用表生成。删除
-fno异常
和添加
-funwind表
似乎没有什么不同。我注意到,从
ndk gdb
发出
bt
现在会产生不好的结果,例如
#3 0x400c3690英寸??()
。此外,我在Nexus One(使用CyanogenMod)上创建了相同的崩溃,并获得了一个完整但损坏的堆栈,其函数名为:
\u ZN3sim23TouchObserverController11HandleEventERK9SDL\u Event
。所以我现在想知道是操作系统还是设备出了问题。如果你有
c++filt
工具,你可以将名字粘贴到sim::TouchObserverController::HandleEvent(SDL\u事件常量&)。我认为
addr2line
工具可以帮您解决问题(请参阅)。这些设备是否运行不同版本的Android?debuggerd的实现随着时间的推移发生了变化(例如,
libcorkscrew
libcorkscrew的引入向后转了几次)。是的,4.1.2版上的是debuggerd,2.3.7版上的是Nexus One。如果有机会,我一定会尝试获取更多数据点。升级到4.3似乎对我毫无帮助:/@kotlinski您是否运行相同/不同的设备等。?你也只看到四行吗?