2009-10-12 9 views
8

Mein C# -Code ruft eine nicht verwaltete Bibliotheksfunktion von Drittanbietern über P/Invoke, und die nicht verwaltete Funktion hat einige seltsame Nebenwirkungen. Ich möchte es debuggen und sehen, was es macht.In einen P/Invoke-Aufruf in Disassembly-Ansicht treten

Wenn ich meinen C# -Code debugge und versuche, den P/Invoke-Anruf zu "betreten", geht er stattdessen über. Keine Überraschung dort - das habe ich erwartet; Es hat nicht die Quelle für diese DLL, und ich habe es nicht gesagt, ich war in Ordnung mit der Demontageansicht.

So habe ich den Debugger zu Disassembly Ansicht wechseln (Debug> Windows> Disassembly). Jetzt sehe ich die einzelnen x86-Anweisungen in meinem JITted-Code. Wieder versuche ich in den P/Invoke-Aufruf zu treten. Wieder geht es stattdessen über - obwohl ich es klar gesagt habe, in einen x86 CALL-Befehl zu treten. Wie schwer ist es, in einen x86 CALL zu treten?

Mein googeln so hat mich weit gezeigt, ein paar Optionen, die diese beeinflussen können, und ich habe sie bereits festgelegt:

  • In Extras> Optionen> Debuggen> Allgemein „Mein-Code aktivieren Sie einfach“ ist deaktiviert.
  • In Projekt> Eigenschaften> Registerkarte Debuggen, "Enable unmanaged code debugging" aktiviert ist.

Nicht gut. Visual Studio weigert sich immer noch, einzutreten.

Ich habe keine PDB für die DLL von Dritt-Anbieter, aber das sollte keine Rolle spielen. Ich interessiere mich nicht für Quellcode oder Symbolinformationen. (Nun, eigentlich wären sie wirklich nett, aber ich weiß bereits, dass ich sie nicht bekommen werde.) Visual Studio kann x86-Debugging durchführen (das ist die Disassembly-Ansicht für), und alles, was ich tun möchte, ist Schritt in den x86-Code.

Was muss ich noch tun, um VS dazu zu bringen, dass ich in einem P/Invoke-Anruf in die x86-Anweisungen einsteigen kann?

+0

Haben Sie das jemals herausgefunden? – Dennis

+1

Es ist ein paar Jahre her, seit ich das versucht habe, aber soweit ich mich erinnere, nein, ich habe es nie zur Arbeit gebracht. –

Antwort

1

Eine Sache, die ich versuchen würde, geht von C# zu C++/CLI-Code und dann von C++ zu den Drittanbieter-Code. Sobald Sie in C++ sind (und frei von der P/Invoke-Infrastruktur), haben Sie möglicherweise mehr Glück mit der Disassemblierungsansicht.

+1

Ich weiß so gut wie nichts über das Schreiben von C++/CLI-Code ... habe ich irgendwelche Links, die mir helfen könnten, mit dieser Strategie zu beginnen? –

4

This kann Ihnen helfen, das Problem zu lösen: (von Graviton)

CallingConvention = CallingConvention.Cdecl 

Auch this erwähnt, dass Sie es geschafft, Debugger lösen müssen und wieder anbringen unmanaged, wenn die Grenzen überqueren. Möglicherweise müssen Sie die Fähigkeiten von gemischten Debugger und seine Einstellungen von MSDN überprüfen.

Und schließlich mit Ed Dore' Antwort:

Unter Tools.Options Dialog wählen Sie die Debuggen Kategorie, und stellen Sie sicher, dass die "Enable Just My-Code" -Einstellung ist unkontrolliert. Wählen Sie in den Eigenschaften des Projekts die Registerkarte Debug und , dann stellen Sie sicher, dass "Enable unmanaged code debugging" aktiviert ist.

Sobald Sie diese quadriert haben, sollten Sie den gemischten Modus Debugging-Unterstützung arbeiten.

Auch, wenn Sie "Debuggen" verwenden.Bringen Um Process“sicher, dass die Hit "Wählen Sie ..." Button in der "Attach To Process" Dialog und wählen Sie beide Managed und Native-Debugging-Unterstützung.

+0

Keiner von diesen helfen Schritt in Aufrufe von Framework-Methoden in VS2017/Win10 :( –

1

In Ihrem C# Projekteigenschaften in den Debug-Registern überprüfen, nativen Code-Debugging aktiviert. Arbeitete für mich in VS 2012.

Kredit geht an billb.

da es auch eine dritte Partei Bibliothek ist sicher Aktivieren Just My-Code ist in den Optionen nicht markiert > Debugging

0

Ich hatte ein ähnliches Problem, bei dem ich eine C# exe debugging, die meine eigene C++ - DLL über PInvoke, alle Teil der gleichen Lösung aufgerufen. Durch das Debuggen von nativem Code in meinem C# -Projekt konnte ich meinen C++ - Code debuggen.

Verwandte Themen