"пропущенные символы загрузки для ngen binary" для C# dll
Я пытаюсь отладить dll C# из собственного исполняемого файла c++. У меня есть объект C# COM, который загружается и запускается из собственного кода через IDispatch. Все встроено в Debug, как C#, так и C++ код. В то время как я вижу весь код C++, и все DLL c++ имеют свои символы, загруженные и доступные для отладки, точки останова и т. д. код C# отказывается играть.
что я вижу, так это то, что DLL C# все отказываются загружать свои символы pdbs, сообщая " пропущенные символы загрузки для двоичного файла ngen" в окне модули.
кстати, я отлаживаю решение C# здесь, я установил собственный исполняемый файл как "запустить внешнюю программу" в настройках отладки COM-проекта.
теперь я могу запустить исполняемый файл C++, а затем прикрепиться к нему, а затем все работает так, как я ожидаю - символы загружаются, и я могу установить точки останова в C#.
это использование Visual Studio 2013u4. Есть ли параметр для включения отладки в смешанном режиме? Один нюанс заключается в том, что родной код был построенный с VS2010.
вот окно модуля-обратите внимание, что все pdbs и DLL находятся в одном каталоге, вы можете видеть загруженные библиотеки C++, но не C#.
вот окно модулей-обратите внимание на 3-ю запись для библиотеки dll EvCom (COM-объект), которая, как я предполагаю, является записью, включающей отладку.
в окне вывода нет ничего интересного, когда дело доходит до загрузки com dll, я вижу после (в случае присоединения к запущенному процессу у другого есть только 2 загруженные строки вместо 3).
'Explorer.exe' (Win32): Loaded 'C:Dev...libdebugEvCom.dll'.
'Explorer.exe' (Win32): Loaded 'C:Dev...libdebugEvCom.dll'.
'Explorer.exe' (Win32): Unloaded 'C:...libdebugEvCom.dll'
'Explorer.exe' (Win32): Loaded 'C:Dev...libdebugEvCom.dll'.
одна интересная вещь - я проверил "использовать режим управляемой совместимости" в настройках отладки и подумал, что он все еще не загружает мои символы при запуске отладки, он показывает только 1 запись в списке модулей. На этот раз, говоря "нет собственных символов в файле символов" для DLL c#.
похоже, что проблема не в том, чтобы выбрать тип отладчика в VS2013 (или 2012). это подключить статью предлагает его "по дизайну" с некоторыми обходными путями.
4 ответов
оказывается, все дело в изменениях в debug engine для .NET 4.0
.NET 4 и выше использует другой механизм отладки, чем .net 3.5 и ниже, при запуске отладки собственного приложения отладчик выберет для вас отладчик .net (по умолчанию .net 4.0), и если ваша dll .net построена с использованием этой платформы, все будет хорошо - точки останова будут поражены.
Если ваша загруженная dll .net 3.5, то механизм отладки не поймет библиотеки DLL, которые loaded и откажется загружать символы или отлаживать.
решения либо перестраиваются как .net 4, либо запускают собственный исполняемый файл и присоединяются к нему (где вы можете выбрать тип отладчика, либо "старый" .net, либо "новый" .net), либо вы можете создать проект из исполняемого файла и установить его параметры отладки, чтобы указать правильный отладчик.
меня раздражает то, что Microsoft могла легко запустить отладчик, используя тип .NET framework, указанный в проекте вы отлаживаете (в конце концов, при отладке dll и указании внешней программы вы все равно хотите отладить dll, для которой вы нажимаете F5, поэтому вы знаете, какой отладчик использовать!)(Что такое еще больше раздражает это то, что после запуска управляемой отладки в загруженной dll вы можете без проблем входить в проекты, построенные с использованием старых .NET Framework).
подробнее о это Microsoft connect статьи
(Если исполняемый файл еще не находится в вашем решении, Файл > Добавить > существующий проект, щелкните правой кнопкой мыши и установите его как запуск проекта.)
щелкните правой кнопкой мыши проект запуска, свойства, отладка, тип отладчика = Mixed.
в моем случае у меня есть собственный сервер символов и TFS, поэтому я включена опция Инструменты > Параметры > отладка > общие > "включить поддержку исходного сервера" и три дочерних параметра.
для меня это была отладка приложения UWP в Xamarin Forms:
причиной: Отладчик пропускает файлы не в среде .NET.
решение: Снимите Флажок Отладка => Общие = > Включить Только Мой Код