Каков наилучший способ просмотреть точную дизассемблирование в VC++ 2010 в режиме выпуска Win32?

Я пишу код, оптимизированный на уровне сборки, и мне нужно убедиться, что компилятор C++ корректно работает с ним в Release-Mode.

Раньше я мог заставить программы Release-Mode прерываться на точках останова в VS 2002 (и отображать необработанную дизассемблирование по мере прохождения), но я не могу вспомнить, как я заставил это работать. Есть ли в VS 2010 какие-либо параметры, которые могут позволить это сделать?


person Giffyguy    schedule 20.02.2011    source источник
comment
Вот почему я предпочитал CodeWarrior Visual Studio — у него был пункт меню для компиляции и демонстрации дизассемблирования текущего файла редактора.   -  person ohmantics    schedule 21.02.2011
comment
Проверьте ответ Zr. Он ломает оптимизированный код в режиме выпуска.   -  person morteza khosravi    schedule 10.05.2016


Ответы (4)


Скомпилируйте с /Zi и свяжите с /DEBUG, и вы сможете установить точки останова.

В диалоговом окне свойств проекта:

  • /Zi можно включить в C++ --> Общие --> Формат отладочной информации

  • /DEBUG можно включить в Linker --> Debugging --> Generate Debug Info

person Mark Tolonen    schedule 20.02.2011
comment
Я проверил и подтвердил, что /Zi не приводит к работе точек останова. И /ZI (заглавная) не совместима с /O2 - person Giffyguy; 21.02.2011
comment
Извините, вам также нужен переключатель компоновщика /DEBUG. - person Mark Tolonen; 21.02.2011
comment
/DEBUG тоже не ломает. Но я думаю, что мы на правильном пути. Возможно ли, что есть еще один переключатель, который необходимо установить? - person Giffyguy; 21.02.2011
comment
Как вы устанавливаете точки останова? Используете ли вы встроенную сборку или файлы .asm? Эти два переключателя должны быть всем, что вам нужно. Вместе с exe должен быть сгенерирован файл .pdb. - person Mark Tolonen; 21.02.2011

Если вы хотите использовать отладчик для просмотра разборки, вы можете поместить встроенный вызов __debugbreak() прямо перед кодом, который вы хотите просмотреть.

person zr.    schedule 20.02.2011
comment
Это правильный ответ. Он работает именно так, как рекламируется. - person morteza khosravi; 10.05.2016
comment
Если вы хотите перекомпилировать каждый раз, когда хотите изменить точку останова. - person Mark Tolonen; 12.10.2019

Если вы пишете прямой ассемблер, вы можете просто использовать INT 3. Когда вы устанавливаете точку останова с помощью отладчика, он фактически изменяет код на этот (0xCC в двоичном формате), поэтому отладчик будет вызываться при его выполнении.

Вы также можете вызвать одну из функций, которые сделают это за вас, как предложил zr. Для Windows используется DbgBreakPoint(). Если разобрать, то легко увидеть, что это не что иное, как INT 3.

person kichik    schedule 20.02.2011
comment
DebugBreak, а не DbgBreakPoint. - person Ben Voigt; 20.02.2011

Раньше это были методы создания точек останова:

_asm
{
  int 3
}

or

_asm
{
  _emit 0xcc
}

или это было

_emit 0xcc

Я не уверен в синтаксисе (это было давно), но, надеюсь, из этого можно что-то сделать.

person Olof Forshell    schedule 21.02.2011