2013-02-28 5 views
3

После долгого отладки я узнал, что мое приложение, вероятно, пишет неправильное значение для адреса 0x5b81730. Я хотел бы узнать, какая часть моего кода делает это.Как заставить ОС (Windows) выделять одни и те же адреса для моей программы для каждого сеанса отладки?

Некоторое время назад, когда я использовал Windows XP, это было бы очень просто. Я перезапустил приложение в отладчике (MS Visual Studio 2005), установил точку останова данных по этому адресу, и отладчик укажет мой код нарушения.

Теперь, после перехода на Windows 7, это кажется невозможным (или, по крайней мере, очень тяжелым). Когда я запускаю свое приложение, я вижу, что каждый раз адреса одного и того же объекта в куче немного отличаются (например, 0x53b71b4 за один проход, но 0x55471b4 в другом).

Я слышал, что Windows 7 имеет ASLR, что может быть причиной того, что я вижу эти изменения в адресах.

Итак, что можно сделать, чтобы продолжить использование моей техники отладки?

Должен ли я отключить ASLR? (Я считаю, что это возможно, но не удалось выяснить, как это сделать)

Или моя проблема вызвана чем-то другим, а не ASLR?

Или я должен забыть о удобстве использования контрольных точек данных и использовать некоторые другие методы?

+0

Вы попробовали это http://msdn.microsoft.com/en-us/library/f7f5138s(v=vs.80).aspx? – 2013-02-28 14:02:35

+0

Это похоже на ASLR (это правильная аббревиатура?). И вы не должны его превращать, чем жить с ним. В конце концов, это может подскочить, если вы не используете его. –

+0

@ bash.d [править]! Можете ли вы доказать, что отключение ASLR может вызвать проблемы (или «скремблировать вещи»)? Я очень уверен, что это невозможно, и что это хорошая идея, чтобы отключить его при отладке изолированной проблемы. (Разумеется, может быть хорошей идеей по соображениям безопасности, чтобы включить ее для релизов). – us2012

ответ

3

Если вы используете что-то вроде UB, нет абсолютно никакой гарантии, какой адрес будет. Вы не можете зависеть от того, что это одно и то же каждый раз.

Однако вы можете попробовать отключить ASLR в настройках компоновщика - одним из атрибутов является «Рандомизированный базовый адрес».

0

Я бы попытался использовать Application Verifier. Это отличный способ отладить проблемы с утечкой памяти. Это нарушит выполнение вашего кода при возникновении проблемы с повреждением памяти.