2010-11-11 8 views

risposta

5

Non so se questo aiuta, ma è possibile utilizzare il comando .writemem di WinDbg. Prende un nome di file e un intervallo di memoria e lo scarica (come binario) sul disco.

+0

Credo che WinDbg dovrà allegare al processo, ma perché VS è già collegato. Solo un debugger può essere allegato al momento, quindi .writemem non è accessibile. Vedi [1] (http://stackoverflow.com/a/5590924/142207) e [2] (http://stackoverflow.com/a/8017023/142207) per altri modi. – okigan

+0

In effetti, è possibile collegare WinDbg a un processo già sottoposto a debug, ma è necessario selezionare la casella "non invasiva" quando si esegue questa operazione e si scoprirà che alcune opzioni non sono disponibili e che il processo VS presto non risponderà. :) –

+0

Funziona anche se si ha un dump della memoria salvato in windbg. – Deanna

7

user142207 ha svolto un ottimo lavoro investigando su internals VS, io raccomando quella soluzione. Ho un altro modo in cui è stato inventato dal mio collega, Sergey S., che è molto utile:

di Windows: utilizzare un paio di funzioni ReadProcessMemory/WriteProcessMemory. Ha bisogno di un'applicazione stand-alone che chiama queste funzioni con un processo id bersaglio come:

dumper.exe <debugged process id> <memory_start_addr> <memory_length> 

Questa applicazione può essere chiamato direttamente durante la sessione di debug VS (rispetto a Linux, che non ha tale possibilità). Possiamo acquisire l'indirizzo di memoria nella finestra di controllo, quindi passare l'indirizzo allo scaricatore e voilà. Come dice user22207 nel suo articolo, è molto utile in progetti ricompilati da molto tempo.

Linux/MacOS ha approcci diversi. Ad esempio: dalla console di gdb, usa la memoria di comando dei comandi. Questo comando può anche essere utilizzato direttamente durante la sessione di debug.

1

La finestra di controllo nel debugger di Visual Studio può eseguire funzioni, se si esegue il debug del proprio codice, è sufficiente aggiungere alcune funzioni al codice per salvare un buffer nel file e richiamarlo dalla finestra di controllo. per esempio:

void WriteToFile(char* name, void* buffer, size_t size) 
{ 
    FILE* fp; 
    fopen_s(&fp, name, "wb"); 
    fwrite(buffer, 1, size, fp); 
    fclose(fp); 
} 

Poi basta digitare qualcosa di simile nella finestra di controllo:

WriteToFile("c:\\temp\\dump.dat", buffer, len) 
2

Esiste un'estensione per questo: https://marketplace.visualstudio.com/items?itemName=OvidiuIonescu.VSDebugTool. Apre la console nella finestra di VisualStudio e consente di scaricare la memoria sul file e un altro paio di operazioni di memoria (immettere "help" nella console per i dettagli).

Inoltre, alcuni editor esadecimali (ad esempio Hex Editor Neo) possono sfogliare la memoria di processo come un file normale. Forse troverai anche un editor gratuito con questa funzione.

0

Ho il sospetto che tu possa ottenere quello che vuoi dal ClrMD, puoi quindi uguali i dati che vuoi comunque.

Se vuoi letteralmente un core dump allora WinDbg potrebbe essere quello che stai cercando?

C'è anche questo post su MSDN Blogs: https://blogs.msdn.microsoft.com/dondu/2010/10/24/writing-minidumps-in-c/

Si descrive come creare le cose discarica-ish in .NET di programmazione.

+0

So che posso ottenere un file dump di tutta la memoria disponibile, ma voglio solo ottenere uno snippet di memoria in un file mentre eseguo il debug senza modificare il codice sorgente. – marsh

+0

@marsh Quindi vuoi che il mio programma esterno analizzi la memoria e la salvi un po 'alla volta? – BanksySan

+0

@marsh Avevo pensato che stavi lavorando in .NET, stai lavorando con la memoria non gestita? – BanksySan

2

StNickolay ha la risposta che fa riferimento a qualche strumento chiamato "dumper" ma, in qualche modo, non sono stato in grado di trovarlo in rete (anche, user142207 è scomparso da tempo). Così ho creato lo stesso strumento: apre il processo in esecuzione (anche con un debugger collegato) e copia parte della sua memoria nel file. Molto utile quando si desidera archiviare una struttura per dopo e non si vuole lottare con l'output di "copia" di VS Memory View. Godere!

https://github.com/Alexx999/Dumper

+0

Grandi cose! L'ho appena usato, perfetto. – TTimo

Problemi correlati