Вход в вызов P/Invoke в режиме дизассемблирования
Мой код на C# вызывает неуправляемую стороннюю библиотечную функцию через P/Invoke, и у неуправляемой функции есть некоторые странные побочные эффекты. Я хочу отладить его и посмотреть, что он делает.
Если я отлаживаю свой код на C# и пытаюсь "войти в" вызов P/Invoke, он вместо этого переходит. Там нет ничего удивительного - я ожидал этого; у него нет источника для этой DLL, и я не сказал, что у меня все в порядке с видом на разборку.
Поэтому я переключаю отладчик в режим дизассемблирования (Debug > Windows > Disassembly). Теперь я вижу отдельные инструкции для x86 в своем коде JITted. Я снова пытаюсь войти в вызов P / Invoke. Опять же, он переходит вместо этого - хотя я четко сказал это Step Into инструкции xALL CALL. Насколько сложно войти в x86 CALL?
До сих пор мой поиск в Google показал мне несколько вариантов, которые могут повлиять на это, и я уже установил их:
- В меню "Инструменты> Параметры> Отладка> Общие" флажок "Включить только мой код" снят.
- На вкладке "Проект"> "Свойства"> "Отладка" установлен флажок "Включить отладку неуправляемого кода".
Не хорошо. Visual Studio по-прежнему отказывается вмешиваться.
У меня нет PDB для сторонней библиотеки DLL, но это не должно иметь значения. Меня не волнует исходный код или информация о символах. (Ну, на самом деле они были бы очень хорошими, но я уже знаю, что не собираюсь их получать.) Visual Studio может выполнять отладку x86 (для этого нужен вид Disassembly), и все, что я хочу сделать, - это шагнуть в код х86.
Что еще мне нужно сделать, чтобы заставить VS позволить мне перейти к инструкциям x86 внутри вызова P / Invoke?
5 ответов
Это может помочь вам решить проблему: (от Graviton)
CallingConvention = CallingConvention.Cdecl
Также здесь упоминается, что вам нужно отсоединить управляемый отладчик и повторно подключить неуправляемый при пересечении границ. Возможно, вам придется проверить возможности смешанного отладчика и его предпочтения в MSDN.
И наконец, используя ответ Эда Дора:
В диалоговом окне Tools.Options выберите категорию "Отладка" и убедитесь, что параметр "Включить только мой код" снят. В свойствах проекта выберите вкладку "Отладка" и убедитесь, что установлен флажок "Включить отладку неуправляемого кода".
Как только вы разберетесь со всеми этими вопросами, вы должны получить поддержку отладки в смешанном режиме.
Кроме того, если вы используете "Debug.Attach To Process", обязательно нажмите кнопку "Выбрать..." в диалоговом окне "Присоединить к процессу" и выберите поддержку управляемой и собственной отладки.
В свойствах проекта C# на вкладке "Отладка" установите флажок "Включить отладку собственного кода". Работал для меня в VS 2012.
Кредит идет в Билл.
Кроме того, поскольку это сторонняя библиотека, убедитесь, что параметр "Включить только мой код" не установлен в "Параметры"> "Отладка".
Одна вещь, которую я бы попробовал, это перейти с C# на код C++/CLI, а затем с C++ на сторонний код. Как только вы окажетесь в C++ (и свободны от инфраструктуры P/Invoke), вам может повезти с представлением дизассемблирования.
У меня была похожая проблема, когда я отлаживал C# exe, который вызывал мою собственную C++ dll через PInvoke, все это часть того же решения. Включение отладки собственного кода в моем проекте C# позволило мне отладить мой код C++.
Была такая же проблема сегодня. В моем случае помогло запустить Visual Studio от имени администратора.
Моя установка:
- Визуальная студия 2019
- Windows 10