Megosztás a következőn keresztül:


Hibakeresés forrás módban

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ü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).