Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ladění aplikace je jednodušší, pokud můžete analyzovat zdroj kódu místo rozebraných binárních souborů.
WinDbg, CDB a KD mohou v ladění používat zdrojový kód, pokud je zdrojový jazyk C, C++ nebo assembler.
požadavky na kompilaci
Chcete-li použít ladění zdroje, musíte zajistit, aby váš kompilátor nebo linker vytvořil soubory symbolů (.pdb soubory) při sestavování binárních souborů. Tyto soubory symbolů ukazují debuggeru, jak binární instrukce odpovídají zdrojovým řádkům.
Ladicí program také musí mít přístup ke skutečným zdrojovým souborům, protože soubory symbolů neobsahují skutečný zdrojový text.
Pokud je to možné, kompilátor a linker by neměly váš kód optimalizovat. Ladění zdroje a přístup k místním proměnným jsou obtížnější a někdy téměř nemožné, pokud byl kód optimalizován. Pokud jako kompilátor a linker používáte nástroj Build, nastavte makro MSC_OPTIMIZATION na /Od /Oi, aby se zabránilo optimalizaci.
vyhledání souborů symbolů a zdrojových souborů
Pokud chcete ladit ve zdrojovém režimu, musí být ladicí program schopný najít zdrojové soubory a soubory symbolů. Další informace naleznete v tématu cesta zdroje.
Zahájení ladění zdrojového kódu
Ladicí program může zobrazit informace o zdroji, kdykoli má správné symboly a zdrojové soubory pro vlákno, které se právě ladí.
Když spustíte novou aplikaci v uživatelském režimu s pomocí ladicího programu, dojde k počátečnímu přerušení, když Ntdll.dll načte aplikaci. Vzhledem k tomu, že ladicí program nemá přístup ke zdrojovým souborům Ntdll.dll, nemůžete v tuto chvíli získat přístup ke zdrojovým informacím pro vaši aplikaci.
Chcete-li přesunout čítač programu na začátek aplikace, přidejte zarážku ke vstupnímu bodu binárního souboru. V příkazovém okně ladicího programuzadejte následující příkaz.
bp main
g
Aplikace se pak načte a zastaví, když je zadána hlavní funkce. (Samozřejmě můžete použít jakýkoli vstupní bod, nejen hlavní.)
Pokud aplikace vyvolá výjimku, přeruší se do ladicího programu. Informace o zdroji jsou v tuto chvíli k dispozici. Pokud však přerušíte program pomocí CTRL+C, CTRL+BREAKnebo Debug | Přerušit příkaz, ladicí program vytvoří nové vlákno, takže nemůžete vidět zdrojový kód.
Po dosažení vlákna, pro které máte zdrojové soubory, můžete pomocí příkazového okna ladicího programu spustit příkazy ladění zdroje. Pokud používáte WinDbg, zobrazí se okno Zdroj. Pokud jste již otevřeli okno Zdroj kliknutím na Open Source File v nabídce File, WinDbg obvykle vytvoří nové okno pro zdroj. Předchozí okno můžete zavřít, aniž by to mělo vliv na proces ladění.
ladění zdrojového kódu v grafickém uživatelském rozhraní WinDbg
Pokud používáte WinDbg, zobrazí se okno se zdrojovým kódem, jakmile čítač programu vstoupí do kódu, pro který má ladicí program zdrojové informace.
WinDbg zobrazí jedno okno Zdroj pro každý zdrojový soubor, který jste otevřeli vy nebo WinDbg. Další informace o vlastnostech textu tohoto okna naleznete v tématu Zdrojový systém Windows.
Pak můžete procházet svou aplikaci nebo spustit až k zarážce nebo kursoru. Další informace o provádění kroků a trasování příkazů viz Řízení cílového.
Pokud jste ve zdrojovém režimu, při procházení aplikace se příslušné okno Zdroj přesune na popředí. Vzhledem k tomu, že existují také rutiny systému Microsoft Windows, které jsou volány během provádění aplikace, ladicí program může přesunout okno zpětného překladu do popředí, když dojde k tomuto druhu volání (protože ladicí program nemá přístup ke zdroji těchto funkcí). Když se čítač programu vrátí do známých zdrojových souborů, aktivuje se příslušné okno Zdroj.
Při procházení aplikace WinDbg zvýrazní vaše umístění v okně se zdrojovým kódem a v okně srozborem. Řádky, na kterých jsou nastaveny zarážky, jsou také zvýrazněny. Zdrojový kód se vybarví podle analýzy jazyka. Pokud jste vybrali okno Zdroj, můžete ho vyhodnotit tak, že najedete myší na symbol. Další informace o těchto funkcích a o tom, jak je ovládat, naleznete v tématu Zdrojový systém Windows.
Pokud chcete ve WinDbg aktivovat zdrojový režim, použijte příkaz l+t, v nabídce ladění režim zdroje, nebo klikněte na tlačítko zdrojového režimu na. Když je zdrojový režim aktivní, indikátor ASM se na stavovém řádku jeví jako nedostupný.
Při procházení funkce ve zdrojovém režimu můžete zobrazit nebo změnit hodnoty všech místních proměnných. Další informace najdete v Čtení a zápis paměti.
Ladění zdrojového kódu v příkazovém okně debuggeru
Pokud používáte CDB, nemáte samostatné okno Zdroj. Během procházení zdroje si ale můžete průběh stále prohlédnout.
Než budete moct provést ladění zdroje v CDB, musíte načíst symboly zdrojového řádku vydáním příkazu .lines (Přepnout podporu zdrojového řádku) nebo spuštěním ladicího programu s příkazem příkazového řádku -lines.
Pokud spustíte příkaz l+t, všechny krokování programu se provádí vždy po jednom zdrojovém řádku. Pomocí l-t provádějte jednotlivé instrukce sestavení jednu po druhé. Pokud používáte WinDbg, má tento příkaz stejný účinek jako výběr nebo vymazání zdrojového režimu v nabídce Ladění nebo pomocí tlačítek panelu nástrojů.
Příkaz l+s zobrazí aktuální zdrojový řádek a číslo řádku na příkazovém řádku. Pokud chcete zobrazit jenom číslo řádku, použijte místo toho l+l.
Pokud používáte l+o a l+s, zobrazí se při procházení programu pouze zdrojový řádek. Čítač programu, disassemblovaný kód a informace o registrech jsou skryté. Tento druh zobrazení umožňuje rychle procházet kód a zobrazit nic jiného než zdroj.
Pomocí příkazulsp (Nastavit počet zdrojových řádků) můžete přesně určit, kolik zdrojových řádků se zobrazí při procházení nebo spuštění aplikace.
Následující posloupnost příkazů představuje efektivní způsob, jak procházet zdrojový soubor.
.lines enable source line information
bp main set initial breakpoint
l+t stepping will be done by source line
l+s source lines will be displayed at prompt
g run program until "main" is entered
pr execute one source line, and toggle register display off
p execute one source line
Protože ENTER opakuje poslední příkaz, můžete teď procházet aplikaci pomocí klávesy ENTER. Každý krok způsobí, že se zobrazí zdrojový řádek, posun paměti a kód sestavení.
Další informace o tom, jak interpretovat zobrazení disassembly, naleznete v Ladění v režimu sestavení.
Při zobrazení kódu sestavení se na pravém konci řádku zobrazí jakékoli umístění paměti, ke kterému se přistupuje. K zobrazení nebo změně hodnot v těchto místech můžete použít příkazy d* (Zobrazit paměť) a e* (Zadat hodnoty).
Pokud potřebujete zobrazit jednotlivé instrukce assembleru k určení posunů nebo informací o paměti, použijte l-t k pohybu po instrukcích assembleru místo zdrojových řádků. Informace o zdrojovém řádku se stále dají zobrazit. Každý zdrojový řádek odpovídá jednomu nebo více instrukcím sestavení.
Všechny tyto příkazy jsou k dispozici v WinDbg a v CDB. Příkazy můžete použít k zobrazení informací o zdrojovém řádku z příkazového okna ladicího programu WinDbg místo z okna Zdroj.
zdrojových čar a posunů
Zdroj můžete také ladit použitím vyhodnocování výrazů, abyste určili posun odpovídající konkrétnímu řádku ve zdrojovém kódu.
Následující příkaz zobrazí posun paměti.
? `[[module!]filename][:linenumber]`
Pokud vynecháte název souboru, ladicí program vyhledá zdrojový soubor, který odpovídá aktuální hodnotě programového čítače.
Ladicí program čte číslo řádku jako desetinné číslo, pokud před něj nepřidáte 0x bez ohledu na aktuální výchozí radix. Pokud vynecháte , výraz se vyhodnotí na počáteční adresu spustitelného souboru, který odpovídá zdrojovému souboru.
Tato syntaxe je v CDB srozumitelná jenom v případě, že příkaz .lines nebo možnost příkazového řádku -lines načetla symboly zdrojového řádku.
Tato technika je velmi všestranná, protože ji můžete použít bez ohledu na to, kde čítač programu ukazuje. Tato technika vám například umožňuje nastavit body přerušení předem pomocí příkazů, jako jsou následující.
bp `source.c:31`
Další informace najdete v tématu Syntaxe zdrojového řádku a Použití zarážek.
Kroky a sledování ve zdrojovém režimu
Při ladění ve zdrojovém režimu může na jednom zdrojovém řádku existovat více volání funkce. K oddělení těchto volání funkce nelze použít příkazy p a t.
Například v následujícím příkazu přejde příkaz t do funkcí GetTickCount i printf, zatímco příkaz p přeskakuje obě volání funkcí.
printf( "%x\n", GetTickCount() );
Pokud chcete přeskakovat určité volání při trasování do jiných volání, použijte .step_filter (Nastavit filtr kroku) k určení, která volání přeskočit.
Pomocí _step_filter můžete vyfiltrovat funkce rozhraní (například Microsoft Foundation Classes (MFC) nebo volání knihovny ATL (Active Template Library).