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.
A Microsoft bizonyos technikákkal újrarendezi a lefordított és csatolt kódot, hogy hatékonyabb végrehajtást végezzen. Ezek a technikák optimalizálják az összetevőt a memóriahierarchiákhoz, és betanítási forgatókönyveken alapulnak.
Az eredményként kapott optimalizálás csökkenti a lapozást (és az oldalhibákat), és növeli a kód és az adatok közötti térbeli helységet. Ez az eredeti kód rossz elhelyezkedése által bevezetett fő teljesítménybeli szűk keresztmetszetet oldja meg. Az optimalizáláson átesett összetevők kódját vagy adatblokkját egy függvényen belül áthelyezhetik a bináris fájl különböző pontjaira.
Az ilyen technikákkal optimalizált modulokban a kód- és adatblokkok helye gyakran más memóriacímeken található, mint azok a helyek, ahol a szokásos fordítás és csatolás után találhatók. Emellett a függvények több nem összefüggő blokkra is feloszthatók, hogy a leggyakrabban használt kód elérési útjai ugyanazon a lapon egymás közelében legyenek.
Ezért egy függvény (vagy bármely szimbólum) és egy eltolás nem feltétlenül ugyanazzal a jelentéssel rendelkezik, mint a nem optimalizált kódban.
hibakeresési Performance-Optimized kód
Hibakereséskor láthatja, hogy egy modul teljesítményoptimalizált-e a !lmi bővítményparancs használatával bármely olyan modulon, amelyre a szimbólumok be lettek töltve:
0:000> !lmi ntdll
Loaded Module Info: [ntdll]
Module: ntdll
Base Address: 77f80000
Image Name: ntdll.dll
Machine Type: 332 (I386)
Time Stamp: 394193d2 Fri Jun 09 18:03:14 2000
CheckSum: 861b1
Characteristics: 230e stripped perf
Debug Data Dirs: Type Size VA Pointer
MISC 110, 0, 76c00 [Data not mapped]
Image Type: DBG - Image read successfully from symbol server.
c:\symbols\dll\ntdll.dbg
Symbol Type: DIA PDB - Symbols loaded successfully from symbol server.
c:\symbols\dll\ntdll.pdb
Ebben a kimenetben figyelje meg a perf kifejezést a "Jellemzők" sorban. Ez azt jelzi, hogy ezt a teljesítményoptimalizálást alkalmazták ntdll.dll.
A hibakereső képes megérteni egy függvényt vagy más szimbólumot eltolás nélkül; Így probléma nélkül állíthat be töréspontokat függvényeken vagy más címkéken. A szétszerelési művelet kimenete azonban zavaró lehet, mivel ez a szétszerelés az optimalizáló által végrehajtott módosításokat fogja tükrözni.
Mivel a hibakereső megpróbál közel maradni az eredeti kódhoz, szórakoztató eredményeket láthat. A teljesítményoptimalizált kódok használatakor az a szabály, hogy nem lehet megbízható cím aritmetikai műveleteket végezni az optimalizált kódon.
Íme egy példa:
kd> bl
0 e f8640ca6 0001 (0001) tcpip!IPTransmit
1 e f8672660 0001 (0001) tcpip!IPFragment
kd> u f864b4cb
tcpip!IPTransmit+e48:
f864b4cb f3a4 rep movsb
f864b4cd 8b75cc mov esi,[ebp-0x34]
f864b4d0 8b4d10 mov ecx,[ebp+0x10]
f864b4d3 8b7da4 mov edi,[ebp-0x5c]
f864b4d6 8bc6 mov eax,esi
f864b4d8 6a10 push 0x10
f864b4da 034114 add eax,[ecx+0x14]
f864b4dd 57 push edi
A töréspontok listájából láthatja, hogy IPTransmit címe 0xF8640CA6.
Amikor a 0xF864B4CB helyen a függvény egy kódszakaszát szétszereli, a kimenet azt jelzi, hogy ez 0xE48 bájttal van a függvény elejétől. Azonban, ha kivonja a függvény alapját ebből a címből, a tényleges eltolás 0xA825 lesz.
A következő történik: A hibakereső valóban bemutatja a bináris utasítások szétszerelését a 0xF864B4CB címtől kezdődően. Az eltolás egyszerű kivonással történő számítása helyett azonban a hibakereső, amennyire csak lehet, az eredeti kódban létező állapot szerint a függvény bejegyzésének eltolását jeleníti meg az optimalizálások végrehajtása előtt. Ez az érték 0xE48.
Ha viszont IPTransmit+0xE48 próbál meg megnézni, a következőt fogja látni:
kd> u tcpip!iptransmit+e48
tcpip!ARPTransmit+d8:
f8641aee 0856ff or [esi-0x1],dl
f8641af1 75fc jnz tcpip!ARPTransmit+0xd9 (f8641aef)
f8641af3 57 push edi
f8641af4 e828eeffff call tcpip!ARPSendData (f8640921)
f8641af9 5f pop edi
f8641afa 5e pop esi
f8641afb 5b pop ebx
f8641afc c9 leave
Itt az történik, hogy a hibakereső felismeri a IPTransmit szimbólumot a cím 0xF8640CA6 egyenértékűként, és a parancselemző egyszerű kiegészítést végez a 0xF8640CA6 + 0xE48 = 0xF8641AEE megtalálásához. Ezen címet használja a u (Szétszerel) parancs argumentumaként. Miután ezt a helyet elemezték, a hibakereső felfedezi, hogy ez nem IPTransmit a 0xE48 eltolásával. Valójában egyáltalán nem része ennek a függvénynek. Ez inkább az ARPTransmit függvénynek, valamint a 0xD8 eltolásának felel meg.
Ennek az az oka, hogy a teljesítményoptimalizálás nem visszafordítható a cím aritmetikai segítségével. Bár a hibakereső képes egy címet felvenni, és az eredeti szimbólumát és eltolását levonni, nincs elég információja ahhoz, hogy egy szimbólumot és eltolást vegyen fel, és lefordítsa a megfelelő címre. Következésképpen ezekben az esetekben a szétszerelés nem hasznos.