2009-10-12 2 views
8

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

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

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

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

  • В меню Инструменты> Параметры> Debugging> General, «Включить Just My Code» является бесконтрольно.
  • В проекте> Свойства> вкладка «Отладка» «Включить неуправляемую отладку кода» отмечена.

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

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

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

+0

Вы когда-нибудь это выясняли? – Dennis

+1

Прошло несколько лет с тех пор, как я попытался это сделать, но, как я помню, нет, я никогда не получал его на работу. –

ответ

1

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

+1

Я почти ничего не знаю о написании кода C++/CLI ... получили ссылки, которые могли бы помочь мне начать с этой стратегии? –

4

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

CallingConvention = CallingConvention.Cdecl 

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

И, наконец, используя Ed Dore' ответ:

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

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

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

+0

Ничто из этого не помогает вступить в вызовы методов framework в VS2017/Win10 :( –

1

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

Заслуга billb.

Кроме того, поскольку это библиотека третьей стороны, обеспечить Enable Just My Code снят в Настройках > Отладка.

0

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

Смежные вопросы