Здравствуйте, Аноним, Вы писали:
А>Доброго времени суток! Вопрос на засыпку — при запуске программы под дебугером MSVC++ нормально работает, при запуске без дебугера вываливается, пишет что память не может быть прочитатна. Программа довольно здоровая, там юзается дин. выделение памяти, работа с COM портами, OpenGL. IDE Visual Studio 7.1.30.88. Может кто знает почему так? Все тонкие места со сбором мусора и выделением памяти прологировал, нормально отрабатывает. Помогите пожалуйста
Предполагая что программа скомпилирована в debug режиме, я обычно делаю следующее:
1. Включаю "just-in-time debugging" где-то в установках Visual Studio.
2. Запускаю программу без отладчика
3. Когда программа упадет и Windows повесит диалог с предложением послать лог на MS, жму кнопку Debug.
4. Когда запускается отладчик, смотрю стек вызовов.
Если программа скомпилирована в release режиме, включаю генерацию отладочной информации — ключ /Zi, перекомпилирую проект и повторяю шаги 1-4.
Вообще говоря, это стандартная проблема. Стоит один раз разобраться как решать такие проблемы.
Александр
Debuger MSVC++
От:
Аноним
Дата:
26.02.06 04:01
Оценка:
Доброго времени суток! Вопрос на засыпку — при запуске программы под дебугером MSVC++ нормально работает, при запуске без дебугера вываливается, пишет что память не может быть прочитатна. Программа довольно здоровая, там юзается дин. выделение памяти, работа с COM портами, OpenGL. IDE Visual Studio 7.1.30.88. Может кто знает почему так? Все тонкие места со сбором мусора и выделением памяти прологировал, нормально отрабатывает. Помогите пожалуйста
> при запуске программы под дебугером MSVC++ нормально работает, при запуске без дебугера вываливается, пишет что память не может быть прочитатна. Программа довольно здоровая, там юзается дин. выделение памяти, работа с COM портами, OpenGL. IDE Visual Studio 7.1.30.88. Может кто знает почему так?
Вполне вероятно, что в программе присутствует ошибка с порчей памяти или чтением неинициализированных переменных, маскирующаяся при запуске под отладчиком, т.к. в последнем случае, например, значения неинициализированных объектов могут быть вполне предсказуемыми, в отличие от "свободного запуска".
Раз используется VC++7.1, для начала можно порекомендовать погонять программу, включив runtimeпроверки. Если не включать /RTCc (smaller type assignment check), то производительность программы не должна сильно измениться.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Debuger MSVC++
От:
Аноним
Дата:
26.02.06 07:42
Оценка:
Попробовал под OllyDebugger посмотреть, опять-таки все прекрасно работает. Чего эти дебугеры могут такого делать? Причем все вываливается при обращении одной и той же инструкции к разным областям памяти, не относящимся к моей программе. Без дебугера я так тыкаться могу долго. А есть какя нить утилита, чтобы сдампить значения всех переменных запущенного процесса?
Здравствуйте, Аноним, Вы писали:
А>Доброго времени суток! Вопрос на засыпку — при запуске программы под дебугером MSVC++ нормально работает, при запуске без дебугера вываливается, пишет что память не может быть прочитатна. Программа довольно здоровая, там юзается дин. выделение памяти, работа с COM портами, OpenGL. IDE Visual Studio 7.1.30.88. Может кто знает почему так? Все тонкие места со сбором мусора и выделением памяти прологировал, нормально отрабатывает. Помогите пожалуйста
Я бы посоветовал вместо отладчика выдавать протокол работы программы в лог. Первым делом нужно попытаться отловить момент возникновения ошибки, дальше уже легче будет сориентироваться что делать. По симптомам похоже, что кто то портит память.
--
Re[2]: Debuger MSVC++
От:
Аноним
Дата:
26.02.06 08:06
Оценка:
Устал логи писать. Не получается. Похоже где-то память уничтожается, а сам указатель не зануляется(что как раз наверное дебугер и делает). Я примерно знаю место, но логами не получается ничего сделать. Вот круто было бы какую-нить утилитку, чтобы сдампить значения переменных?
Здравствуйте, Аноним, Вы писали:
А>Попробовал под OllyDebugger посмотреть, опять-таки все прекрасно работает. Чего эти дебугеры могут такого делать? Причем все вываливается при обращении одной и той же инструкции к разным областям памяти, не относящимся к моей программе. Без дебугера я так тыкаться могу долго. А есть какя нить утилита, чтобы сдампить значения всех переменных запущенного процесса?
Не знаю как микрософтовский отладчик, не работал, но практически все отладчики имеют tracepoint'ы (watchpoint'ы). На сколько я понимаю, тебе надо получить момент, когда программа некорректно обращается к памяти. Так вот tracepoint'ы и watchpoint'ы именно для подобных ситуаций и предназначены.
Сами по себе отладчики ничего не переделывают ни в программном коде, ни в данных программы. Можешь построить релиз и его запустить под отладчиком.