如何在多线程程序中找到Valgrind报告的空闲/删除不匹配?

phi*_*ant 9 c++ multithreading valgrind

以下是Valgring报告:

==14546== Thread 5:
==14546== Invalid free() / delete / delete[]
==14546==    at 0x490555D: free (vg_replace_malloc.c:235)
==14546==    by 0x3BF7EFAA8F: free_mem (in /lib64/tls/libc-2.3.4.so)
==14546==    by 0x3BF7EFA581: __libc_freeres (in /lib64/tls/libc-2.3.4.so)
==14546==    by 0x4802676: _vgw_freeres (vg_preloaded.c:62)
==14546==  Address 0x4DC4EE0 is not stack'd, malloc'd or (recently) free'd
Run Code Online (Sandbox Code Playgroud)

我怎么知道它是哪个线程,因为线程号从一个执行到另一个不同?将名称分配给我的主题会有帮助吗?

编辑:我不认为这将在手册的DRD部分中提到.

我在Red Hat企业Linux AS4上使用valgrind-3.1.1.

Emp*_*ian 6

您可能正在释放一个全局变量(地址:0x4DC4EE0非常接近于在Linux/x86_64上默认情况下全局变量所在的位置).

在GDB下运行程序,然后执行info symbol 0x4DC4EE0,GDB应该告诉您需要知道的所有内容.

更新:
Valgrind 3.6实际上已经报告了全局符号.例如,鉴于这个错误的程序:

#include <stdlib.h>

int x;

int main()
{
  free(&x);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Valgrind 3.6报告:

==18731== Invalid free() / delete / delete[]
==18731==    at 0x4C240E8: free /tmp/vg/coregrind/m_replacemalloc/vg_replace_malloc.c:394
==18731==    by 0x4004AA: main /home/t.c:7
==18731==  Address 0x60089c is 0 bytes inside data symbol "x"
Run Code Online (Sandbox Code Playgroud)


phi*_*ant 2

我终于找到了对此的解释:我的单元测试可执行文件链接到它没有使用的[第三方]库。我在没有该库的情况下重新链接它,问题就消失了。

还在 中检测到错误__libc_freeres(),这是 gnu libc 的一个函数,该函数在执行结束时释放资源。问题可能出在库或 glibc 中。可以使用
以下Valgrind Linux 特定选项--run-libc-freeres=no来避免此错误: 。请注意,这可能会降低泄漏检测的效率。