Как отследить tcmalloc : большой alloc

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

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

откуда это сообщение? означает ли это, что в моем приложении есть ошибки или утечка памяти? как я могу отследить первопричину?


person Shawn    schedule 31.01.2012    source источник
comment
чтобы отследить адрес памяти до строки в вашем коде, используйте инструмент командной строки addr2line.. используйте его как addr2line -e ‹исполняемое имя›, затем нажмите ввод, а затем вставьте адрес и нажмите ввод.   -  person Prasanth Madhavan    schedule 31.01.2012
comment
Спасибо. в этом случае я вставляю адрес в конце строк, но получаю ??:0   -  person Shawn    schedule 02.02.2012
comment
вы должны скомпилировать его, используя опцию -g.   -  person Prasanth Madhavan    schedule 02.02.2012


Ответы (2)


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

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

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

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

person Ofir    schedule 31.01.2012
comment
спасибо, это очень полезно. ошибка точно такая же, как вы сказали, вызванная смешиванием использования беззнакового и подписанного значения - person Shawn; 02.02.2012

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

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

person bobah    schedule 18.03.2014