【问题标题】:Insight into NDK-STACK output (Android)深入了解 NDK-STACK 输出 (Android)
【发布时间】:2014-03-03 18:44:42
【问题描述】:

我一直在努力解决我的应用程序几乎随机崩溃的声明(“损坏的内存堆信号 6”)。我在 logcat 崩溃时拿走了它并在其上运行了 ndk-stack,并得到了以下结果。郁闷的是没有故障地址,列出的库都是系统库。

对如何推进这一点有任何见解吗?如果有帮助,我的 Android 应用程序只需使用 Intent 来启动 Camera Capture 活动。 Capture 完成后,它会调用 finish() 并返回。

谢谢!

pid: 31136, tid: 31136, name: .testquickstart  >>> com.example.testquickstart <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Stack frame #00  pc 00021f90  /system/lib/libc.so (tgkill+12)
Stack frame #01  pc 00012fe1  /system/lib/libc.so (pthread_kill+48)
Stack frame #02  pc 000131f5  /system/lib/libc.so (raise+10)
Stack frame #03  pc 00011f2b  /system/lib/libc.so
Stack frame #04  pc 00021844  /system/lib/libc.so (abort+4)
Stack frame #05  pc 00012a11  /system/lib/libc.so
Stack frame #06  pc 0000f11d  /system/lib/libc.so
Stack frame #07  pc 000116eb  /system/lib/libc.so (dlfree+1222)
Stack frame #08  pc 0000dc0b  /system/lib/libc.so (free+10)
Stack frame #09  pc 0000d2dd  /system/lib/libutils.so (android::SharedBuffer::dealloc(android::SharedBuffer const*)+6)
Stack frame #10  pc 0000f9ef  /system/lib/libutils.so (android::VectorImpl::_shrink(unsigned int, unsigned int)+134)
Stack frame #11  pc 0000ae25  /system/lib/libinput.so (android::MotionEvent::initialize(int, int, int, int, int, int, int, float, float, float, float, long long, long long, unsigned int, an
droid::PointerProperties const*, android::PointerCoords const*)+116)
Stack frame #12  pc 0000f635  /system/lib/libinput.so (android::InputConsumer::initializeMotionEvent(android::MotionEvent*, android::InputMessage const*)+174)
Stack frame #13  pc 0000faeb  /system/lib/libinput.so (android::InputConsumer::consume(android::InputEventFactoryInterface*, bool, long long, unsigned int*, android::InputEvent**)+282)
Stack frame #14  pc 00062ef5  /system/lib/libandroid_runtime.so (android::NativeInputEventReceiver::consumeEvents(_JNIEnv*, bool, long long, bool*)+80)
Stack frame #15  pc 000630f9  /system/lib/libandroid_runtime.so (android::NativeInputEventReceiver::handleEvent(int, int, void*)+52)
Stack frame #16  pc 000107bb  /system/lib/libutils.so (android::Looper::pollInner(int)+478)
Stack frame #17  pc 00010869  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+92)
Stack frame #18  pc 0006a121  /system/lib/libandroid_runtime.so (android::NativeMessageQueue::pollOnce(_JNIEnv*, int)+22)
Stack frame #19  pc 0001dbcc  /system/lib/libdvm.so (dvmPlatformInvoke+112)
Stack frame #20  pc 0004e123  /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
Stack frame #21  pc 00026fe0  /system/lib/libdvm.so
Stack frame #22  pc 0002dfa0  /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
Stack frame #23  pc 0002b638  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
Stack frame #24  pc 00060865  /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+392)
Stack frame #25  pc 000687c7  /system/lib/libdvm.so
Stack frame #26  pc 00026fe0  /system/lib/libdvm.so
Stack frame #27  pc 0002dfa0  /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
Stack frame #28  pc 0002b638  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
Stack frame #29  pc 00060581  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+336)
Stack frame #30  pc 00049d0b  /system/lib/libdvm.so
Stack frame #31  pc 0004cde7  /system/lib/libandroid_runtime.so

【问题讨论】:

  • 一个叫做free()的东西,malloc实现发现堆被破坏了。拥有堆栈跟踪并不是那么有用,因为它只告诉您当问题找到时正在执行什么,而不是当问题引起时。有各种工具,例如 valgrind,可以在这里提供帮助,尽管让它们在 Android 上工作可能是一种体验。最容易使用的是内置的 malloc 调试工具;见stackoverflow.com/questions/21028422/…
  • 现在试试,谢谢fadden!如果可行,我一定会回复并要求您创建相同的帖子作为答案,以便我向您推荐。
  • 其实我不能用这个方法。我确实使用 DDMS 启用了本机堆,但没有显示任何内容。查看旧文章,我意识到我需要 libcdebug.so 并且需要安装类似 Cyanogenmod 的东西。这是一部公司电话,所以我无法使用它修改任何内容
  • 您在崩溃前收到 ANR 吗?
  • 崩溃前没有 ANR,但感谢您回复 JonnyBoy。该解决方案实际上与 libc.so 有关,特别是我在 Android NDK 链接中使用的标准模板库。在我的 Android.MK 文件中,我使用 stlport_shared 与本机 opencv 库链接。 Opencv实际上不支持stlport_shared库,而是gnu_stl_shared。进行更改后,没有此类问题:)

标签: android unix android-ndk


【解决方案1】:

该解决方案实际上与 libc.so 有关,特别是我在 Android NDK 链接中使用的标准模板库。在我的 Android.MK 文件中,我使用 stlport_shared 与本机 opencv 库链接。 Opencv实际上不支持stlport_shared库,而是gnu_stl_shared。进行更改后,没有此类问题:)

希望这对可能在与其他库链接时遇到相同问题的其他人有所帮助。始终确保它们兼容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多