Sdílet prostřednictvím


Zamezení vyhledávání nepotřebných symbolů při ladění

Poslední aktualizace:

  • 27. května 2007

Při ladění ovladače se dostanete na zajímavou zarážku, jen aby se ladicí program velmi dlouho zastavil, zatímco se snaží načíst symboly pro ovladače, které nevlastníte a které nejsou důležité pro aktuální úkol ladění. Co se děje?

Ve výchozím nastavení jsou symboly načteny ladicím programem podle potřeby. (Označuje se jako odložené načítání symbolů nebo opožděné načítání symbolů.) Ladicí program hledá symboly pokaždé, když spustí příkaz, který volá zobrazení symbolů. K tomu může dojít při zarážce, pokud jste nastavili sledovací proměnnou, která není platná v aktuálním kontextu, například parametr funkce nebo místní proměnná, která neexistuje v aktuálním zásobníkovém rámci, protože se při změně kontextu stávají neplatnými. Může k tomu dojít také v případě, že jednoduše nesprávně zadáte název symbolu nebo spustíte neplatný příkaz ladicího programu– ladicí program začne hledat odpovídající symbol.

Proč to někdy trvá tak dlouho? To závisí na tom, zda je název symbolu kvalifikovaný nebo nekvalifikovaný. Kvalifikovaný název symbolu je předchází názvem modulu, který obsahuje daný symbol – například myModule!myVar. Nekvalifikovaný název symbolu, jako například myOtherVar, nezadává název modulu.

V případě kvalifikovaného názvu ladicí program vyhledá symbol v zadaném modulu a pokud modul ještě není načtený, načte modul (za předpokladu, že modul existuje a obsahuje symbol). K tomu dochází poměrně rychle.

V případě nekvalifikovaného názvu ladicí program neví, který modul obsahuje symbol, proto musí hledat ve všech modulech. Ladicí program nejprve zkontroluje všechny načtené moduly pro symbol a pokud nenalezne symbol v žádném z načtených modulů, pokračuje ve vyhledávání načtením všech nenačtených modulů, počínaje sestupným úložištěm až po server symbolů, pokud nějaký používáte. Očividně to může trvat hodně času.

Jak zabránit automatickému načítání nekvalifikovaných symbolů

Možnost SYMOPT_NO_UNQUALIFIED_LOADS zakáže nebo povolí automatické načítání modulů ladicího programu při hledání nekvalifikovaného symbolu. Když je SYMOPT_NO_UNQUALIFIED_LOADS nastaven a ladicí program se pokusí spárovat nekvalifikovaný symbol, prohledá pouze moduly, které už byly načteny, a zastaví hledání, když nemůže symbol přiřadit, místo aby načítal nenahrané moduly k pokračování v hledání. Tato možnost nemá vliv na hledání kvalifikovaných názvů.

SYMOPT_NO_UNQUALIFIED_LOADS je ve výchozím nastavení vypnutá. Pokud chcete tuto možnost aktivovat, použijte možnost příkazového řádku -snul nebo, pokud je ladicí program spuštěný, pomocí .symopt+0x100 nebo .symopt-0x100 tuto možnost zapněte nebo vypněte.

Pokud chcete zobrazit účinek SYMOPT_NO_UNQUALIFIED_LOADS, vyzkoušejte tento experiment:

  1. Aktivujte načítání hlučného symbolu (SYMOPT_DEBUG) pomocí možnosti příkazového řádku -n nebo, pokud už ladicí program běží, použijte .symopt+0x80000000 nebo příkaz rozšíření ladicího programu !sym noisy . SYMOPT_DEBUG dává ladicímu programu pokyn, aby zobrazil informace o jeho hledání symbolů, například název každého modulu při jeho načtení, nebo chybovou zprávu, pokud ladicí program nemůže najít soubor.
  2. Řekněte ladicímu programu, aby vyhodnotil neexistující symbol (například zadejte ?asdasdasd). Ladicí program by měl hlásit řadu chyb, když hledá neexistující symbol.
  3. Aktivujte SYMOPT_NO_UNQUALIFIED_LOADS pomocí souboru .symopt+0x100.
  4. Opakujte krok 2. Ladicí program by měl hledat neexistující symbol pouze v načtených modulech a měl by úkol dokončit mnohem rychleji.
  5. Pokud chcete zakázat SYMOPT_DEBUG, použijte příkaz .symopt-0x80000000 nebo příkaz rozšíření ladicího programu .sym quiet .

Existuje řada možností, jak ovládat způsob, jakým ladicí program načítá a používá symboly. Úplný seznam možností symbolů a jejich použití najdete v části Nastavení možností symbolů v online dokumentaci, která je součástí nástrojů pro ladění pro Windows. Nejnovější verze balíčku Nástroje pro ladění pro Windows je k dispozici jako bezplatná verze ke stažení z webu nebo můžete balíček nainstalovat z disku CD SDK, sady SDK platformy nebo diagnostiky zákaznické podpory.

Co byste měli dělat?

  • Pokud chcete urychlit vyhledávání symbolů, použijte kvalifikované názvy v zarážkách a příkazech ladicího programu, kdykoli je to možné. Pokud chcete zobrazit symbol ze známého modulu, specifikujte ho názvem modulu; pokud nevíte, kde se symbol nachází, použijte nekvalifikovaný název. Pro místní proměnné a argumenty funkce použijte $ jako název modulu (například $! MyVar).
  • Chcete-li diagnostikovat příčiny pomalého načítání symbolů, aktivujte načítání hlučných symbolů (SYMOPT_DEBUG) pomocí možnosti příkazového řádku -n nebo pokud ladicí program již běží, pomocí .symopt+0x80000000 nebo příkazu rozšíření ladicího programu !sym noisy .
  • Chcete-li zabránit ladicímu programu v hledání symbolů v uvolněných modulech, aktivujte SYMOPT_NO_UNQUALIFIED_LOADS pomocí možnosti příkazového řádku -snul nebo pokud je ladicí program již spuštěný, pomocí .symopt+0x100.
  • Pokud chcete explicitně načíst moduly, které potřebujete při ladění, použijte příkazy ladicího programu, například .reload nebo ld.

Viz také

Stažení sady WDK

nástroje pro ladění pro Windows

Začínáme s laděním windows