2013-12-03 1 views
2

У меня есть проблема с поиском того, кто распределяет память для переменной в чрезвычайно большой базе кода в визуальной студии. Для примера: У меня есть структураОтслеживание изменения переменной в визуальной студии

struct test 
{ 
    char *point; 
}*obj; 

obj = malloc(sizeof(struct test)); 
obj->point = malloc(100); 

Переменная obj передается по всему коду, и на каком-то месте obj-> точка перераспределены без освобождения старой памяти. Однако это происходит во многих местах, где невозможно отслеживать, какой из них действительно делает. Есть ли в визуальной студии, чтобы сохранить условную точку останова, где я получу уведомление, если прежняя память будет заменена на новую?

+0

Почему у вас должно быть «точка» malloc во многих местах? Почему бы не использовать тот, который вы уже выделили? – Abhineet

+0

AFAIK, в Visual Studio нет ничего подобного. Вы должны пройти через свой код, чтобы найти это. – Abhineet

+0

Это неправильный код, который мне нужно изменить, но проблема в том, что в большинстве мест другая переменная указывает на точку, и это изменяется. Поэтому трудно проверить каждую переменную! – user1692342

ответ

6

Если есть определенный объект, который вы хотите отслеживать, вы можете настроить точку останова данных на &obj->point. Всякий раз, когда этот указатель изменяется, отладчик останавливает приложение.

В Visual Studio поместите обычную точку останова при создании объекта obj. Перейдите в окно точек останова и выберите «New-> New Data Breakpoint». Для адреса введите &obj->point и выберите размер данных (4/8 для 32/64 бит).

+1

Спасибо, сработало! Я не знал, что вы можете использовать имена переменных. Я использовал только адрес! Мой плохой :( – user1692342

+1

@egur Спасибо за ответ. Никогда не об этом! Спасибо за вопрос! – user1019083

0

Вы можете сделать это с помощью функции-обертки для malloc и добавления дополнительных параметров в оболочку который показывает распределение памяти и расположение идентификатора кода/процесса, который его выделил.

В противном случае вы можете рассмотреть возможность использования отладочной версии malloc в visual studio, которая приведена ниже.

Использовать _malloc_dbg, определенный в. Это всего лишь malloc с дополнительными параметрами для имени файла и linenumber для распечатки или отслеживания местоположения. Это поможет вам в отладке.

void *_malloc_dbg 
(
    size_t size, 
    int blockType, 
    const char *filename, 
    int linenumber 
); 

Все эти опции заставляют вас переработать код, где выполняется malloc.

Другой вариант, я думаю, было бы больно ломать malloc каждый раз, когда он вызывается, и видеть, как только адрес доступа к памяти снова открывается. Надеемся, что динамическая смена мест памяти в вашей кодовой базе не происходит, и, возможно, она будет отслеживаться модулем управления памятью, если таковая имеется. Если нет, вы можете снова проверить местоположение адреса, и в этот момент вы можете использовать стек вызовов в visual studio для дальнейшего его отладки.

Одна небольшая идея, которую я имею, заключается в том, чтобы написать небольшой код для сохранения адреса, выделяемого всякий раз, когда вы используете malloc для этой конкретной переменной. Это можно сделать с помощью глобальной переменной, которая устанавливается перед тем, как вы выделите память, для которой вам нужно отслеживать. Если эта переменная установлена, всегда сохраняйте этот адрес памяти и сравнивайте ее с этим адресом всякий раз, когда память снова попадает. Это можно сделать, если вы использовали оболочку памяти в своем коде для управления памятью.

Смежные вопросы