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

12

我的应用程序打印出了几行,如下所示:

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

这个消息是从哪里来的?这是不是意味着我的应用程序有一些错误或者内存泄漏?我该如何追踪根本原因?


3
要追踪内存地址到你代码中的某一行,使用addr2line命令行工具。使用方式为addr2line -e <可执行文件名>,然后按回车键,再粘贴一个地址并按回车键。 - Prasanth Madhavan
1
谢谢。在这种情况下,我将地址粘贴到行末,但是得到了“??:0”。 - Shawn
1
你必须使用-g选项进行编译。 - Prasanth Madhavan
2个回答

11

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

根据您的应用程序,大内存分配可能是一个错误。

无论如何 - @标记后面的部分是堆栈跟踪,可以用来定位消息来源。

重复的数字(4294488064似乎等于4G-479232,或者0x100000000-0x75000)使我怀疑原始分配调用得到了负的有符号值,并将其用作无符号值。


2
谢谢,这非常有帮助。这个 bug 就像你说的那样,是由于混合使用无符号和有符号值引起的。 - Shawn

1
如果您仍在运行该进程或能够进行核心转储(kill -ABRT),那么您应该能够附加gdb并运行info symbol
命令(
是错误消息中@后面的十六进制数字之一:0x727432...)。在我的情况下,这是一个真正的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接