2009-10-12 13 views
8

Mój kod C# wywołuje niezarządzaną funkcję biblioteki innej firmy za pośrednictwem P/Invoke, a funkcja niezarządzana wywołuje dziwne efekty uboczne. Chcę debugować i zobaczyć, co robi.Przechodzenie do wywołania P/Invoke w widoku rozmontowania

Jeśli debuguję mój kod C# i spróbuję "Wejść do" wywołania P/Invoke, to zamiast tego przechodzi on dalej. Nic dziwnego - spodziewałem się tego; nie ma źródła dla tej biblioteki DLL, a ja nie powiedziałem, że nie miałem nic przeciwko zobaczeniu widoku demontażu.

Przełączam debugger do widoku demontażu (Debugowanie> Windows> Demontaż). Teraz widzę poszczególne instrukcje x86 w moim kodzie JIT. Ponownie próbuję wejść do wywołania P/Invoke. I znowu, zamiast tego, zamiast tego, krok po kroku przechodzi - mimo że wyraźnie powiedziałem, aby przejść do instrukcji CALL x86. Jak trudno jest wkroczyć do CALL X86?

My Googling dotąd pokazało mi kilka opcji, które mogą mieć wpływ na to, a ja już je ustawić:

  • W menu Narzędzia> Opcje> debugowania> ogólne „Włącz Just My CODE” niepowstrzymany.
  • W zakładce Projekt> Właściwości> Usuwanie błędów zaznaczono opcję "Włącz debugowanie niezarządzanego kodu".

Nic dobrego. Visual Studio nadal nie chce wkroczyć.

Nie mam PDB dla biblioteki DLL innej firmy, ale to nie powinno mieć znaczenia. Nie dbam o kod źródłowy ani informacje o symbolu. (Cóż, w rzeczywistości byłyby naprawdę fajne, ale już wiem, że ich nie otrzymam.) Visual Studio może przeprowadzić debugowanie x86 (to jest to, co do widoku Disassembly jest dla), a wszystko, co chcę zrobić, to przejdź do kodu x86.

Co jeszcze należy zrobić, aby system VS zezwolił na wykonanie instrukcji x86 w ramach wywołania P/Invoke?

+0

Czy kiedykolwiek to rozgryzłeś? – Dennis

+1

Minęło kilka lat, odkąd próbowałem to zrobić, ale jak pamiętam, nie, nigdy nie udało mi się go uruchomić. –

Odpowiedz

1

Jedna rzecz, którą chciałbym wypróbować, to przejście z kodu C# do C++/CLI, a następnie z C++ do kodu innej firmy. Po przejściu w C++ (i wolnej od infrastruktury P/Invoke) możesz mieć więcej szczęścia w widoku demontażu.

+1

Wiem prawie nic o pisaniu kodu C++/CLI ... mam jakieś linki, które mogłyby pomóc mi zacząć od tej strategii? –

4

This może pomóc w rozwiązaniu problemu: (przez graviton)

CallingConvention = CallingConvention.Cdecl 

także this wspomina, że ​​trzeba odłączyć zarządzaną debugger i ponownie załączyć niekontrolowana podczas przekraczania granic. Może być konieczne sprawdzenie możliwości mieszanego debuggera i jego preferencji z MSDN.

I wreszcie, korzystając Ed Dore' odpowiedź:

ramach dialogu Tools.Options wybierz kategorię debugowania, i upewnij się, "Włącz Just My Code" ustawienie jest niezaznaczone. Z właściwości Project wybierz kartę Debuguj i , a następnie upewnij się, że zaznaczone jest "Enable unmanaged code debugging".

Po usunięciu kwadratu, , powinieneś uzyskać wsparcie dla trybu mieszanego .

Również, jeśli używasz "Debugowanie.Dołączyć do Procesie”, należy uderzyć "Wybierz ..." przycisk w "Attach to Process oknie" i wybrać zarówno zarządzany i Natywna obsługa debugowania.

+0

Żadna z nich nie pomoże w wywołaniach metod ramowych w VS2017/Win10 :( –

1

w twojej C# właściwości projektu w zakładce Debug sprawdzić Włącz kodu natywnego debugowanie. pracował dla mnie w VS 2012.

zasługa billb.

Ponadto, ponieważ jest to biblioteka strona trzecia, zapewniają Włącz Just My Code jest zaznaczone w opcjach > Debugowanie:

0

Miałem podobny problem, gdy debugowałem C# exe, który wywołał moją własną bibliotekę C++ za pośrednictwem PInvoke, wszystkie części tego samego rozwiązania. Włączenie debugowania kodu natywnego w moim projekcie C# pozwoliło mi na debugowanie mojego kodu C++.