我正在开发一款安卓应用,但在本地代码部分出现了段错误。具体来说,在一个无返回值函数返回给它的调用者时出现了问题。为了更好地诊断问题,我在被调用函数的结尾处添加了日志输出,并在调用该函数的调用函数中添加了另一个日志输出(抱歉这个词游戏)。在logcat中,第一个日志消息被打印,而第二个则没有(应用程序崩溃)。
考虑到可能存在内存损坏的情况,我决定激活malloc debug(在adb shell中输入“setprop libc.debug.malloc 10”)。然后,在被调用函数结尾的日志消息后,我在logcat中获得了以下信息:
我找不到任何有关如何解密此输出的信息。每行显示的数字在每次应用程序启动时都会更改。我希望能够利用这些信息作为故障发生位置的线索,因为我无法从代码中找到它。我还尝试使用“-fstack-check”标志构建本机库,但我无法确定日志中是否有更多信息(似乎没有,但我可能错过了),或者是否需要执行其他操作才能获得更多信息。
考虑到可能存在内存损坏的情况,我决定激活malloc debug(在adb shell中输入“setprop libc.debug.malloc 10”)。然后,在被调用函数结尾的日志消息后,我在logcat中获得了以下信息:
D/MyApp - NativeSide(12778): I am the callee function and I am about to return!
E/libc (12778): *** FREE CHECK: buffer 0x82869900 corrupted 16 bytes before allocation
E/libc (12778): call stack:
E/libc (12778): 0: 8000e3ea
E/libc (12778): 1: 8000e49c
E/libc (12778): 2: 8000e4e2
E/libc (12778): 3: 8000e540
E/libc (12778): 4: afd14ccc
E/libc (12778): 5: 81258188
E/libc (12778): 6: 81258188
E/libc (12778): 7: 81258188
E/libc (12778): 8: 81258188
E/libc (12778): 9: 81258188
E/libc (12778): 10: 81258188
E/libc (12778): 11: 81258188
E/libc (12778): 12: 81258188
E/libc (12778): 13: 81258188
E/libc (12778): 14: 81258188
E/libc (12778): 15: 81258188
E/libc (12778): 16: 81258188
E/libc (12778): 17: 81258188
E/libc (12778): 18: 81258188
E/libc (12778): 19: 81258188
我找不到任何有关如何解密此输出的信息。每行显示的数字在每次应用程序启动时都会更改。我希望能够利用这些信息作为故障发生位置的线索,因为我无法从代码中找到它。我还尝试使用“-fstack-check”标志构建本机库,但我无法确定日志中是否有更多信息(似乎没有,但我可能错过了),或者是否需要执行其他操作才能获得更多信息。
此外,在“FREE CHECK:”消息之后,以下是堆栈转储。
I/DEBUG (12311): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG (12311): Build fingerprint: 'google/soju/crespo:2.3/GRH55/79397:user/release-keys'
I/DEBUG (12311): pid: 12778, tid: 12907 >>> com.ntrack.tuner <<<
I/DEBUG (12311): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
I/DEBUG (12311): r0 deadbaad r1 45ea374c r2 00000027 r3 00000000
I/DEBUG (12311): r4 00000080 r5 45ea374c r6 8003422e r7 45ea37b4
I/DEBUG (12311): r8 45da4000 r9 a811eca5 10 00100000 fp 00000001
I/DEBUG (12311): ip ffffffff sp 45ea3738 lr 8000f623 pc 8000f650 cpsr 20000030
I/DEBUG (12311): d0 3f9664f48406d639 d1 3f8226e3e96e8495
I/DEBUG (12311): d2 3faba1ba1bb34201 d3 0000000000000000
I/DEBUG (12311): d4 3d7943379e56fd24 d5 3d8f940585cd5f95
I/DEBUG (12311): d6 3f2cf2145b888497 d7 3f2cf214636d85f8
I/DEBUG (12311): d8 0000000000000000 d9 0000000000000000
I/DEBUG (12311): d10 0000000000000000 d11 0000000000000000
I/DEBUG (12311): d12 0000000000000000 d13 0000000000000000
I/DEBUG (12311): d14 0000000000000000 d15 0000000000000000
I/DEBUG (12311): scr 20000010
I/DEBUG (12311):
无论是对典型问题的建议,还是如何使用malloc调试信息,都会非常有帮助,谢谢!