如何追踪“tcmalloc:large alloc ....”

时间:2012-01-31 09:54:16

标签: c++ memory-management tcmalloc

我的应用打印了几行,如:

tcmalloc: large alloc 4294488064 bytes == 0x2b968d8000 @  0x727432 0x727302 0x727a58    0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a
tcmalloc: large alloc 4294488064 bytes == 0x2c97063000 @  0x727432 0x727302 0x727a58   0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a
tcmalloc: large alloc 4294488064 bytes == 0x2b968d8000 @  0x727432 0x727302 0x727a58 0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a

此消息来自哪里?这是否意味着我的应用程序有一些错误或内存泄漏?我该如何追查根本原因?

2 个答案:

答案 0 :(得分:7)

请参阅http://code.google.com/p/gperftools/source/browse/trunk/src/tcmalloc.cc?r=80&redir=1第843行

根据您的应用程序 - 大量分配可能是也可能不是错误。

在任何情况下 - @标记之后的部分是堆栈跟踪,可用于定位消息的来源

重复数字(4294488064,似乎等于4G-479232或0x100000000-0x75000)让我怀疑原始分配调用是否为带负值,并将其用作无符号值。

答案 1 :(得分:1)

如果您仍然正在运行该进程或者能够对其进行核心转储(kill -ABRT),那么您应该能够附加gdb并运行info symbol <address>命令({{1} }是错误消息中<address>之后的十六进制数之一:@)。

就我而言,这是一个真实的错误。