Delen via


Foutopsporing in de bronmodus

Het opsporen van fouten in een toepassing is eenvoudiger als u de bron van de code kunt analyseren in plaats van de gedemonteerde binaire bestanden.

WinDbg, CDB en KD kunnen broncode gebruiken bij foutopsporing, als de brontaal C, C++ of assembly is.

Compilatievereisten

Als u bronopsporing wilt gebruiken, moet u ervoor zorgen dat uw compiler of linker symboolbestanden (.pdb-bestanden) maakt wanneer de binaire bestanden worden gebouwd. Deze symboolbestanden tonen het foutopsporingsprogramma hoe de binaire instructies overeenkomen met de bronlijnen.

Het foutopsporingsprogramma moet ook toegang hebben tot de werkelijke bronbestanden, omdat symboolbestanden niet de werkelijke brontekst bevatten.

Als dit mogelijk is, moeten de compiler en linker uw code niet optimaliseren. Bronopsporing en toegang tot lokale variabelen zijn moeilijker en soms bijna onmogelijk, als de code is geoptimaliseerd. Als u het hulpprogramma Build als compiler en linker gebruikt, stelt u de MSC_OPTIMIZATION macro in op /Od/Oi om optimalisatie te voorkomen.

De symboolbestanden en bronbestanden zoeken

Als u fouten wilt opsporen in de bronmodus, moet het foutopsporingsprogramma de bronbestanden en de symboolbestanden kunnen vinden. Zie bronpadvoor meer informatie.

Bronopsporing starten

Het foutopsporingsprogramma kan brongegevens weergeven wanneer deze de juiste symbolen en bronbestanden bevat voor de thread die momenteel wordt opgespoord.

Als u een nieuwe toepassing in de gebruikersmodus start met behulp van het foutopsporingsprogramma, treedt het eerste onderbrekingseinde op wanneer Ntdll.dll de toepassing laadt. Omdat het foutopsporingsprogramma geen toegang heeft tot de Ntdll.dll bronbestanden, hebt u op dit moment geen toegang tot brongegevens voor uw toepassing.

Als u de programmateller naar het begin van de toepassing wilt verplaatsen, voegt u een onderbrekingspunt toe aan het toegangspunt aan uw binaire bestand. Typ de volgende opdracht in het opdrachtvenster Foutopsporingsprogramma.

bp main
g

De toepassing wordt vervolgens geladen en stopt wanneer de hoofdfunctie wordt ingevoerd. (Natuurlijk kunt u elk toegangspunt gebruiken, niet alleen hoofdpunt.)

Als de toepassing een uitzondering genereert, breekt deze in het foutopsporingsprogramma. Broninformatie is op dit moment beschikbaar. Als u echter een onderbreking geeft met CTRL+C, CTRL+BREAK of de opdracht Debug | Break, maakt de debugger een nieuwe thread aan, zodat u de broncode niet kunt zien.

Nadat u een thread hebt bereikt waarvoor u bronbestanden hebt, kunt u het opdrachtvenster Debugger gebruiken om bronopsporingsopdrachten uit te voeren. Als u WinDbg gebruikt, wordt het venster Bron weergegeven. Als u al een bronvenster hebt geopend door in het menu Bestand op Open Source-bestand te klikken, maakt WinDbg doorgaans een nieuw venster voor de bron. U kunt het vorige venster sluiten zonder dat dit van invloed is op het foutopsporingsproces.

Bronopsporing in de WinDbg-GUI

Als u WinDbg gebruikt, wordt er een bronvenster weergegeven zodra de programmateller code bevat waarvoor het foutopsporingsprogramma brongegevens bevat.

WinDbg geeft één bronvenster weer voor elk bronbestand dat u of WinDbg hebt geopend. Zie Bronvensters voor meer informatie over de teksteigenschappen van dit venster.

Vervolgens kunt u uw toepassing doorlopen of uitvoeren naar een onderbrekingspunt of naar de cursor. Zie Het doel beheren voor meer informatie over het uitvoeren en traceren van opdrachten.

Als u zich in de bronmodus bevindt, wordt het juiste bronvenster naar de voorgrond verplaatst terwijl u uw toepassing doorloopt. Omdat er ook Microsoft Windows-routines worden aangeroepen tijdens de uitvoering van de toepassing, kan het foutopsporingsprogramma een demontagevenster naar de voorgrond verplaatsen wanneer dit soort aanroep plaatsvindt (omdat het foutopsporingsprogramma geen toegang heeft tot de bron voor deze functies). Wanneer de programmateller terugkeert naar bekende bronbestanden, wordt het juiste bronvenster actief.

Terwijl u door de toepassing bladert, markeert WinDbg uw locatie in het bronvenster en het venster Demontage. Lijnen waarop onderbrekingspunten zijn ingesteld, worden ook gemarkeerd. De broncode is gekleurd op basis van de parsering van de taal. Als het bronvenster is geselecteerd, kunt u met de muis over een symbool bewegen om het te evalueren. Zie Bronvensters voor meer informatie over deze functies en hoe u ze kunt beheren.

Als u de bronmodus in WinDbg wilt activeren, gebruikt u de opdracht l+t , klikt u op de bronmodus in het foutopsporingsmenu of klikt u op de bronmodus op de knop. Wanneer de bronmodus actief is, wordt de ASM-indicator op de statusbalk als niet beschikbaar weergegeven.

U kunt de waarden van lokale variabelen bekijken of wijzigen tijdens het doorlopen van een functie in de bronmodus. Zie Lees- en schrijfgeheugen voor meer informatie.

Bronfoutopsporing in het debugger-commandovenster

Als u CDB gebruikt, hebt u geen afzonderlijk bronvenster. U kunt uw voortgang echter nog steeds bekijken terwijl u de bron doorloopt.

Voordat u bronopsporing in CDB kunt uitvoeren, moet u bronregelsymbolen laden door de opdracht .lines (Toggle Source Line Support) uit te geven of door het foutopsporingsprogramma te starten met de opdrachtregeloptie -lines.

Als u een l+t-opdracht uitvoert, wordt alle programmastap één bronregel tegelijk uitgevoerd. Gebruik l-t om één montage-instructie tegelijk uit te voeren. Als u WinDbg gebruikt, heeft deze opdracht hetzelfde effect als het selecteren of wissen van de bronmodus in het menu Foutopsporing of met behulp van de werkbalkknoppen.

Met de opdracht l+s worden de huidige bronregel en het regelnummer in de prompt weergegeven. Als u alleen het regelnummer wilt zien, gebruikt u in plaats daarvan l+l .

Als u l+o en l+s gebruikt, wordt alleen de bronregel weergegeven terwijl u het programma doorloopt. De programmateller, demontagecode en registergegevens zijn verborgen. Met dit type weergave kunt u snel de code doorlopen en niets behalve de bron bekijken.

U kunt de opdracht lsp (Set Number of Source Lines) gebruiken om precies op te geven hoeveel bronlijnen worden weergegeven wanneer u de toepassing doorloopt of uitvoert.

De volgende reeks opdrachten is een effectieve manier om een bronbestand te doorlopen.

.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 

Omdat ENTER de laatste opdracht herhaalt, kunt u nu de toepassing doorlopen met behulp van de ENTER-toets. Elke stap zorgt ervoor dat de bronregel, het geheugenverschil en de assemblycode worden weergegeven.

Zie Foutopsporing in de assemblymodus voor meer informatie over het interpreteren van de demontageweergave.

Wanneer de assemblycode wordt weergegeven, wordt elke geheugenlocatie die wordt geopend, weergegeven aan de rechterkant van de regel. U kunt de opdrachten d* (Geheugen weergeven) en e* (Waarden invoeren) gebruiken om de waarden op deze locaties weer te geven of te wijzigen.

Als u elke assembly-instructie moet bekijken om offsets of geheugengegevens te bepalen, gebruikt u l-t om stapsgewijze instructies te volgen in plaats van bronlijnen. De bronregelinformatie kan nog steeds worden weergegeven. Elke bronregel komt overeen met een of meer assembly-instructies.

Al deze opdrachten zijn beschikbaar in WinDbg en in CDB. U kunt de opdrachten gebruiken om informatie over de bronregel weer te geven in het opdrachtvenster van de debugger van WinDbg in plaats van vanuit het bronvenster.

Bronlijnen en offsets

U kunt ook bronopsporing uitvoeren met behulp van de expressie-evaluator om de offset te bepalen die overeenkomt met een specifieke bronregel.

De volgende opdracht geeft een geheugenoffset weer.

? `[[module!]filename][:linenumber]` 

Als u de bestandsnaam weglaat, zoekt het foutopsporingsprogramma naar het bronbestand dat overeenkomt met de huidige programmateller.

Het foutopsporingsprogramma leest het regelnummer als een decimaal getal, tenzij u 0x ervoor toevoegt, ongeacht de huidige standaard radix. Als u regelnummer weglaat, resulteert de expressie in het oorspronkelijke adres van het uitvoerbare bestand dat overeenkomt met het bronbestand.

Deze syntaxis wordt alleen in CDB begrepen als de opdracht .lines of de opdrachtregeloptie -lines bronregelsymbolen heeft geladen.

Deze techniek is zeer veelzijdig, omdat u deze kunt gebruiken, ongeacht waar de programmateller wijst. Met deze techniek kunt u bijvoorbeeld vooraf onderbrekingspunten instellen met behulp van opdrachten zoals de volgende.

bp `source.c:31` 

Zie De syntaxis van de bronregel en het gebruik van onderbrekingspunten voor meer informatie.

Stappen en volgen in de bronmodus

Wanneer u foutopsporing in de bronmodus gebruikt, kunnen er meerdere functieaanroepen op één bronlijn worden aangeroepen. U kunt de opdrachten p en t niet gebruiken om deze functie-aanroepen te scheiden.

In de volgende opdracht voert de t-opdracht bijvoorbeeld zowel GetTickCount als printf uit, terwijl de p-opdracht voor beide functieoproepen wordt uitgevoerd.

printf( "%x\n", GetTickCount() );

Als u bepaalde aanroepen wilt doorlopen tijdens het traceren van andere oproepen, gebruikt u .step_filter (Stapfilter instellen) om aan te geven welke aanroepen moeten worden doorlopen.

U kunt _step_filter gebruiken om frameworkfuncties (bijvoorbeeld Microsoft Foundation Classes (MFC) of ATL-aanroepen (Active Template Library) uit te filteren.