Delen via


Het vermijden van foutopsporingsprogramma's die zoeken naar onnodige symbolen

Laatst bijgewerkt:

  • 27 mei 2007

U bereikt een interessant breakpoint bij het debuggen van uw stuurprogramma, alleen om te ontdekken dat de debugger een zeer lange tijd pauzeert terwijl hij probeert symbolen te laden voor stuurprogramma's die u niet bezit en die voor de huidige foutopsporingstaak niet relevant zijn. Wat gebeurt er?

Symbolen worden standaard geladen door het foutopsporingsprogramma wanneer ze nodig zijn. (Dit wordt het laden van uitgestelde symbolen of het laden van luie symbolen genoemd.) Het foutopsporingsprogramma zoekt naar symbolen wanneer er een opdracht wordt uitgevoerd die de weergave van symbolen aanroept. Dit kan gebeuren op een onderbrekingspunt als u een horlogevariabele hebt ingesteld die niet geldig is in de huidige context, zoals een functieparameter of lokale variabele die niet bestaat in het huidige stackframe, omdat deze ongeldig worden wanneer de context verandert. Het kan ook gebeuren als u gewoon een symboolnaam verkeerd typt of een ongeldige foutopsporingsprogramma-opdracht uitvoert. Het foutopsporingsprogramma zoekt naar een overeenkomend symbool.

Waarom duurt dit soms zo lang? Dat hangt af van of de symboolnaam gekwalificeerd of niet-gekwalificeerd is. Een gekwalificeerde symboolnaam wordt voorafgegaan door de naam van de module die het symbool bevat, bijvoorbeeld myModule!myVar. Een niet-gekwalificeerde symboolnaam geeft geen modulenaam op, bijvoorbeeld myOtherVar.

In het geval van de gekwalificeerde naam zoekt de debugger naar het symbool in de opgegeven module en, als de module nog niet is geladen, laadt het de module (ervan uitgaande dat de module bestaat en het symbool bevat). Dit gebeurt vrij snel.

In het geval van een niet-gekwalificeerde naam weet de debugger niet welke module het symbool bevat, dus moet het in allemaal zoeken. Het foutopsporingsprogramma controleert eerst alle geladen modules voor het symbool en als het niet overeenkomt met het symbool in een geladen module, gaat het foutopsporingsprogramma verder met het zoeken door alle niet-geladen modules te laden, te beginnen met het downstreamarchief en eindigend met de symboolserver, als u er een gebruikt. Dit kan natuurlijk veel tijd in beslag nemen.

Het automatisch laden van niet-gekwalificeerde symbolen voorkomen

Met de optie SYMOPT_NO_UNQUALIFIED_LOADS wordt het automatisch laden van modules van het foutopsporingsprogramma uitgeschakeld of ingeschakeld wanneer er wordt gezocht naar een niet-gekwalificeerd symbool. Wanneer SYMOPT_NO_UNQUALIFIED_LOADS is ingesteld en het foutopsporingsprogramma probeert overeen te komen met een niet-gekwalificeerd symbool, wordt alleen gezocht naar modules die al zijn geladen en wordt er niet meer gezocht wanneer het symbool niet overeenkomt met het symbool, in plaats van niet-geladen modules te laden om door te gaan met zoeken. Deze optie heeft geen invloed op het zoeken naar gekwalificeerde namen.

SYMOPT_NO_UNQUALIFIED_LOADS is standaard uitgeschakeld. ** Als u deze optie wilt activeren, gebruikt u de opdrachtregeloptie -snul. Terwijl de debugger actief is, gebruikt u .symopt+0x100 of .symopt-0x100 om de optie in- of uit te schakelen.

Als u het effect van SYMOPT_NO_UNQUALIFIED_LOADSwilt zien, probeert u dit experiment:

  1. nl-NL: Activeer het laden van 'noisy symbols' (SYMOPT_DEBUG) met de opdrachtregeloptie -n, of, als de debugger al actief is, gebruik .symopt+0x80000000 of de debuggerextensieopdracht !sym noisy. SYMOPT_DEBUG geeft het foutopsporingsprogramma opdracht om informatie weer te geven over het zoeken naar symbolen, zoals de naam van elke module die wordt geladen of een foutbericht als het foutopsporingsprogramma geen bestand kan vinden.
  2. Geef het foutopsporingsprogramma de opdracht om een niet-bestaand symbool te evalueren (typ bijvoorbeeld ?asdasdasd). Het foutopsporingsprogramma moet talloze fouten rapporteren terwijl er wordt gezocht naar het niet-bestaande symbool.
  3. Activeer SYMOPT_NO_UNQUALIFIED_LOADS met behulp van .symopt+0x100.
  4. Herhaal stap 2. Het foutopsporingsprogramma mag alleen in geladen modules zoeken voor het niet-bestaande symbool en de taak moet veel sneller worden voltooid.
  5. Als u SYMOPT_DEBUGwilt uitschakelen, gebruikt u .symopt-0x80000000 of de opdracht !sym quiet debugger-extensie.

Er zijn verschillende opties beschikbaar om te bepalen hoe de symbolen door het foutopsporingsprogramma worden geladen en gebruikt. Zie 'Symboolopties instellen' in de onlinedocumentatie van Hulpprogramma's voor Foutopsporing voor Windows voor een volledige lijst met symboolopties en hoe u deze kunt gebruiken. De nieuwste versie van het pakket Foutopsporingsprogramma's voor Windows is beschikbaar als gratis download van internet of u kunt het pakket installeren via de cd windows DDK, platform-SDK of klantondersteuningsdiagnose.

Wat moet je doen?

  • Als u het zoeken van symbolen wilt versnellen, gebruikt u waar mogelijk gekwalificeerde namen in onderbrekingspunten en foutopsporingsprogrammaopdrachten. Als u een symbool uit een bekende module wilt zien, kwalificeer het met de naam van de module; als u niet weet waar het symbool zich bevindt, gebruikt u een onvolledige naam. Voor lokale variabelen en functieargumenten gebruikt u $ als modulenaam (bijvoorbeeld $! MyVar).
  • Als u de oorzaken van het langzaam laden van symbolen wilt diagnosticeren, activeert u het laden van noisy symbolen (SYMOPT_DEBUG) met behulp van de opdrachtregeloptie -n of, als de debugger al draait, met behulp van .symopt+0x80000000 of de debugger extensieopdracht !sym noisy.
  • Als u wilt voorkomen dat het foutopsporingsprogramma zoekt naar symbolen in niet-geladen modules, activeert u SYMOPT_NO_UNQUALIFIED_LOADS met behulp van de -snul opdrachtregeloptie of, als het foutopsporingsprogramma al wordt uitgevoerd, met behulp van .symopt+0x100.
  • Als u de modules die u nodig hebt voor uw foutopsporingssessie expliciet wilt laden, gebruikt u opdrachten voor foutopsporingsprogramma's zoals .reload of ld.

Zie ook

Download de WDK

Hulpprogramma's voor foutopsporing voor Windows

Aan de slag met Windows-foutopsporing