Lavoro su una grande applicazione e uso frequentemente WinDbg per diagnosticare problemi basati su un file DMP da un cliente. Ho scritto alcune piccole estensioni per WinDbg che si sono rivelate molto utili per estrarre bit di informazioni dai file DMP. Nel mio codice di estensione mi ritrovo a dereferenziare oggetti di classe C++ allo stesso modo, ripetutamente, a mano. Per esempio:Come posso creare oggetti basati sulla memoria di file di dump in un'estensione WinDbg?
Address = GetExpression("somemodule!somesymbol");
ReadMemory(Address, &addressOfPtr, sizeof(addressOfPtr), &cb);
// get the actual address
ReadMemory(addressOfObj, &addressOfObj, sizeof(addressOfObj), &cb);
ULONG offset;
ULONG addressOfField;
GetFieldOffset("somemodule!somesymbolclass", "somefield", &offset);
ReadMemory(addressOfObj+offset, &addressOfField, sizeof(addressOfField), &cb);
che funziona bene, ma come ho scritto più estensioni, con una maggiore funzionalità (e accedere agli oggetti più complicati nelle nostre applicazioni file DMP), ho desiderato per una soluzione migliore. Naturalmente ho accesso alla fonte della nostra applicazione, quindi immagino che ci dovrebbe essere un modo per copiare un oggetto da un file DMP e usare quella memoria per creare un oggetto reale nell'estensione del debugger che posso chiamare funzioni su (collegando in DLL dalla nostra applicazione). Questo mi avrebbe risparmiato la fatica di estrarre le cose dalla DMP a mano.
È possibile? Ho provato cose ovvie come creare un nuovo oggetto nell'estensione, quindi sovrascriverlo con un grande ReadMemory direttamente dal file DMP. Questo sembrava mettere i dati nei campi giusti, ma è andato fuori di testa quando ho provato a chiamare una funzione. Immagino che mi manchi qualcosa ... forse il C++ richiama un funky brio che non conosco? Il mio codice è simile a questo:
SomeClass* thisClass = SomeClass::New();
ReadMemory(addressOfObj, &(*thisClass), sizeof(*thisClass), &cb);
SEGUITO: Sembra EVENTUALMENTE ExtRemoteTyped da EngExtCpp è quello che voglio? Qualcuno ha usato con successo questo? Ho bisogno di google su qualche codice di esempio, ma non ho molta fortuna.
FOLLOWUP 2: Sto perseguendo due diversi percorsi di indagine su questo.
1) Sto cercando ExtRemoteTyped, ma sembra che questa classe sia davvero solo un aiuto per le chiamate ReadMemory/GetFieldOffset. Sì, aiuterebbe a velocizzare le cose, ma non è di grande aiuto quando si tratta di ricreare un oggetto da un file DMP. Sebbene la documentazione sia snella, potrei quindi fraintendere qualcosa. 2) Sto anche cercando di utilizzare ReadMemory per sovrascrivere un oggetto creato nella mia estensione con i dati del file DMP. Tuttavia, piuttosto che usare sizeof (* thisClass) come sopra, stavo pensando che avrei scelto solo gli elementi di dati e lasciato intatti i vtables.
Ottima domanda PJ! –