【问题标题】:ndk-stack can not get full stackndk-stack 无法获取完整堆栈
【发布时间】:2015-03-06 09:44:54
【问题描述】:

我写了一段代码,为了测试ndk-stack 这是代码片段

libtest.so

    std::vector<int> testVec;

    testVec.at(500);

但我得到的是不完整的堆栈

********** Crash dump: **********
Build fingerprint: 'MI/casablanca_icntv/casablanca:4.2.2/CADEV/1253:user/release-keys'
pid: 24989, tid: 24989  >>> com.ktcp.video <<<
signal 11 (SIGSEGV), fault addr deadbaad
Stack frame #00  pc 0001a852  /system/lib/libc.so: Routine ????:0
Stack frame #01  pc 00018190  /system/lib/libc.so (abort): Routine ????:0
Stack frame #00  pc 0001a852  /system/lib/libc.so: Routine ????:0
Stack frame #01  pc 00018190  /system/lib/libc.so (abort): Routine ????:0
Stack frame #00  pc 0001a852  /system/lib/libc.so: Routine ????:0
Stack frame #01  pc 00018190  /system/lib/libc.so (abort): Routine ????:0
Stack frame #00  pc 0001a852  /system/lib/libc.so: Routine ????:0
Stack frame #01  pc 00018190  /system/lib/libc.so (abort): Routine ????:0
^C^C

在堆栈中没有看到我的代码,堆栈不完整

如何解决

【问题讨论】:

  • 使用 ProjectName/obj/local/armeabi/xxx.so

标签: android c++ c android-ndk


【解决方案1】:

0xdeadbaad 被 Bionic libc 用来表示故意中止。您可以在获得的堆栈片段上看到对abort() 的调用。我猜你正在触发一个断言失败(它会出现在 logcat 中)。

在某些 Android 版本上,在某些情况下,您无法从 abort() 获得良好的跟踪信息。部分问题是该函数被标记为 noreturn 属性,因此当您执行以下操作时编译器不会吐出抱怨:

int foo(int x) {
    if (x == 0) {
        return 12345;
    } else {
        abort();
    }
}

如果返回abort(),此方法将返回未定义的值。在 ARM 上,返回地址位于 LR 寄存器中,必要时会保存在堆栈中……但如果函数没有返回,则无需保存返回地址,因此允许编译器抛出它离开。在您想要为堆栈跟踪提供该地址之前,这非常有效。如果 LR 被重用,并且旧值没有溢出到堆栈中,它就消失了。

我认为可能有一个版本修复了编译器问题,但一些汇编器元数据错误,导致类似的问题。

最新版本的 Android 不应出现此行为。最近的版本还用更传统的 SIGABRT 取代了对 0xdeadbaad 的访问,因此您不再看到这个特定的崩溃签名。

(FWIW,您可以看到 noreturn in 4.2.2 (see comments) 的尝试解决方法。它在系统的早期版本中有效。)

【讨论】:

    【解决方案2】:

    上面写着signal 11 (SIGSEGV), fault addr deadbaad,其中0xDeadBaad(已死,坏)很可能是默认存储在未初始化内存中的内容(这是一个古老的双关语)。所以它会尝试读取或执行未初始化的内存。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 2011-03-01
    • 2021-01-24
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2014-08-13
    相关资源
    最近更新 更多