Wie kann ich den OpenGL -Absturz im Minen -Snapshot -Programm (Windows) vermeiden?
Posted: 25 Feb 2025, 09:28
Ich versuche, die Funktionsfunktionalität von Prozess -Snapshots in C ++ unter Windows X64 zu implementieren, um den Laufzeitzustand eines Prozesses zu speichern und ihn nach einem bestimmten Zeitraum wiederherzustellen, während der Prozess ausgeführt wird. Mein Ziel ist es, alle Vorgänge im Benutzermodus zu erledigen, wann immer möglich. Dies funktioniert korrekt mit älteren Programmen wie Minesweeper, Pflanzen vs. Zombies und benutzerdefinierten Befehlszeilenanwendungen. in nvoglv64.dll mit Fehler Codes 0xc0000409 und 0xc0000005 . Ich habe versucht, Speicherregionen zu überspringen, die diesem Modul zugeordnet sind, aber die Fehler bestehen bestehen. > Snapshot machen: < /strong> < /p>
Alle Threads einfrieren → Thread -Kontexte & TEB → Alle Speicherregionen Dumpen → Threads entfernen. />
Alle Threads einfrieren → Überschreiben von Speicherregionen → Thread -Kontexte und TEB → Threads entfernen. < /li>
< /ul>
< /li>
< /ol>
Analyse: < /strong>
Das Problem stammt wahrscheinlich aus OpenGL -Speichern von Ressourcenhandles (z. B.,,, z. B.,, Texturen, Puffer) im GPU -Speicher (VRAM). Diese GPU-spezifischen Staaten werden während des Prozess-Schnappschusss nicht erfasst, was zu staatlichen Inkonsistenzen bei der Wiederherstellung führt. Obwohl VRAM nicht direkt zugänglich ist, vermute ich, dass die Erhaltung des GPU -Staates möglicherweise indirekte Methoden wie Prozessinjektion oder DLL -Weiterleitung erfordern. Ich habe diese Ansätze versucht, aber es fehlt ausreichend Kenntnisse über die Rendern von Engine -Interna, um das Problem zu lösen. < /P>
Wie kann ich das Crash -Problem lösen?
Programm: snapshot.exe (automatisch ein Prozess mit dem Namen test.exe und automatisch Schnappschüsse stellt es wieder her 4 Sekunden später). /li>
< /ul>
Fehlerstapel < /strong> < /p>
Alle Threads einfrieren → Thread -Kontexte & TEB → Alle Speicherregionen Dumpen → Threads entfernen. />
Alle Threads einfrieren → Überschreiben von Speicherregionen → Thread -Kontexte und TEB → Threads entfernen. < /li>
< /ul>
< /li>
< /ol>
Analyse: < /strong>
Das Problem stammt wahrscheinlich aus OpenGL -Speichern von Ressourcenhandles (z. B.,,, z. B.,, Texturen, Puffer) im GPU -Speicher (VRAM). Diese GPU-spezifischen Staaten werden während des Prozess-Schnappschusss nicht erfasst, was zu staatlichen Inkonsistenzen bei der Wiederherstellung führt. Obwohl VRAM nicht direkt zugänglich ist, vermute ich, dass die Erhaltung des GPU -Staates möglicherweise indirekte Methoden wie Prozessinjektion oder DLL -Weiterleitung erfordern. Ich habe diese Ansätze versucht, aber es fehlt ausreichend Kenntnisse über die Rendern von Engine -Interna, um das Problem zu lösen. < /P>
Wie kann ich das Crash -Problem lösen?
Programm: snapshot.exe (automatisch ein Prozess mit dem Namen test.exe und automatisch Schnappschüsse stellt es wieder her 4 Sekunden später). /li>
< /ul>
Fehlerstapel < /strong> < /p>
Code: Select all
nvoglv64!vk_icdNegotiateLoaderICDInterfaceVersion+0xcade5
nvoglv64!DrvValidateVersion+0xaa0a
nvoglv64!DrvPresentBuffers+0x2acd7
nvoglv64!DrvPresentBuffers+0x2a217
nvoglv64!DrvPresentBuffers+0x188b3
nvoglv64!DrvPresentBuffers+0x1302c2
nvoglv64!DrvPresentBuffers+0x132598
nvoglv64!DrvPresentBuffers+0x13478d
nvoglv64!DrvPresentBuffers+0x13338b
nvoglv64!DrvPresentBuffers+0x14d9d8
nvoglv64!DrvValidateVersion+0x6c76
nvoglv64!DrvPresentBuffers+0x112ca1
nvoglv64!DrvPresentBuffers+0xc9218
nvoglv64!DrvPresentBuffers+0xef6f2
nvoglv64!DrvPresentBuffers+0xef00d
nvoglv64!DllMain+0x7d46
nvoglv64!DllMain+0x7ebd
nvoglv64!DllMain+0x7c9e
nvoglv64!DllMain+0x760e
nvoglv64!DrvSwapLayerBuffers+0x2b6
nvoglv64!DllMain+0xa683
nvoglv64+0x11133a3
nvoglv64+0x1113087
nvoglv64!DrvValidateVersion+0xd988
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21