gpt4 book ai didi

android - C++ 段错误输出

转载 作者:太空狗 更新时间:2023-10-29 14:20:38 25 4
gpt4 key购买 nike

我正在使用 NDK 开发 Android 应用程序。不幸的是,我最近写的一些代码出现了段错误。我已经尝试让 ndk-gdb 工作很长时间了,但它根本不起作用(我遇到了一个段错误,它在程序的一个完全不相关的部分中断了。堆栈也完全损坏了。它也不会中断在我设置的任何断点上......)。所以我决定看看程序出现段错误时得到的奇怪输出。

我在Linux上写通用C++程序的时候见过它,但不知道它叫什么,也不知道如何建设性地使用它:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/nakasi/grouper:4.2.2/JDQ39/573038:user/release-keys'
Revision: '0'
pid: 23369, tid: 23369, name: xxx.xxx >>> com.xxx.xxx <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 22e1ee54
r0 beddee50 r1 00003e99 r2 00003e99 r3 22e1ee54
r4 620b1e78 r5 4007e010 r6 00000004 r7 40099de4
r8 beddf658 r9 40099ddc sl 4007e020 fp beddeda4
ip beddee50 sp bedded88 lr 653c7c64 pc 653c8e64 cpsr 80000010

...

backtrace:
#00 pc 00006e64 /data/app-lib/com.xxx.xxx-1/libxxx.so (void anotherFunction<int>(int*, int, int, int&, int)+196)
#01 pc 00005c60 /data/app-lib/com.xxx.xxx-1/libxxx.so (aFunction(AStruct*, int&, int*, int&, unsigned short const*, int)+856)
#02 pc 000060c4 /data/app-lib/com.xxx.xxx-1/libxxx.so (Java_com_xxx_xxx_ClassName_f66+1072)
#03 pc 0001e290 /system/lib/libdvm.so (dvmPlatformInvoke+112)
#04 pc 0004d411 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+396)
#05 pc 0004f56f /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+174)
#06 pc 000276a0 /system/lib/libdvm.so
#07 pc 0002b57c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#08 pc 0005ff07 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+374)
#09 pc 000677e1 /system/lib/libdvm.so

...

stack:
bedded48 c0000000
bedded4c beddf508 [stack]
bedded50 00000003
bedded54 00000100

...紧随其后的是各种寄存器附近的内存

这叫做核心转储吗?

我对程序崩溃的情况并不特别感兴趣,只是对崩溃的地方感兴趣。如何将回溯中的函数名称和指令偏移量转换为我可以使用的行号?从那里我可以打印调试。到目前为止,我基本上一直在使用 printf 的 android 等价物对我的代码进行二进制搜索……这真的非常非常慢……

干杯

最佳答案

构建时,使用 ndk-build NDK_DEBUG=1 可能会为您提供有关回溯的更多信息。

如果这没有神奇的帮助,您可以使用 addr2line(您仍然需要使用符号构建它)。

addr2line <addr> -e <filename>

在你的情况下,你应该得到类似的东西

$addr2line 0x6e64 -e libxxx.so
XXX.c:406

如果您的 libxxx.so 未映射到 0x0,则这里可能存在一个问题,那么所有地址都将偏移到其他一些基值。但是,您的地址看起来足够小,因此它可能会工作,甚至可能是内核直接打印正确的值(从指针值中减去映射地址并在日志中正确打印地址)。

关于android - C++ 段错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17311239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com