В GDB, как узнать, кто malloc'ed адрес в куче? - PullRequest
7 голосов
/ 26 июля 2010

У меня есть указатель в GDB, как я могу узнать, где он был впервые выделен в куче?

В WinDBG это можно сделать с помощью !heap -p -a <0x12345678> после включения gflags /i <*exe> +ust

Так как Valgrind может сказать мне, где выделена память (когда он обнаруживает некоторые утечки), я думаю, это также возможно?

(Это НЕ касается точки наблюдения. Это происходит в ситуации, когда я случайно разбиваюв приложение In GDB, посмотрите на указатель и хотите узнать, «кто создал этот фрагмент памяти»?)


Использование обратной отладки в GDB - очень новый способ и, вероятно, правильный способ решения этой проблемы.Я столкнулся с некоторой проблемой при таком подходе с GDB 7.1 - последней стабильной версией.Обратная отладка - довольно новая функция в GDB, поэтому мне нужно было проверить HEAD (7.2), чтобы исправить это.

Вероятно, это говорит о зрелости подхода GDB, но я думаю, что его обязательно следует использовать, когда онболее зрелым.(Потрясающая особенность!)

Ответы [ 3 ]

7 голосов
/ 26 июля 2010

Может быть обратная отладка поможет здесь. Попробуйте установить точку наблюдения на адрес памяти и обратное продолжение , пока память не будет записана.

(gdb) watch *0x12345678
(gdb) reverse-continue
3 голосов
/ 26 июля 2010

Valgrind перехватывает вызовы управления памятью, вот как работают средства проверки кучи.В самом GDB нет возможности сообщить вам, где данный адрес был возвращен malloc(3).Я предлагаю изучить mtrace и отладку выделения glibc .

2 голосов
/ 28 июля 2010

запись запускается в программе Hello World. Черт возьми, я использую запись для отладки самого GDB!

...