【发布时间】: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