Estoy buscando un método para almacenar la memoria del proceso y restaurarla más adelante en ciertas condiciones.Parcheo de la memoria del proceso en tiempo de ejecución para restaurar el estado
...
preguntas realidad, yo he leído sobre él ... parece un gran reto!
Por lo tanto, vamos a analizar: La aplicación es un sistema distribuido, pero muchos procesos son apátridas (solicitar su estado a un servidor centralizado). Los procesos utilizan conexiones de red y memoria compartida para comunicarse con otros procesos.
El servidor central deberá guardar su estado por vertimiento su memoria proceso, que debe ser restaurada después de un ciertas condiciones. (1)
Conocí las funciones ReadProcessMemory y WriteProcessMemory, que permiten que el proceso se lea a sí mismo y sobrescriba la memoria ya asignada, ¿no es así? Entonces, lo que necesito es la dirección donde empiezo a leer/escribir, y el número de bytes para leer/escribir. Entonces ... ¿cuál es la dirección? Muchos códigos que he leído usan la dirección devuelta por VirtualAlloc, pero no sé si esto podría ser útil para mí.
que asumen que los segmentos ejecutables del proceso no están cambiando, por lo que no necesitan rojo/escrito. En tiempo de restauración, también podría suponer que todos los hilos de proceso están en la misma posición de ejecución cuando la memoria fue leída por el hilo principal.
Se mantiene la memoria de pila, y la memoria de pila, que son los segmentos de memoria lo que me interesa.
¿Es posible?
(1) es perfectamente legal para preguntar por qué estoy tratando de hacer esto. La razón es ... complicada, como de costumbre. Sin embargo, supongamos que la aplicación tiene un estado muy complicado, que requiere un algoritmo de ahorro de estado demasiado complejo. La otra alternativa (que está en el tema de análisis) es la implementación de un mecanismo logger/replay capaz de reproducir cada evento que ha contribuido al estado modificado.
Me vino a la mente el malloc & co. hook. Entonces puedo rastrear la memoria asignada por el proceso. Pero en realidad noté la estructura _CrtMemState, pero no sé si podría ser útil para mí.
Gran ejemplo. En realidad funciona, pero para casos muy limitados. ¡Gracias! – Luca
Esto es como '' 'cat/proc/pid/maps''' en Linux, excepto que con este código no se sabe a qué módulo pertenece cada bloque de memoria. ¿Es posible obtener esa información de alguna manera? – alexandernst
Ah, acabo de encontrar cómo hacerlo :) '' 'GetModuleFileNameA ((HINSTANCE) mbi.AllocationBase, szModName, _countof (szModName));' '' – alexandernst