Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az alkalmazások hibakeresése egyszerűbb, ha a szétszerelt bináris fájlok helyett elemezni tudja a kód forrását.
A WinDbg, a CDB és a KD használhatja a forráskódot a hibakereséshez, ha a forrásnyelv C, C++ vagy szerelvény.
Fordítási követelmények
A forráskeresés használatához a bináris fájlok létrehozásakor a fordítónak vagy a linkernek létre kell hoznia a szimbólumfájlokat (.pdb fájlokat). Ezek a szimbólumfájlok azt mutatják meg a hibakeresőnek, hogy a bináris utasítások hogyan felelnek meg a forrásvonalaknak.
Emellett a hibakeresőnek hozzá kell férnie a tényleges forrásfájlokhoz, mert a szimbólumfájlok nem tartalmazzák a tényleges forrásszöveget.
Ha lehetséges, a fordítónak és a linkernek nem szabad optimalizálnia a kódot. A forráskeresés és a helyi változókhoz való hozzáférés nehezebb, néha szinte lehetetlen, ha a kód optimalizálva van. Ha fordítóként és csatolóként a Build segédprogramot használja, az optimalizálás elkerülése érdekében állítsa a MSC_OPTIMIZATION makrót /Od /Oi értékre.
A szimbólumfájlok és a forrásfájlok keresése
A forrás módban történő hibakereséshez a hibakeresőnek képesnek kell lennie megtalálni a forrásfájlokat és a szimbólumfájlokat. További információ: Forrásútvonal.
Kezdő forrás hibakeresése
A hibakereső akkor jelenítheti meg a forrásadatokat, ha megfelelő szimbólumokkal és forrásfájlokkal rendelkezik a jelenleg hibakeresés alatt álló szálhoz.
Ha új felhasználói módú alkalmazást indít el a hibakereső használatával, a kezdeti törés akkor következik be, amikor Ntdll.dll betölti az alkalmazást. Mivel a hibakereső nem rendelkezik hozzáféréssel a Ntdll.dll forrásfájlokhoz, jelenleg nem férhet hozzá az alkalmazás forrásadataihoz.
Ha a programszámlálót az alkalmazás elejére szeretné helyezni, adjon hozzá egy töréspontot a bináris belépési pontjánál. A Hibakereső parancs ablakába írja be a következő parancsot.
bp main
g
Az alkalmazás ezután betöltődik, és leáll a fő függvény megadásakor. (Természetesen bármilyen belépési pontot használhat, nem csak a fő pontot.)
Ha az alkalmazás kivételt jelez, belép a hibakeresőbe. A forrásinformációk ezen a ponton érhetők el. Ha azonban törést ad ki a CTRL+C, CTRL+BREAK vagy a Hibakeresés | Törés parancs használatával, a hibakereső létrehoz egy új szálat, így nem látja a forráskódot.
Miután elérte azt a szálat, amelyhez forrásfájlokat használ, a Hibakereső parancs ablakával végrehajthatja a forráskeresési parancsokat. WinDbg használata esetén megjelenik a Forrás ablak . Ha már megnyitott egy forrásablakot a Fájl menü Forrásfájl megnyitása parancsára kattintva, a WinDbg általában létrehoz egy új ablakot a forrás számára. Az előző ablakot a hibakeresési folyamat befolyásolása nélkül is bezárhatja.
Forráskeresés a WinDbg GUI-ban
Ha WinDbg-t használ, megjelenik egy Forráskód-ablak, amint a programszámláló olyan kódban van, amelyhez a hibakereső forrásinformációkkal rendelkezik.
A WinDbg minden olyan forrásfájlhoz egy Forrásablakot jelenít meg, amelyet Ön vagy a WinDbg nyitott meg. Az ablak szövegtulajdonságairól további információt a Forrás windows című témakörben talál.
Ezután végiglépkedhet az alkalmazásán, vagy futtathatja a programot egy töréspontig vagy a kurzorig. A léptető- és nyomkövetési parancsokkal kapcsolatos további információkért lásd a Cél szabályozása című témakört.
Ha forrás módban van, a megfelelő Forrás ablak az előtérbe kerül az alkalmazás végiglépése közben. Mivel vannak olyan Microsoft Windows-rutinok is, amelyeket az alkalmazás végrehajtása során hívunk meg, előfordulhat, hogy a hibakereső egy Szétszerelési ablakot helyez át az előtérbe az ilyen típusú hívás esetén (mivel a hibakereső nem rendelkezik hozzáféréssel ezekhez a függvényekhez). Amikor a programszámláló visszatér az ismert forrásfájlokhoz, a megfelelő forrásablak aktívvá válik.
Amikor végighalad az alkalmazáson, a WinDbg kiemeli a tartózkodási helyét a Forrás ablakban és a Szétszerelés ablakban. Azok a sorok is ki vannak emelve, amelyeken töréspontok vannak beállítva. A forráskód a nyelv elemzésének megfelelően van színezve. Ha a Forrás ablak ki van jelölve, az egérrel rámutathat egy szimbólumra a kiértékeléséhez. Ezekről a funkciókról és azok vezérléséről további információt a Windows forrásablakában talál.
Ha a WinDbg-ben szeretné aktiválni a forrás módot, használja az l+t parancsot, kattintson a forrás módra a hibakeresési menüben, vagy kattintson a forrás mód gombra. Ha a forrás mód aktív, az ASM-jelző nem érhető el az állapotsoron.
A helyi változók értékeit megtekintheti vagy módosíthatja a függvények forrás módban való végiglépése során. További információ: Olvasás és memória írása.
Forráskeresés a Hibakereső parancsablakban
HA CDB-t használ, nincs külön forrásablaka. A forráson való lépés közben azonban továbbra is megtekintheti az előrehaladást.
Mielőtt elvégezheti a forráskeresést a CDB-ben, be kell töltenie a forrásvonal szimbólumait a .lines (Toggle Source Line Support) paranccsal, vagy a hibakereső elindításával a -lines parancssori beállítással.
Ha l+t parancsot hajt végre, a program minden lépését egyszerre egy forrásvonalon hajtja végre. Az l-t használatával lépésről lépésre hajtható végre egy-egy szerelési utasítás. WinDbg használata esetén ez a parancs ugyanolyan hatással van, mint a Forrás mód kiválasztása vagy törlése a Hibakeresés menüben vagy az eszköztárgombok használatával.
Az l+s parancs megjeleníti az aktuális forrássort és sorszámot a parancssorban. Ha csak a sorszámot szeretné látni, használja inkább az l+l értéket.
Ha l+o és l+s parancsokat használ, csak a forrásvonal jelenik meg, miközben átlépi a programot. A programszámláló, a szétszerelés kódja és a regisztrációs adatok rejtettek. Ez a megjelenítési típus lehetővé teszi, hogy gyorsan végiglépkedjen a kódon, és csak a forrást tekintse meg.
Az lsp (Forrásvonalak számának beállítása) paranccsal pontosan megadhatja, hogy az alkalmazás végrehajtásakor pontosan hány forrásvonal jelenjen meg.
A következő parancssorozat hatékony módszer egy forrásfájl végiglépésére.
.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
Mivel az ENTER megismétli az utolsó parancsot, az ENTER billentyűvel most már végiglépkedhet az alkalmazáson. Minden lépésben megjelenik a forrásvonal, a memóriaeltolás és a szerelvénykód.
A szétszerelési megjelenítés értelmezéséről további információt a hibakeresés szerelvény módban című témakörben talál.
Amikor megjelenik a szerelési kód, minden elért memóriahely a sor jobb végén jelenik meg. A d* (Memória megjelenítése) és az e* (Enter Values) paranccsal megtekintheti vagy módosíthatja az értékeket ezeken a helyeken.
Ha minden egyes utasítást meg kell tekintenie az eltolások vagy a memóriaadatok meghatározásához, akkor használja az l-t parancsot, hogy utasításonként lépjen tovább a forrásvonalak helyett. A forrásvonal adatai továbbra is megjeleníthetők. Minden forrássor egy vagy több szerelvényutasításnak felel meg.
Ezek a parancsok a WinDbg-ben és a CDB-ben is elérhetők. A parancsokkal a Forrás ablak helyett a WinDbg Hibakereső parancsablakából tekintheti meg a forrásvonal adatait.
Forrásvonalak és eltolások
A forráskeresést a kifejezésértékelővel is elvégezheti egy adott forrásvonalnak megfelelő eltolás meghatározásához.
Az alábbi parancs egy memóriaeltolódást jelenít meg.
? `[[module!]filename][:linenumber]`
Ha kihagyja a fájlnevet, a hibakereső az aktuális programszámlálónak megfelelő forrásfájlt keresi.
A hibakereső decimális számként olvassa be a sorszámértéket , hacsak nem ad hozzá előtte 0x értéket , függetlenül az aktuális alapértelmezett radixától. Ha kihagyja a sorszámozást, a kifejezés a forrásfájlnak megfelelő végrehajtható fájl kezdeti címére lesz kiértékelve.
Ezt a szintaxist csak akkor értjük a CDB-ben, ha a .lines parancs vagy a -lines parancssori beállítás betöltötte a forrásvonal szimbólumait.
Ez a technika nagyon sokoldalú, mert használhatja, függetlenül attól, hogy hol mutat a programszámláló. Ez a technika például lehetővé teszi a töréspontok előre történő beállítását az alábbi parancsok használatával.
bp `source.c:31`
További információ: Forrásvonal szintaxisa és töréspontok használata.
Léptetés és nyomkövetés forrás módban
Ha hibakeresést végzel forrás módban, több függvényhívás is lehet egyetlen soregyen. A p és a t parancs nem használható a függvényhívások elkülönítésére.
A következő parancsban például a t parancs a GetTickCount és a printf függvénybe is lép, míg a p parancs mindkét függvényhívásra lép.
printf( "%x\n", GetTickCount() );
Ha bizonyos hívásokat más hívásokra való nyomkövetés közben szeretne átléptetni, a .step_filter (Lépésszűrő beállítása) használatával jelezheti, hogy mely hívásokat szeretné átléptetni.
A _step_filter használatával kiszűrheti a keretrendszerfüggvényeket (például Microsoft Foundation Classes (MFC) vagy Active Template Library (ATL) hívásokat).