2010-01-28 8 views
6

Sto usando Visual Studio 2008 per rintracciare un bug in un processo di esecuzione. Ho allegato al processo e identificato il modulo di interesse. (Succede che i simboli di debug per questo modulo sono stati caricati da un file pdb.) Voglio mostrare il codice smontato nella finestra Disassembly in modo che possa decidere dove impostare un breakpoint.Visual Studio 2008: Come visualizzare il codice disassemblato per una DLL che non è in esecuzione al momento

Quando interrompo il processo, il modulo attualmente in esecuzione è mostrato nella finestra Smontaggio. Sfortunatamente, questo non è il modulo di interesse. Non riesco a capire come mostrare il codice per il modulo di interesse mentre non è in esecuzione.

risposta

5

Supponendo che si esegue il debug di un processo non gestito ...

Quando si "Debug/pausa per l'All", attenersi alla seguente procedura:

Scegliere "Debug/Windows/Moduli" per ottenere un elenco di tutti caricato moduli. Sotto la colonna "Indirizzo" nella finestra Moduli è l'intervallo di memoria per quel modulo. Nella casella "Indirizzo:" nella finestra di disassemblaggio, digita l'indirizzo iniziale per il modulo (assicurati di aggiungere 0x prima del numero)

Ora dovresti essere all'inizio del modulo con cui vuoi giocare . Se conosci l'indirizzo di una funzione, puoi semplicemente passare a quell'indirizzo.

Ecco un esempio:

Run sol.exe connettersi al processo, e rompere tutti. Guardate i moduli e trovate "cards.dll", lo vedrete caricato a 6fc10000 (sulla mia macchina, comunque).

Immettere l'indirizzo (0x6fc10000) nella finestra di disassemblaggio e vi porterà all'inizio del modulo.

Ora dire che voglio effettivamente passare a una funzione. Aprire la DLL in Dependency Walker (depends.exe) per ottenere gli offset delle funzioni. Nel mio esempio, voglio impostare un punto di interruzione sulla funzione "cdInit". In Dependecny Walker, mostra che l'offset della funzione esportata cdInit è 0x000013e6. Quindi, per ottenere quella funzione, aggiungerei l'indirizzo iniziale del modulo (0x6fc10000) all'offset (0x000013e6) per ottenere 0x6fc113e6.

Digitando questo indirizzo nella casella di disassemblaggio, in effetti, salta direttamente all'inizio di tale funzione.

0

Hai provato a utilizzare .Net Reflector? È possibile ottenere tutto il codice dalla DLL e, eventualmente, ricompilarlo con messaggi di debug. È gratis:

http://www.red-gate.com/products/reflector/

Acclamazioni

+0

Ritiene che il lavoro con le DLL di codice nativo? –

+0

Sfortunatamente no, Reflector funziona solo con codice gestito (.Net). Non è più gratuito :) –

1

Facendo cose come questa è di gran lunga più facile in WinDbg

uf cards!cdInit 
+0

Ma lui sta chiedendo come farlo in Visual Studio 2008 ... – GalacticJello

+0

Sto dicendo che sta usando lo strumento sbagliato per il lavoro. E non è che debba pagare di più per WinDbg, è gratis - ogni dev dovrebbe averlo installato –