MDbg.exe (Debuger wiersza polecenia w programie .NET Framework)

Debuger wiersza polecenia programu .NET Framework ułatwia dostawcom narzędzi i deweloperom aplikacji znajdowanie i usuwanie błędów w programach, których platformą docelową jest środowisko uruchomieniowe języka wspólnego programu .NET Framework. To narzędzie używa interfejsu API debugowania środowiska uruchomieniowego w celu dostarczania usług debugowania. Za pomocą programu MDbg.exe można debugować tylko kod zarządzany; debugowanie kodu niezarządzanego jest nieobsługiwane.

To narzędzie jest dostępne za pośrednictwem narzędzia NuGet. Aby uzyskać informacje o instalacji, zobacz MDbg 0.1.0. Aby uruchomić narzędzie, użyj konsoli Menedżer pakietów. Aby uzyskać więcej informacji na temat korzystania z konsoli Menedżer pakietów, zobacz artykuł Menedżer pakietów Console (Konsola Menedżer pakietów).

W wierszu polecenia Menedżer pakietów wpisz następujące polecenie:

Składnia

MDbg [ProgramName[arguments]] [options]

Polecenia

Jeśli jesteś w debugerze (wskazanym przez wiersz polecenia mdbg> ), wpisz jedno z poleceń opisanych w następnej sekcji:

polecenie [argumenty]

W poleceniach programu MDbg.exe jest rozróżniana wielkość liter.

Polecenie opis
ap[rocess] [liczba] Przełącza do innego debugowanego procesu lub drukuje dostępne procesy. Numery nie są rzeczywistymi identyfikatorami procesów (PID), ale numerami liczonymi od zera.
a[ttach] [pid] Dołącza do procesu lub drukuje dostępne procesy.
b[reak] [ClassName.Method | FileName:LineNo] Ustawia punkt przerwania w określonej metodzie. Moduły są skanowane sekwencyjnie.

- breakFileName:LineNo ustawia punkt przerwania w lokalizacji w źródle.
- break~number ustawia punkt przerwania na symbol ostatnio wyświetlany za pomocą polecenia x .
- przerwijmoduł! ClassName.Method+IlOffset ustawia punkt przerwania w w pełni kwalifikowanej lokalizacji.
block[ingObjects] Wyświetla blokady monitora, które blokują wątki.
ca[tch] [exceptionType] Powoduje, że debuger przerywa przy wszystkich wyjątkach, a nie tylko przy nieobsłużonych wyjątkach.
cl[earException] Oznacza bieżący wyjątek jako obsłużony, co umożliwia kontynuowanie wykonywania. Jeśli przyczyna wyjątku nie została usunięta, dany wyjątek może wkrótce zostać zgłoszony ponownie.
conf[ig] [wartość opcji] Wyświetla wszystkie opcje, które można skonfigurować, i pokazuje sposób wywoływania opcji bez wartości dodatkowych. Jeśli jest określona opcja, ustawia value jako bieżącą opcję. Obecnie dostępne są następujące opcje:

- extpath Ustawia ścieżkę do wyszukiwania rozszerzeń, gdy load polecenie jest używane.
- extpath+ Dodaje ścieżkę do ładowania rozszerzeń.
del[ete] Usuwa punkt przerwania.
de[tach] Odłącza od debugowanego procesu.
d[własne] [ramki] Przenosi aktywną ramkę stosu w dół.
Echo Wyświetla komunikat na konsoli.
enableNotif[ication] typeName 0|1 Włącza (1) lub wyłącza (0) niestandardowe powiadomienia dla określonego typu.
ex[it] [exitcode] Kończy działanie powłoki programu MDbg.exe i opcjonalnie określa kod zakończenia procesu.
fo[reach] [OtherCommand] Wykonuje polecenie na wszystkich wątkach. OtherCommand to prawidłowe polecenie, które działa w jednym wątku; foreachOtherCommand wykonuje to samo polecenie we wszystkich wątkach.
f[unceval] [-adNum] functionName [args ... ] Wykonuje ocenę funkcji w bieżącym aktywnym wątku, w którym funkcja do oceny jest functionName. Nazwa funkcji musi być w pełni kwalifikowana i zawierać przestrzenie nazw.

Opcja -ad określa domenę aplikacji, która ma być używana do rozpoznawania funkcji. Jeśli nie określono opcji, domena -ad aplikacji do rozpoznawania jest domyślna dla domeny aplikacji, w której znajduje się wątek używany do oceny funkcji.

Jeśli oceniana funkcja nie jest statyczna, pierwszy przekazany parametr powinien być wskaźnikiem this . Argumenty potrzebne do wykonania funkcji są wyszukiwane we wszystkich domenach aplikacji.

Aby zażądać wartości z domeny aplikacji, prefiks zmiennej z nazwą modułu i domeny aplikacji; na przykład funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef. To polecenie oblicza funkcję System.Object.ToString w domenie 0aplikacji . ToString Ponieważ metoda jest funkcją wystąpienia, pierwszy parametr musi być wskaźnikiemthis.
g[o] Powoduje, że program kontynuuje do czasu napotkania punktu przerwania, zakończenia działania programu lub napotkania zdarzenia (na przykład nieobsłużonego wyjątku) powodującego zatrzymanie programu.
h[elp] [polecenie]

— lub —

? [polecenie]
Wyświetla opis wszystkich poleceń lub szczegółowy opis określonego polecenia.
ig[nore] [event] Powoduje, że debuger zatrzymuje wykonywanie tylko w przypadku nieobsłużonych wyjątków.
int[ercept] FrameNumber Wycofuje debuger z powrotem do ramki o określonym numerze.

Jeśli debuger napotka wyjątek, za pomocą tego polecenia można wycofać debuger do ramki o określonym numerze. Stan programu można zmienić przy użyciu polecenia set i kontynuować za pomocą polecenia go .
k[chory] Zatrzymuje aktywny proces.
l[ist] [modules | appdomains assemblies | ] Wyświetla załadowane moduły, domeny aplikacji lub zestawy.
lo[ad] assemblyName Ładuje rozszerzenie w następujący sposób: Określony zestaw jest ładowany, a następnie podejmowana jest próba uruchomienia metody LoadExtension statycznej z Microsoft.Tools.Mdbg.Extension.Extension typu.
log [eventType] Ustawia lub wyświetla zdarzenia do zarejestrowania.
mo[de] [opcja włączona/wyłączona] Ustawia różne opcje debugera. Użyj mode opcji bez opcji, aby uzyskać listę trybów debugowania i ich bieżących ustawień.
mon[itorInfo] monitorReference Wyświetla informacje o blokadzie monitora obiektów.
newo[bj] typeName [argumenty...] Tworzy nowy obiekt typu typeName.
n[ext] Uruchamia kod i przechodzi do następnego wiersza (nawet jeśli następny wiersz zawiera wiele wywołań funkcji).
OpendumppathToDumpFile Otwiera określony plik zrzutu na potrzeby debugowania.
o[ut] Przechodzi na koniec bieżącej funkcji.
pa[th] [pathName] Wyszukuje pliki źródłowe w określonej ścieżce, jeśli lokalizacja w plikach binarnych jest niedostępna.
p[rint] [var] | [-d] Drukuje wszystkie zmienne w zakresie (drukuj), drukuje określoną zmienną (var wydruku) lub drukuje zmienne debugera (drukowanie-d).
printe[xception] [-r] Drukuje ostatni wyjątek w bieżącym wątku. –r Użyj opcji (rekursywnej), aby przejść przez InnerException właściwość obiektu wyjątku, aby uzyskać informacje o całym łańcuchu wyjątków.
pro[cessenum] Wyświetla aktywne procesy.
q[uit] [exitcode] Zamyka powłokę programu MDbg.exe i opcjonalnie określa kod zakończenia procesu.
re[sume] [* | [~]threadNumber] Wznawia bieżący wątek lub wątek określony przez parametr threadNumber .

Jeśli parametr threadNumber jest określony jako * lub jeśli numer wątku rozpoczyna się od ~, polecenie dotyczy wszystkich wątków z wyjątkiem jednego określonego przez threadNumber.

Wznowienie niewstrzymanego wątku nie przynosi żadnych efektów.
r[un] [-d(ebug) | -o(ptimize) |-enc] [[path_to_exe] [args_to_exe]] Zatrzymuje bieżący proces (jeśli istnieje) i uruchamia nowy. Jeśli nie przekazano argumentu wykonywalnego, to polecenie uruchamia program, który został wcześniej wykonany za run pomocą polecenia . Jeśli dostarczono argument pliku wykonywalnego, określony program zostanie uruchomiony z użyciem opcjonalnie dostarczonych argumentów.

Jeśli zdarzenia ładowania klasy, ładowania modułu i uruchamiania wątku są ignorowane (ustawienie domyślne), program zatrzymuje działanie przy pierwszej instrukcji pliku wykonywalnego w wątku głównym.

Można wymusić, aby debuger wykonał kompilację kodu typu JIT (Just-In-Time), używając jednej z następujących trzech flag:

- -d(ebug) wyłącza optymalizacje. Jest to flaga domyślna programu MDbg.exe.
- -o(ptimize) wymusza uruchomienie kodu w taki sposób, jak poza debugerem, ale także sprawia, że środowisko debugowania jest trudniejsze. Jest to flaga domyślna dla użycia poza debugerem.
- -enc włącza funkcję Edytuj i Kontynuuj, ale powoduje osiągnięcie wydajności.
Ustawianiewartości zmiennej= Zmienia wartość dowolnej zmiennej w zakresie.

Można także tworzyć własne zmienne debugera i przypisywać im wartości referencyjne z poziomu aplikacji. Te wartości pełnią funkcję dojść do oryginalnej wartości, nawet jeśli oryginalna wartość znajduje się poza zakresem. Wszystkie zmienne debugera muszą zaczynać się od $ (na przykład $var). Aby wyczyścić te dojścia, należy ustawić dla nich „nic”, używając następującego polecenia:

set $var=
Setip [-il] liczba Ustawia bieżący wskaźnik instrukcji (IP) w pliku na określonej pozycji. Jeśli określisz -il opcję, liczba reprezentuje przesunięcie wspólnego języka pośredniego (CIL) w metodzie . W przeciwnym wypadku numer reprezentuje numer wiersza źródłowego.
sh[ow] [linie] Określa liczbę wierszy do pokazania.
s[tep] Przenosi wykonywanie do następnej funkcji w bieżącym wierszu lub przechodzi do następnego wiersza, jeśli w danym wierszu nie ma funkcji do wykonania.
su[spend] [* | [~]threadNumber] Zawiesza bieżący wątek lub wątek określony przez parametr threadNumber . Jeśli parametr threadNumber jest określony jako *, polecenie dotyczy wszystkich wątków. Jeśli numer wątku zaczyna się od ~, polecenie ma zastosowanie do wszystkich wątków z wyjątkiem jednego określonego przez threadNumber. Wstrzymane wątki są wykluczone z uruchamiania, gdy proces jest uruchamiany za pomocą polecenia przejdź lub kroku . Jeśli w procesie nie ma żadnych niestrzymowanych wątków i wydasz polecenie go , proces nie będzie kontynuowany. W takim przypadku należy nacisnąć klawisze CTRL-C, aby przerwać działanie procesu.
sy[mbol] commandName [commandValue] Określa jedno z następujących poleceń:

- symbol path ["value"] — wyświetla lub ustawia bieżącą ścieżkę symbolu.
- symbol addpath"value" - Dodaje do bieżącej ścieżki symbolu.
- symbol reload ["module"] — ponownie ładuje wszystkie symbole lub symbole dla określonego modułu.
- symbol list [module] — pokazuje aktualnie załadowane symbole dla wszystkich modułów lub określonego modułu.
t[hread] [newThread] [-pseudonim nicka] Polecenie thread bez parametrów wyświetla wszystkie zarządzane wątki w bieżącym procesie. Wątki są zazwyczaj identyfikowane za pomocą numerów wątków, ale jeśli wątek ma przypisany pseudonim, jest on wyświetlany zamiast numeru. Możesz użyć parametru , -nick aby przypisać pseudonim do wątku.

- threadName-nick przypisuje pseudonim do aktualnie uruchomionego wątku.

Pseudonimy nie mogą być liczbami. Jeśli bieżący wątek ma już przypisany pseudonim, stary pseudonim jest zastępowany nowym. Jeśli nowy pseudonim jest ciągiem pustym (""), pseudonim dla bieżącego wątku jest usuwany, ale do wątku nie jest przypisywany nowy pseudonim.
u[p] Przenosi aktywną ramkę stosu w górę.
uwgc[handle] [var] | [adres] Drukuje zmienną śledzoną przez dojście. Dojście można określić przy użyciu nazwy lub adresu.
Kiedy Wyświetla aktualnie aktywne when instrukcje.

podczasusuwania wszystkich | num [num [num ...]] — Usuwa instrukcję when określoną przez liczbę lub wszystkie when instrukcje, jeśli all jest określona.

kiedystopReason [specific_condition] zrobićcmd [cmd [cmd ...] ] — Parametr stopReason może być jednym z następujących elementów:

StepComplete, ProcessExited, , ThreadCreated, ModuleLoadedRemapOpportunityReachedEvalCompleteAssemblyUnloadedClassLoadedControlCTrappedEvalExceptionBreakpointHitUserBreakAttachCompleteExceptionThrownAssemblyLoadedUnhandledExceptionThrownAsyncStop. NativeStop

specific_condition może być jednym z następujących elementów:

- number — dla ThreadCreated i BreakpointHitwyzwala akcję tylko wtedy, gdy zatrzymana przez numer identyfikatora wątku/punktu przerwania o tej samej wartości.
- [!]name — dla ModuleLoaded, , ClassLoaded, AssemblyUnloadedAssemblyLoaded, ExceptionThrowni UnhandledExceptionThrown, wyzwala akcję tylko wtedy, gdy nazwa jest zgodna z nazwą stopReason.

specific_condition musi być pusta dla innych wartości stopReason.
w[here] [] [-c-vgłębokość] [threadID] Wyświetla informacje debugowania dotyczące ramek stosu.

— Opcja -v zawiera pełne informacje o każdej wyświetlanej ramce stosu.
- Określanie liczby depth limitów liczby wyświetlanych ramek. Użyj wszystkiego polecenia, aby wyświetlić wszystkie ramki. Ustawieniem domyślnym jest 100.
— Jeśli określisz parametr threadID , możesz kontrolować, który wątek jest skojarzony ze stosem. Domyślnie jest to bieżący wątek. Użyj wszystkiego polecenia , aby pobrać wszystkie wątki.
x [-cnumSymbols] [module[!pattern]] Wyświetla funkcje pasujące pattern do modułu.

Jeśli określono wartość numSymbols , dane wyjściowe są ograniczone do określonej liczby. Jeśli ! (wskazujące wyrażenie regularne) nie zostanie określony dla wzorca, zostaną wyświetlone wszystkie funkcje. Jeśli moduł nie zostanie podany, zostaną wyświetlone wszystkie załadowane moduły. Symbole (~#) mogą służyć do ustawiania punktów przerwania za pomocą polecenia przerwania .

Uwagi

Kompilowanie aplikacji przeznaczonej do debugowania z użyciem flag specyficznych dla kompilatora może spowodować, że kompilator wygeneruje symbole debugowania. Więcej informacji na temat tych flag znajduje się w dokumentacji kompilatora. Może debugować zoptymalizowane aplikacje, ale niektóre informacje debugowania będą niedostępne. Na przykład nie będzie widocznych wiele zmiennych lokalnych, a wiersze źródłowe będą niedokładne.

Po skompilowaniu aplikacji wpisz mdbg w wierszu polecenia, aby rozpocząć sesję debugowania, jak pokazano w poniższym przykładzie.

C:\Program Files\Microsoft Visual Studio 8\VC>mdbg
MDbg (Managed debugger) v2.0.50727.42 (RTM.050727-4200) started.
Copyright (C) Microsoft Corporation. All rights reserved.

For information about commands type "help";
to exit program type "quit".
mdbg>

Monit mdbg> wskazuje, że jesteś w debugerze.

Po otwarciu debugera można używać poleceń i argumentów opisanych w poprzedniej sekcji.

Zobacz też