Simboli di mapping quando viene eseguito il paging del PEB

Per caricare i simboli, il debugger esamina l'elenco dei moduli caricati dal sistema operativo. Il puntatore all'elenco di moduli in modalità utente è uno degli elementi archiviati nel blocco di ambiente del processo (PEB).

Per recuperare memoria, Gestione memoria può eseguire il paging dei dati in modalità utente per creare spazio per altri componenti in modalità kernel o processi. I dati in modalità utente visualizzati in uscita possono includere la struttura dei dati PEB. Senza questa struttura di dati, il debugger non può determinare per quali immagini caricare i simboli.

Nota Ciò influisce sui file di simboli solo per i moduli in modalità utente. I moduli e i simboli in modalità kernel non sono interessati, perché vengono rilevati in un elenco diverso.

Si supponga che nel processo corrente venga eseguito il mapping di un modulo in modalità utente e che si voglia correggere i simboli. Trovare qualsiasi indirizzo nell'intervallo di indirizzi virtuali del modulo. Si supponga, ad esempio, che un modulo sia mappato a un intervallo di indirizzi virtuali contenente l'indirizzo 7f78e9e000F. Immettere il comando seguente.

3: kd> !vad 7f78e9e000F 1

L'output del comando visualizza informazioni sul descrittore di indirizzi virtuali (VAD) per il modulo. L'output del comando include anche una stringa di comando Reload che è possibile usare per caricare i simboli per il modulo. La stringa di comando Ricarica include l'indirizzo iniziale (000007f7'8e9e0000) e le dimensioni (32000) del modulo del Blocco note.

VAD @ fffffa80056fb960
...
Reload command: .reload notepad.exe=000007f7`8e9e0000,32000

Per caricare i simboli, immettere il comando specificato nella stringa di comando Ricarica.

.reload notepad.exe=000007f7`8e9e0000,32000

Ecco un altro esempio che usa una tecnica leggermente diversa. Nell'esempio viene illustrato come usare l'estensione !vad per eseguire il mapping dei simboli quando viene eseguito il paging di PEB. L'idea di base consiste nel trovare l'indirizzo iniziale e le dimensioni della DLL pertinente in modo da poter quindi usare il comando .reload per caricare i simboli necessari. Si supponga che l'indirizzo del processo corrente sia 0xE0000126'01BA0AF0 e che si voglia correggere i simboli. Usare prima di tutto il comando !process per ottenere l'indirizzo radice del descrittore di indirizzi virtuali (VAD):

kd> !process e000012601ba0af0 1
PROCESS e000012601ba0af0
    SessionId: 2  Cid: 0b50    Peb: 6fbfffde000  ParentCid: 0efc
    DirBase: 079e8461  ObjectTable: e000000600fbceb0  HandleCount: 360.
    Image: explorer.exe
    VadRoot e000012601a35e70 Vads 201 Clone 0 Private 917. Modified 2198. Locked 0.
...

Usare quindi l'estensione !vad per elencare l'albero VAD associato al processo. Questi VAD etichettati "EXECUTE_WRITECOPY" appartengono ai moduli di codice.

kd> !vad e000012601a35e70
VAD     level      start      end    commit
...
e0000126019f9790 ( 6)      3fff0    3fff7        -1 Private      READONLY
e000012601be1080 ( 7)   37d9bd30 37d9bd3e         2 Mapped  Exe  EXECUTE_WRITECOPY  <-- these are DLLs
e000012600acd970 ( 5)   37d9bec0 37d9bece         2 Mapped  Exe  EXECUTE_WRITECOPY
e000012601a5cba0 ( 7)   37d9c910 37d9c924         2 Mapped  Exe  EXECUTE_WRITECOPY
...

Usare quindi di nuovo l'estensione !vad per trovare l'indirizzo iniziale e le dimensioni della memoria di paging che contiene la DLL di interesse. Ciò conferma che è stata trovata la DLL corretta:

kd> !vad e000012601be1080 1

VAD @ e000012601be1080
  Start VPN:      37d9bd30  End VPN: 37d9bd3e  Control Area:  e00001260197b8d0
  First ProtoPte: e0000006013e00a0  Last PTE fffffffffffffffc  Commit Charge         2 (2.)
  Secured.Flink          0  Blink           0  Banked/Extend:        0
  File Offset   0
   ImageMap ViewShare EXECUTE_WRITECOPY

...
        File: \Windows\System32\ExplorerFrame.dll

Il campo "Avvia VPN", in questo caso 0x37D9BD30 , indica il numero di pagina virtuale iniziale. Deve essere convertito in un indirizzo effettivo moltiplicandolo per le dimensioni della pagina. È possibile usare il ? (Espressione di valutazione) comando per moltiplicare questo valore per 0x2000, ovvero le dimensioni della pagina per la macchina basata su Itanium da cui proviene l'esempio.

kd> ? 37d9bd3e*2000 
Evaluate expression: 7676040298496 = 000006fb`37a7c000

Le dimensioni dell'intervallo possono quindi essere convertite in byte:

kd> ? 37d9bd3e-37d9bd30+1 <--   computes the number of pages
Evaluate expression: 15 = 00000000`0000000f
kd> ? f*2000
Evaluate expression: 122880 = 00000000`0001e000        

Quindi ExplorerFrame.dll inizia all'indirizzo 0x000006Fb'37A7C000 ed è 0x1E000 byte di grandi dimensioni. È possibile caricarne i simboli con:

kd> .reload /f ExplorerFrame.dll=6fb`37a7c000,1e000