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