Вход в вызов P / Invoke в режиме дизассемблирования - PullRequest
10 голосов
/ 13 октября 2009

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

Если я отлаживаю свой код C # и пытаюсь выполнить «Step Into» вызов 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 - для ), и все хочу сделать, это шаг в код x86.

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

Ответы [ 4 ]

4 голосов
/ 12 апреля 2011

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

CallingConvention = CallingConvention.Cdecl

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

И, наконец, Ed Dore ' answer:

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

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

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

1 голос
/ 20 октября 2012

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

Кредит поступает на Билл .

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

1 голос
/ 13 октября 2009

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

0 голосов
/ 13 октября 2014

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

...