Вход в вызов P / Invoke в режиме дизассемблирования

Мой код на C # вызывает неуправляемую стороннюю библиотечную функцию через P / Invoke, и у неуправляемой функции есть некоторые странные побочные эффекты. Я хочу отладить его и посмотреть, что он делает.

Если я отлаживаю свой код C # и пытаюсь выполнить «Step Into» вызов P / Invoke, он вместо этого переходит. Там нет ничего удивительного - я ожидал этого; у него нет источника для этой DLL, и я не сказал, что у меня все в порядке с видом на разборку.

Поэтому я переключаю отладчик в режим дизассемблирования (Debug> Windows> Disassembly). Теперь я вижу отдельные инструкции для x86 в своем коде JITted. Я снова пытаюсь войти в вызов P / Invoke. Опять же, он переходит вместо этого - хотя я четко сказал это, чтобы перейти к инструкции CALL x86. Насколько сложно войти в CALL x86?

Мой поиск в Google пока показал мне несколько вариантов, которые могут повлиять на это, и я уже установил их:

  • В меню «Инструменты> Параметры> Отладка> Общие» флажок «Включить только мой код» снят.
  • На вкладке «Проект»> «Свойства»> «Отладка» установлен флажок «Включить отладку неуправляемого кода».

Не хорошо. Visual Studio по-прежнему отказывается вмешиваться.

У меня нет PDB для сторонней DLL, но это не должно иметь значения. Меня не волнует исходный код или информация о символах. (Ну, на самом деле они были бы очень хорошо, но я уже знаю , что я не собираюсь их.) Visual Studio может сделать x86 отладки (это то , что вид дизассемблирование для ), и все , что я хочу сделать , это шаг в код х86.

Что еще мне нужно сделать, чтобы заставить VS позволить мне перейти к инструкциям x86 внутри вызова P / Invoke?

12.10.2009 23:01:49
Вы когда-нибудь понимали это?
Dennis 11.11.2013 22:05:00
Прошло несколько лет с тех пор, как я пытался это сделать, но, насколько я помню, нет, я никогда не заставлял его работать.
Joe White 12.11.2013 03:58:15
4 ОТВЕТА

Одна вещь, которую я бы попробовал, это перейти от C # к коду C ++ / CLI, а затем от C ++ к стороннему коду. Как только вы окажетесь в C ++ (и свободны от инфраструктуры P / Invoke), вам может повезти с представлением дизассемблирования.

1
13.10.2009 01:58:19
Я почти ничего не знаю о написании кода на C ++ / CLI ... есть ссылки, которые могли бы помочь мне начать работать с этой стратегией?
Joe White 13.10.2009 14:13:58

Это может помочь вам решить проблему: (от Graviton)

CallingConvention = CallingConvention.Cdecl

Также здесь упоминается, что вам нужно отсоединить управляемый отладчик и повторно подключить неуправляемый при пересечении границ. Возможно, вам придется проверить возможности смешанного отладчика и его предпочтения в MSDN.

И наконец, используя ответ Эда Дора :

В диалоговом окне Tools.Options выберите категорию «Отладка» и убедитесь, что параметр «Включить только мой код» снят. В свойствах проекта выберите вкладку «Отладка» и убедитесь, что установлен флажок «Включить отладку неуправляемого кода».

Как только вы разберетесь со всеми этими вопросами, вы должны получить поддержку отладки в смешанном режиме.

Кроме того, если вы используете «Debug.Attach To Process», обязательно нажмите кнопку «Выбрать ...» в диалоговом окне «Присоединить к процессу» и выберите поддержку управляемой и собственной отладки.

4
23.05.2017 12:34:01
Ни одна из этих справок не входит в вызовы методов каркаса в VS2017 / Win10 :(
Roman Starkov 9.03.2018 13:08:12

В свойствах проекта C # на вкладке Отладка установите флажок Включить отладку собственного кода. Работал для меня в VS 2012.

Кредит идет в Билл .

Кроме того, поскольку это сторонняя библиотека, убедитесь, что параметр «Включить только мой код» не установлен в «Параметры»> «Отладка».

1
23.05.2017 12:24:24

У меня была похожая проблема, когда я отлаживал C # exe, который вызывал мою собственную C ++ dll через PInvoke, все это часть того же решения. Включение отладки собственного кода в моем проекте c # позволило мне отладить мой код C ++.

0
13.10.2014 16:23:26