2009-10-12 5 views
8

Mi código C# llama a una función de biblioteca de terceros no administrada a través de P/Invoke, y la función no administrada está teniendo algunos efectos secundarios extraños. Quiero depurarlo y ver qué está haciendo.Entrando en una llamada P/Invoke en la vista de desarmado

Si depuro mi código de C# y trato de "entrar" en la llamada de P/Invoke, pasa a su lugar. No fue sorpresa, esperaba eso; no tiene el origen de esta DLL, y no le dije que estaba de acuerdo con ver la vista de desensamblaje.

Así que cambio el depurador a la vista de desensamblaje (Depurar> Windows> Desmontaje). Ahora veo las instrucciones x86 individuales en mi código JITted. De nuevo trato de entrar en la llamada de P/Invoke. Una vez más, da un paso hacia adelante, aunque claramente le dije que entrara en una instrucción x86 CALL. ¿Qué tan difícil es entrar en una LLAMADA x86?

Mi googlear hasta ahora me ha mostrado un par de opciones que pueden afectar a esto, y ya les he fijado:

  • en Herramientas> Opciones> Depuración> General, "Habilitar Sólo mi código" es desenfrenado.
  • En Proyecto> Propiedades> pestaña Depuración, se activa "Activar depuración de código no administrado".

No bueno. Visual Studio todavía se niega a intervenir.

No tengo un PDB para la DLL de terceros, pero eso no debería importar. No me importa el código fuente o la información de símbolos. (Bueno, en realidad serían realmente agradables, pero ya sé que no voy a obtenerlos.) Visual Studio puede realizar la depuración x86 (eso es lo que la vista Desmontaje es para), y todo lo que quiero hacer es ingrese al código x86.

¿Qué más debo hacer para que VS me permita seguir las instrucciones x86 dentro de una llamada P/Invoke?

+0

¿Alguna vez descubrió esto? – Dennis

+1

Han pasado algunos años desde que traté de hacer esto, pero según recuerdo, no, nunca conseguí que funcionara. –

Respuesta

1

Una cosa que probaría es pasar de C# a código C++/CLI, y luego de C++ al código de un tercero. Una vez que esté en C++ (y libre de la infraestructura de P/Invoke), es posible que tenga más suerte con la vista de desensamblaje.

+1

No sé casi nada sobre cómo escribir el código C++/CLI ... ¿tengo algún enlace que pueda ayudarme a comenzar con esta estrategia? –

4

This puede ayudar a resolver el problema: (por gravitón)

CallingConvention = CallingConvention.Cdecl 

también this menciona que es necesario separar depurador administrado y no administrado volver a conectar al cruzar las fronteras. Es posible que deba verificar las capacidades del depurador mixto y sus preferencias desde MSDN.

Y, por último, el uso de Ed Dore' respuesta:

Bajo diálogo Tools.Options, seleccione la categoría depuración, y asegúrese de que el "Habilitar Sólo mi código" ajuste es sin marcar. Desde las propiedades del Proyecto , seleccione la pestaña Depuración y , luego asegúrese de que la opción "Habilitar la depuración del código no gestionado" esté marcada.

Una vez que tenga estos cuadrados, debe obtener el modo mixto que funciona como depurador.

Además, si utiliza "Depurar".Para adjuntar Proceso", asegúrese de dar con el 'Seleccionar ...' botón en la 'colocar Para de diálogo Proceso' y seleccione tanto Administrado y soporte de depuración nativa.

+0

Ninguno de estos ayuda paso en llamadas a métodos de marco en VS2017/Win10 :( –

1

En las propiedades del proyecto de C# , en la ficha Depurar, seleccione Habilitar la depuración de código nativo. Trabajó para mí en VS 2012.

crédito va a billb.

Además, dado que se trata de una biblioteca de terceros, asegúrese Habilitar Sólo mi código no está seleccionada en las Opciones > Depuración.

0

Tuve un problema similar cuando estaba depurando un exe de C# que llamaba a mi propio dll C++ a través de PInvoke, todo formaba parte de la misma solución. Habilitar la depuración del código nativo en mi proyecto C# me permitió depurar mi código C++.

Cuestiones relacionadas