一位同事请求帮助在程序中查找难以重现的 SIGSEGV,因此我通过
valgrind
运行它以查找任何内存问题。
不幸的是,我最终得到了这个:
$ valgrind --track-origins=yes sim-server
==128768==
==128768== More than 10000000 total errors detected. I'm not reporting any more.
==128768== Final error counts will be inaccurate. Go fix your program!
==128768== Rerun with --error-limit=no to disable this cutoff. Note
==128768== that errors may occur in your program without prior warning from
==128768== Valgrind, because errors are no longer being displayed.
==128768==
我能看到的所有内容都来自
libasound.2.0.0
或libportaudio.so.2.0.0
,它们都有相同的警告:
Conditional jump or move depends on uninitialized value(s)
示例:
==130835== Conditional jump or move depends on uninitialised value(s)
==130835== at 0x483865C: malloc (vg_replace_malloc.c:306)
==130835== by 0x483ADE7: realloc (vg_replace_malloc.c:834)
==130835== by 0x48A209A: ??? (in /usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0)
==130835== by 0x48A251F: ??? (in /usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0)
==130835== by 0x48A5944: ??? (in /usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0)
==130835== by 0x4878EA6: start_thread (pthread_create.c:477)
==130835== by 0x4CECA2E: clone (clone.S:95)
==130835== Uninitialised value was created by a stack allocation
==130835== at 0x4E626C0: ??? (in /usr/lib/x86_64-linux-gnu/libasound.so.2.0.0)
我对这些库无能为力,我认为它们工作得很好。其中一些甚至是通过
Pa_Initialize()
实现的,这不是一个需要我提前设置任何内容的函数,因此此警告并不指向我对库的使用。
如何在 Valgrind 中抑制源自
Conditional jump or move...
的 libportaudio.so.2.0.0
警告?
使用这个答案,Valgrind的关于抑制错误的文档和Valgrind的关于编写抑制文件的文档,我想出了这个:
$ cat suppress.val
{
ignore_pa
Memcheck:Cond
obj:/usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0
}
$ valgrind --suppressions=suppress.val --track-origins=yes sim-sound
这解决了很多警告,但上面的
malloc
并没有被抑制。
我也尝试过:
{
ignore_pa_malloc
Memcheck:Param
malloc
fun:*
obj:/usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0
}
但这也没有帮助。不只是malloc,来自
memmove
的vg_replace_strmem.c
也是罪犯。这些源文件不在我的程序中。
==130835== Conditional jump or move depends on uninitialised value(s)
==130835== at 0x483865C: malloc (vg_replace_malloc.c:306)
这几乎肯定意味着
malloc
正在以未初始化的大小调用。在我的书中,这是一个非常严重的错误,可能会导致崩溃。
您有什么方法可以获取 libportaudio 和 libasound 的 debuginfo 包或调试版本吗?