Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det är enklare att felsöka ett program om du kan analysera kodens källa i stället för de demonterade binärfilerna.
WinDbg, CDB och KD kan använda källkod vid felsökning, om källspråket är C, C++eller sammansättning.
Kompileringskrav
Om du vill använda källfelsökning måste du låta kompilatorn eller länkaren skapa symbolfiler (.pdb-filer) när binärfilerna skapas. Dessa symbolfiler visar felsökaren hur de binära instruktionerna motsvarar källraderna.
Dessutom måste felsökaren kunna komma åt de faktiska källfilerna eftersom symbolfilerna inte innehåller den faktiska källtexten.
Om det är möjligt bör kompilatorn och länkaren inte optimera koden. Källfelsökning och åtkomst till lokala variabler är svårare, och ibland nästan omöjligt, om koden har optimerats. Om du använder verktyget Build som kompilator och länkare anger du MSC_OPTIMIZATION makro till /Od /Oi för att undvika optimering.
Hitta symbolfilerna och källfilerna
Om du vill felsöka i källläge måste felsökaren kunna hitta källfilerna och symbolfilerna. Mer information finns i Källsökväg.
Starta källfelsökning
Felsökaren kan visa källinformation när den har rätt symboler och källfiler för tråden som för närvarande debuggas.
Om du startar ett nytt användarlägesprogram med hjälp av felsökningsprogrammet inträffar den första pausen när Ntdll.dll läser in programmet. Eftersom felsökaren inte har åtkomst till Ntdll.dll källfiler kan du inte komma åt källinformation för ditt program just nu.
Om du vill flytta programräknaren till början av programmet lägger du till en brytpunkt vid startpunkten i binärfilen. I fönstret Felsökningskommando skriver du följande kommando.
bp main
g
Programmet läses sedan in och stoppas när huvudfunktionen anges. (Naturligtvis kan du använda valfri startpunkt, inte bara main.)
Om programmet utlöser ett undantag bryts det in i felsökningsprogrammet. Källinformation är tillgänglig just nu. Men om du bryter med CTRL+C, CTRL+BREAK eller Felsökning | Bryt-kommandot, skapar felsökningsprogrammet en ny tråd, så du kan inte se din källkod.
När du har nått en tråd som du har källfiler för kan du använda felsökningskommandofönstret för att köra källfelsökningskommandon. Om du använder WinDbg visas fönstret Källa . Om du redan har öppnat ett källfönster genom att klicka på Öppna källfil på Arkiv-menyn skapar WinDbg vanligtvis ett nytt fönster för källan. Du kan stänga föregående fönster utan att påverka felsökningsprocessen.
Källfelsökning i WinDbg-GUI
Om du använder WinDbg visas ett källfönster så snart programräknaren finns i kod som felsökaren har källinformation för.
WinDbg visar ett källfönster för varje källfil som du eller WinDbg öppnade. Mer information om textegenskaperna i det här fönstret finns i Källfönster.
Du kan sedan steg för steg gå igenom ditt program eller köra fram till en avbrottspunkt eller markören. Mer information om steg- och spårningskommandon finns i Kontrollera målet.
Om du är i källläge flyttas lämpligt källfönster till förgrunden när du går igenom programmet. Eftersom det också finns Microsoft Windows-rutiner som anropas under programmets körning kan felsökaren flytta ett Deassembly-fönster till förgrunden när den här typen av anrop inträffar (eftersom felsökaren inte har åtkomst till källan för dessa funktioner). När programräknaren återgår till kända källfiler blir lämpligt källfönster aktivt.
När du går igenom programmet markerar WinDbg din plats i fönstret Källa och fönstret Demontera. Rader där brytpunkter anges är också markerade. Källkoden färgas enligt parsningen av språket. Om källfönstret har valts kan du hovra över en symbol med musen för att utvärdera det. Mer information om dessa funktioner och hur du styr dem finns i Källfönster.
Om du vill aktivera källläget i WinDbg använder du kommandot l+t , klickar på källläge på felsökningsmenyn eller klickar på källläget på knappen . När källläget är aktivt visas ASM-indikatorn som otillgänglig i statusfältet.
Du kan visa eller ändra värdena för alla lokala variabler när du går igenom en funktion i källläge. Mer information finns i Läsa och skriva minne.
Källfelsökning i felsökningskommandofönstret
Om du använder CDB har du inget separat källfönster. Du kan dock fortfarande se dina framsteg när du går igenom källan.
Innan du kan göra källfelsökning i CDB måste du läsa in källradssymboler genom att utfärda kommandot .lines (Växla stöd för källrad) eller genom att starta felsökningsprogrammet med kommandoradsalternativet -lines.
Om du kör ett l+t-kommando utförs alla programsteg en källrad i taget. Använd l-t för att stega en sammansättningsinstruktion i taget. Om du använder WinDbg har det här kommandot samma effekt som att välja eller rensa källlägepå felsökningsmenyn eller använda knapparna i verktygsfältet.
Kommandot l+s visar den aktuella källraden och radnumret vid prompten. Om du bara vill se radnumret använder du l+l i stället.
Om du använder l+o och l+s visas endast källraden medan du går igenom programmet. Programräknaren, demonteringskoden och registerinformationen är dolda. Med den här typen av visning kan du snabbt gå igenom koden och bara visa källan.
Du kan använda kommandot lsp (Ange antal källrader) för att ange exakt hur många källrader som ska visas när du går igenom eller kör programmet.
Följande sekvens med kommandon är ett effektivt sätt att gå igenom en källfil.
.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
Eftersom RETUR upprepar det senaste kommandot kan du nu gå igenom programmet med hjälp av RETUR-nyckeln. Varje steg gör att källraden, minnesförskjutningen och sammansättningskoden visas.
Mer information om hur du tolkar demonteringsvisningen finns i Felsökning i sammansättningsläge.
När sammansättningskoden visas visas alla minnesplatser som används till höger på raden. Du kan använda kommandona d* (Visningsminne) och e* (Ange värden) för att visa eller ändra värdena på dessa platser.
Om du måste visa varje sammansättningsinstruktion för att fastställa förskjutningar eller minnesinformation använder du l-t för att stega efter sammansättningsinstruktioner i stället för källrader. Källradsinformationen kan fortfarande visas. Varje källrad motsvarar en eller flera assemblerinstruktioner.
Alla dessa kommandon är tillgängliga i WinDbg och i CDB. Du kan använda kommandona för att visa källradsinformation från WinDbgs felsökningskommandofönster i stället för från källfönstret.
Källlinjer och förskjutningar
Du kan också utföra källfelsökning med hjälp av uttrycksutvärderingen för att fastställa den förskjutning som motsvarar en specifik källrad.
Följande kommando visar en minnesförskjutning.
? `[[module!]filename][:linenumber]`
Om du utelämnar filnamn söker felsökningsprogrammet efter källfilen som motsvarar den aktuella programräknaren.
Felsökaren läser radnummer som ett decimaltal om du inte lägger till 0x före det, oavsett aktuell standardradix. Om du utelämnar radnummer utvärderas uttrycket till den första adressen för den körbara fil som motsvarar källfilen.
Den här syntaxen tolkas endast i CDB om kommandot .lines eller kommandoradsalternativet -lines har läst in källradssymboler.
Den här tekniken är mycket mångsidig eftersom du kan använda den oavsett var programräknaren pekar. Med den här tekniken kan du till exempel ange brytpunkter i förväg med hjälp av kommandon som följande.
bp `source.c:31`
Mer information finns i Källradssyntax och Använda brytpunkter.
Steg och spårning i källläge
När du felsöker i källläge kan det finnas flera funktionsanrop på en enda källrad. Du kan inte använda p - och t-kommandona för att avgränsa dessa funktionsanrop.
I följande kommando stegar t-kommandot till exempel i både GetTickCount och printf, medan p-kommandot stegar över båda funktionsanropen.
printf( "%x\n", GetTickCount() );
Om du vill hoppa över vissa anrop medan du spårar in i andra anrop använder du .step_filter (Ange stegfilter) för att ange vilka anrop som ska hoppas över.
Du kan använda _step_filter för att filtrera bort ramverksfunktioner (till exempel MFC-anrop (Microsoft Foundation-klasser) eller ATL-anrop (Active Template Library).