我有一个与 SIGSEGV 崩溃的应用程序。
--20183-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--20183-- si_code=80; Faulting address: 0x0; sp: 0x409a8de60
valgrind: the 'impossible' happened:
Killed by fatal signal
==20183== at 0x38039981: vgPlain_arena_free (m_mallocfree.c:245)
==20183== by 0x38001E84: die_and_free_mem (mc_malloc_wrappers.c:124)
==20183== by 0x380688C3: vgPlain_scheduler (scheduler.c:1402)
==20183== by 0x380913F4: run_a_thread_NORETURN (syswrap-linux.c:95)
它一定是某种内存损坏弄乱了 malloc 链,因为崩溃发生在随机位置 - 但总是在释放时。
通常你会看到这样的消息:
Invalid write of size 8
这表明我破坏了内存的地方,但没有任何消息,只是立即崩溃。AFAIK valgrind 涵盖了大多数系统调用,因此它甚至会报告与这些调用相关的问题,所以......
我的理论(*)问题是:我应该寻找什么样的错误?valgrind 无法检测到什么样的无效写入?
(*):请不要询问实际代码,正如我所说,这是一个理论问题。
附带问题:还有其他工具可以解决问题吗?