Что Visual Studio считает пользовательским кодом?

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

Если Visual Studio решит, что сторонняя DLL не является «пользовательским кодом» (как показано на изображении ниже), то по умолчанию она остановится на моем исключении, даже если оно будет обработано позже. Это не совсем неправильно. в нем четко объясняется, что исключение не было обработано пользовательским кодом. Но что заставляет Visual Studio называть одни библиотеки DLL «пользовательским кодом», а другие - нет?

введите описание изображения здесь

У меня была теория, что это происходит из-за того, что символы не загружены, но в списке есть модули, которые имеют загруженные символы, но все еще не считаются «пользовательским кодом».


person Roman Starkov    schedule 08.03.2012    source источник
comment
Для других окно «Модули» находится в меню «Отладка», выберите «Окна» и нажмите «Модули». Полезное отображение для отслеживания того, какая именно библиотека .dll используется (мой код не отлаживался, потому что он использовал копию библиотеки в GAC, а не вывод из указанного проекта), спасибо за указание на это.   -  person RyanfaeScotland    schedule 09.04.2015


Ответы (1)


Да, без файла .pdb отладчик не может определить, является ли это пользовательский код или нет. Это достаточно хорошо объясняется в статье MSDN.:

Чтобы отличить пользовательский код от непользовательского кода, Just My Code рассматривает три вещи: файлы DBG, файлы PDB и оптимизацию.

В стандартной отладочной сборке оптимизация отключена и символы отладки создаются для всех модулей. Когда вы запускаете отладочную сборку, эти модули считаются пользовательским кодом. Однако, если я вызываю библиотечную функцию, которая оптимизирована и не имеет символов отладки, это не пользовательский код. Just My Code предотвращает остановку выполнения в точках останова в коде библиотеки, который обычно не является кодом, который вы хотите отлаживать. В окне «Точки останова» эти точки останова будут отображаться со значком «Отключена точка останова».

person Hans Passant    schedule 08.03.2012
comment
Это потрясающе. Имея это в виду, я опубликовал ответ на предотвращение остановки отладчика при всех исключениях в библиотеке и добавил еще один способ обхода Assert.Throws<T> остановки NUnit. Хороший! - person Roman Starkov; 08.03.2012
comment
Это все еще неясно. Я считаю, что можно с уверенностью сказать: Код пользователя = Без оптимизации + символы отладки? - person ivan_pozdeev; 26.12.2014