2012-01-31 12 views
6

我的應用程序打印幾行,如:如何追查「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 

哪裏這個消息從何而來?這是否意味着我的應用程序有一些錯誤或內存泄漏?我如何追查根本原因?

+3

跟蹤mem地址到你的代碼中的一行,使用addr2line命令行工具..用它作爲addr2line -e <可執行文件名稱>然後按回車然後粘貼一個地址並按回車。 – 2012-01-31 10:02:01

+1

謝謝。在這種情況下,我在行尾粘貼地址,但得到一個「??:0」 – Shawn 2012-02-02 03:33:33

+1

,你必須使用-g選項編譯它。 – 2012-02-02 06:38:58

回答

7

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

根據您的應用 - 大分配可能會或可能不會是一個錯誤。

在任何情況下 - 在@標記後的部分是一個堆棧跟蹤,並且可以被用於定位的消息

的源的重複數(4294488064這似乎是等於4G-479232或0x100000000- 0x75000)讓我懷疑原來的分配調用有一個負的有符號值,並將其用作無符號值。

+2

謝謝,這是非常有幫助的。這個錯誤就像你說的,由混合使用無符號和有符號值引起的 – Shawn 2012-02-02 03:35:57

1

如果您仍然有進程在運行或能夠對核心轉儲(kill -ABRT),那麼你應該能夠連接gdb和運行info symbol <address>命令(<address>是錯誤消息@後的十六進制數的一個:0x727432 ... )。

在我的情況下,這是一個真實的錯誤。