2010-11-11 19 views

Respuesta

5

No sé si esto ayuda, pero puede usar el comando .writemem de WinDbg. Toma un nombre de archivo y un rango de memoria y lo vuelca (como binario) al disco.

+0

Creo que WinDbg tendrá que adjuntar al proceso, pero debido a que VS ya está adjunto. Solo se puede adjuntar un depurador en ese momento, por lo que no se puede acceder a .writemem. Ver [1] (http://stackoverflow.com/a/5590924/142207) y [2] (http://stackoverflow.com/a/8017023/142207) para otras formas. – okigan

+0

De hecho, puede conectar WinDbg a un proceso que ya se está depurando, pero debe marcar el cuadro "no invasivo" cuando lo haga, y encontrará que algunas opciones no están disponibles y que su proceso VS pronto dejará de responder. :) –

+0

Esto también funciona si tienes un volcado de memoria guardado en windbg. – Deanna

7

user142207 ha hecho un gran trabajo investigando internos de VS, recomiendo esa solución. que tienen otra forma que fue inventado por mi colega, Sergey S., que es muy útil:

de Windows: usar un par de funciones ReadProcessMemory/WriteProcessMemory. Se necesita una aplicación independiente que se llama a estas funciones con un identificador de proceso como objetivo:

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

Esta aplicación se puede llamar directamente durante la sesión de depuración VS (en comparación con Linux, que no tiene esa posibilidad). Podemos capturar la dirección de la memoria en la ventana del reloj, luego pasar la dirección al volcador y listo. Como dice user142207 en su artículo, es muy útil en proyectos recompilados desde hace mucho tiempo.

Linux/MacOS tiene diferentes enfoques. Por ejemplo: desde la consola de gdb, use la memoria de volcado de comando. Este comando también se puede usar directamente durante la sesión de depuración.

1

La ventana de visualización en el depurador de Visual Studio puede ejecutar funciones, si está depurando su propio código, puede simplemente agregar alguna función a su código para guardar un búfer en el archivo y llamarlo desde la ventana del reloj. por ejemplo:

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

Entonces sólo tiene que escribir algo como esto en la ventana de inspección:

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

Existe una extensión para que: https://marketplace.visualstudio.com/items?itemName=OvidiuIonescu.VSDebugTool. Abre su consola en la ventana de VisualStudio y permite volcar la memoria al archivo y un par de otras operaciones de memoria (ingrese "ayuda" en la consola para más detalles).

Además, algunos editores hexadecimales (por ejemplo, Hex Editor Neo) pueden examinar la memoria de proceso como un archivo normal. Quizás también encuentres un editor gratuito con esta función.

0

Sospecho que puede obtener lo que quiere del ClrMD, puede hacer los mismos datos que desee.

Si literalmente quieres un volcado de núcleo, entonces WinDbg podría ser lo que estás buscando?

También existe esta entrada en MSDN Blogs: https://blogs.msdn.microsoft.com/dondu/2010/10/24/writing-minidumps-in-c/

En él se describe cómo crear cosas volcado-ish en .NET mediante programación.

+0

Sé que puedo obtener un archivo de volcado de toda la memoria disponible, pero solo quiero obtener un fragmento de memoria en un archivo mientras se depura sin modificar el código fuente. – marsh

+0

@marsh ¿Quiere que el programa externo Me analice la memoria y la guarde poco a poco? – BanksySan

+0

@marsh Supuse que estabas trabajando en .NET, ¿estás trabajando con memoria no administrada? – BanksySan

2

StNickolay tiene la respuesta que hace referencia a una herramienta llamada "dumper" pero, de alguna manera, no pude encontrarla en la red (también, el usuario142207 se fue). Así que creé la misma herramienta: abre el proceso en ejecución (incluso con un depurador adjunto) y copia parte de su memoria en el archivo. Muy útil cuando quiere almacenar alguna estructura para más adelante y no quiere tener problemas con la salida de "Copiar" de la Vista de memoria VS. ¡Disfrutar!

https://github.com/Alexx999/Dumper

+0

¡Cosas geniales! Solo lo usé, perfecto. – TTimo

Cuestiones relacionadas