Что лучший способ состоит в том, чтобы присоединить отладчик к процессу в VC ++ в просто правой точке вовремя?

Но я хочу, чтобы мой Bootstrapper был в проекте Assembly ... Возможно ли это с Prism 7?

Конечно, просто свяжите dll с загрузчиком из exe и положить что-то вроде этого в App.xaml.cs:

protected override void Onstartup(StartupEventArgs e)
{
    base.OnStartup(e);
    var bootstrapper = new Company.Product.Presentation.Bootstrapper();
    bootstrapper.Run();
}
8
задан Suma 19 March 2009 в 19:19
поделиться

6 ответов

11
ответ дан 5 December 2019 в 04:55
поделиться

Для присоединения отладчика в конкретной точке у Вас есть несколько опций:

Самое простое должно только звонить DebugBreak, который в значительной степени эквивалентен __asm int 3, но также и работы над другой архитектурой (MSVC для x64 не позволяет встроенный ассемблерный код, если я вспоминаю правильно). Это поднимет своевременное окно отладки, и Вы сможете выбрать из зарегистрированных отладчиков (т.е. Visual Studio) для присоединения к процессу.

С другой стороны, можно представить вызов Sleep, предоставление Вам возможность присоединить отладчик. Необходимо использовать #ifdef _DEBUG вокруг этого, чтобы гарантировать, чтобы Вы на самом деле не поставлялись с этим включенным кодом.

Один вопрос: почему Вы не можете выполнить код от IDE? Действительно ли это - сервис или загруженный IIS DLL или подобный?

В этом случае можно проверить ImageFileExecutionOptions ключ реестра, который позволяет Вам присоединять отладчик в данный момент, который запускает процесс.

При использовании cdb для этого можно настроить его или как сервер или как клиент к экземпляру WinDbg, и отладить тот путь. Я сделал это в прошлом при помощи WinDbg как отладчик ядра, и при помощи ImageFileExecutionOptions для запуска ntsd -d с именованным процессом. Это заставляет WinDbg врываться в непривилегированный режим. Это иногда - полезная техника.

9
ответ дан 5 December 2019 в 04:55
поделиться

Имея необходимость присоединить в 'просто правая точка' является болью... одна опция к, но явные операторы DebugBreak() в код для принуждения проблемы и защиты их с #ifdef _DEBUG была бы хорошая идея. Мы используем УТВЕРЖДАТЬ макрос, который может назвать DebugBreak (), таким образом, можно просто записать, УТВЕРЖДАЮТ (ложь)

Другая опция рассмотреть использует 'опции выполнения файла изображения' для запуска отладчика автоматически. См. этот блог и документацию MSDN.

2
ответ дан 5 December 2019 в 04:55
поделиться

Ищите:

DebugBreak, __ debugbreak и друзья

или

статическая пустота timeToChase () {__ asm {интервал 3;};}

1
ответ дан 5 December 2019 в 04:55
поделиться
__asm int 3 

Эта трудная точка останова поднимет диалоговое окно отладки, которое позволит Вам присоединить к процессу. Перенесите это в #ifdef _DEBUG, и Вы только поразите его в сборках отладки.

1
ответ дан 5 December 2019 в 04:55
поделиться

У Freddy и Reoa есть правильные решения. Но я хотел добавить причину, почему не использовать MessageBox.

Отображение MessageBox только частично останавливает Ваше приложение. Поскольку Вы показываете UI, насос сообщения все еще работает по крайней мере на одном потоке в Вашей программе. Таким образом, если Ваш код делает какое-либо из следующих.

  1. Связывается с помощью сообщений Windows
  2. Имеет нетривиальный UI
  3. Является многопоточным

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

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

6
ответ дан 5 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: