【问题标题】:How to trace "tcmalloc : large alloc .... "如何追踪“tcmalloc : large alloc ....”
【发布时间】:2012-02-23 01:10:39
【问题描述】:

我的应用程序打印几行,例如:

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

这条消息是从哪里来的?这是否意味着我的应用程序有一些错误或内存泄漏?如何追根溯源?

【问题讨论】:

  • 要将内存地址跟踪到代码中的一行,请使用 addr2line 命令行工具.. 将其用作 addr2line -e 然后按回车键,然后粘贴地址并按回车键。跨度>
  • 谢谢。在这种情况下,我将地址粘贴到行尾,但得到一个“??:0”
  • 你必须使用 -g 选项编译它。

标签: c++ memory-management tcmalloc


【解决方案1】:

如果您的进程仍在运行或能够核心转储它(kill -ABRT),那么您应该能够附加gdb 并运行info symbol <address> 命令(<address> 是后面的那些十六进制数字之一错误消息中的@0x727432 ...)。

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

【讨论】:

    【解决方案2】:

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

    取决于您的应用程序 - 大分配可能是也可能不是错误。

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

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

    【讨论】:

    • 谢谢,这很有帮助。就像你说的那样,这个错误是由混合使用无符号和有符号值引起的
    猜你喜欢
    • 2019-07-13
    • 2019-02-20
    • 2020-02-05
    • 2023-03-05
    • 1970-01-01
    • 2014-09-15
    • 2010-10-19
    • 2012-06-12
    • 2015-05-26
    相关资源
    最近更新 更多