В чем разница между запуском отладочного приложения, размещенного в Visual Studio, и его непосредственным запуском? - PullRequest
0 голосов
/ 15 марта 2011

У меня есть приложение, работающее на .Net Framework 4, и мое приложение запускает управляемый и неуправляемый код.UDP-сокеты используются со специальным стеком связи, чтобы общаться с нашим пользовательским оборудованием.Когда приложение запускается из Visual Studio, все в порядке, но когда оно запускается само по себе, оно часто зависает.Я видел поведение на Windows XP SP3 и Windows 7 SP1.Когда приложение заморожено, я вижу, что оно застряло в ntdll.dll в большинстве моих тем.В другой ветке вопросов мне сказали, что это нормально, что тупик все еще вызван моим кодом.

Это очень сложно отладить, потому что я могу только присоединиться к приложению и приостановить его в основном режиметак что все, что я вижу, это разборка.Я ищу любой намек, который мог бы мне помочь.Итак, у кого-нибудь есть идея, что может привести к зависанию приложения при непосредственном запуске или при запуске из Visual Studio с использованием F5?Я где-то читал, что в управляемом коде GC действует по-другому, в чем различия?Кроме того, для неуправляемого кода я понял, что память инициализируется по-разному.Опять же, в чем разница?

Любая помощь с благодарностью!

Seb

Ответы [ 2 ]

1 голос
/ 15 марта 2011

При запуске сборки выпуска без отладчика отличается то, что оптимизатор JIT включен.Код работает быстрее.Что тесно связано с вашей проблемой, проблемы с потоками зависят от времени.Считай, что тебе повезло (я уверен, что нет), что это идет не так, пока твой код все еще работает на твоей машине разработки, действительно неприятные проблемы с потоками - это те, которые портят твою программу раз в неделю на машинах твоего клиента.*

Сделать эту проблему отладочной - все еще самый важный способ ее решения.Кроме Tools + Attach to Process, другой способ запустить отладчик - использовать System.Diagnostics.Debugger.Launch () в вашем коде.Появится диалоговое окно, в котором можно выбрать отладчик.

Еще один способ, который не требует подключения отладчика, - переключить VS на сборку выпуска.Используйте Tools + Options, Debugging, General и снимите отметку «Подавить оптимизацию JIT при загрузке модуля».Нажатие F5 теперь запускает вашу программу с включенным оптимизатором и предварительно подключенным отладчиком.Тем не менее, это не совсем хлам, поскольку отладчик, подключенный сам по себе, вызывает различия во времени.

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

Анализ кода - это еще один подход, особенно когда он выполняется кем-то другим.И последнее, но не менее важное: подумайте, действительно ли многопоточность является оптимальным решением в вашем приложении.Ворчание "я действительно решил это?"чувство никогда не уходит, доказывая, что многопоточный код не содержит дефектов, почти невозможно.

0 голосов
/ 15 марта 2011

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

...