Как отследить "tcmalloc: large alloc ...." - PullRequest
7 голосов
/ 31 января 2012

мое приложение печатает несколько строк, например:

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 ]

7 голосов
/ 31 января 2012

См. http://code.google.com/p/gperftools/source/browse/trunk/src/tcmalloc.cc?r=80&redir=1 строка 843

В зависимости от вашего приложения - большое выделение может быть или не быть ошибкой.

В любом случае - часть после знака @ является трассировкой стека и может использоваться для определения местоположения источника сообщения

Повторяющийся номер (4294488064, который, по-видимому, равен 4G-479232 или 0x100000000-0x75000) заставляет меня подозревать, что исходный вызов выделения получил отрицательное значение со знаком и использовал его в качестве значения без знака.

1 голос
/ 18 марта 2014

Если у вас все еще запущен процесс или вы смогли выполнить дамп ядра (kill -ABRT), тогда вы сможете присоединить gdb и выполнить команду info symbol <address> (<address> - одно из тех шестнадцатеричных чисел после@ в сообщении об ошибке: 0x727432 ...).

В моем случае это была подлинная ошибка.

...