Как я могу отлаживать библиотеки DLL C ++, подключенные во внешнем приложении C # (которое нельзя запустить из отладчика) - PullRequest
0 голосов
/ 19 марта 2019

Я не могу понять, как отлаживать часть кода C ++, которая используется в управляемом приложении.Я, кажется, в более конкретном случае, что другие существующие подобные вопросы

Контекст:

  • Я хочу отладить мои библиотеки C ++
  • Они заключены в C #используя swig
  • Я также создаю плагин C # для приложения, которое использует упакованный C # dll
  • Приложение не может быть запущено из отладчика, я должен присоединить его потом
  • Я построил все в режиме отладки и x64 в VS2015 (на самом деле c # dll находится на платформе AnyCPU, с не отмеченной галочкой 'Prefer-32-bit')
  • Я нахожусь в подходящей среде для запуска кода(другие вещи кода работают), это только ошибка в части C ++, которую я хочу отлаживать, когда это происходит из части C #

Я пытался запустить программу как внешнюю программу отладкиC ++ DLL (с ​​указанием «смешанной» отладки или в качестве внешней программы отладки C # dll (включение «отладки нативного кода»). Но я думаю, что эти параметры могут игнорироваться, так как я не могу запустить exe в отладчике, просто присоединить кпроцедураЭсс после.И я прикрепил процесс выбора Native и Managed отладчика.Я могу только взломать мой управляемый код

. В окне вывода отладки VS 2015 я не вижу, что исполняемый файл пытается загрузить мои библиотеки C ++, но я вижу их загруженными при просмотре в проводнике процессов.swig (или система плагинов управляемого приложения), может быть, использует магию для загрузки c ++ dll

Есть какой-нибудь прием, чтобы помочь?

1 Ответ

0 голосов
/ 21 марта 2019

Вы говорите: «Я пытался запустить программу как внешнюю программу отладки C ++ DLL ... Но я думаю, что эти параметры могут быть проигнорированы, так как я не могу запустить exe в отладчике ...».Я думаю, что это может быть то, где вы идете не так.

Вам нужно установить проект C ++ DLL в качестве запускаемого проекта (щелкните проект правой кнопкой мыши и выберите Set as StartUp Project).Затем откройте страницы свойств для проекта и в разделе «Отладка» в поле «Команда» введите полный путь к исполняемому файлу приложения.Введите любые аргументы командной строки, необходимые в поле Command Arguments.Также убедитесь, что ваш проект DLL генерирует PDB в C ++ / General.Очистите и перестройте проект DLL.

Установите точку останова в функции, которую вы ожидаете вызвать - в идеале, где-то рядом с точкой входа, и еще одну точку останова в коде, который вы хотите отладить.Теперь начните отладку (F5).Приложение должно запуститься (точки останова, вероятно, будут выглядеть «выдолбленными» с сообщением о том, что точка останова не привязана или похожая - пока не беспокойтесь об этом).Выполните все действия, необходимые в приложении для вызова собственной библиотеки DLL.Когда DLL и ее PDB загружены, точки останова должны выглядеть непрозрачными и будут поражены при выполнении строки кода.

Если точка останова не достигнута / не привязана, я бы предложил скопироватьC ++ DLL и его PDB в исполняемую папку приложения, чтобы уменьшить вероятность загрузки неправильной DLL.Затем перезапустите отладчик.Если ваше приложение программно устанавливает рабочую папку, попробуйте скопировать также DLL / PDB в это место.

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

...