mirror of
https://github.com/Dingo-Shenanigans/ReSkate.git
synced 2026-10-17 23:17:06 +02:00
Most crashes are caught by the game's own fatal handlers, which write a dump of thread stacks only; the launcher could only copy it after the game had exited. A crash on a freed or overwritten object then showed the faulting registers but not the object or the list it came from. - game_fatal_dump: the game's MiniDumpWriteDump import points at ReSkate. Before the game writes its dump, the crash reporter takes its own of the still-running game for the faulting thread; the game's dump follows as before. Reports say capture.source "game-fatal-handler". - The reporter's dumps include the memory the stacks point at (MiniDumpWithIndirectlyReferencedMemory), a few MB more a report. - The shared report says who asked for the dump (protocol version 4). - Tests: a game-handler crash is captured with a heap block only its stack points at; ReSkate's own capture keeps it too.
22 lines
1.1 KiB
C++
22 lines
1.1 KiB
C++
#pragma once
|
|
#include <Windows.h>
|
|
#include <filesystem>
|
|
#include <string_view>
|
|
|
|
namespace dingosdk::crash_report {
|
|
enum class StartResult { disabled, ready, failed };
|
|
// Called outside DllMain. A missing endpoint or RESKATE_CRASH_REPORTING=0 disables reporting.
|
|
StartResult start(const std::filesystem::path& log_directory) noexcept;
|
|
void stop() noexcept;
|
|
// Last-chance path: only signals the prestarted helper and waits at most 15 seconds.
|
|
void capture(EXCEPTION_POINTERS* exception) noexcept;
|
|
// The same, from the game's own fatal handler just before it writes its dump: thread_id is the
|
|
// thread that faulted, which need not be the calling one. The first capture of either kind wins.
|
|
void capture_game_fatal(DWORD thread_id, EXCEPTION_POINTERS* exception) noexcept;
|
|
// The level being loaded ("root + sublevel @ start point") and the graphics card the game renders
|
|
// on, for a report's tags: game.map, game.destination, gpu.name and gpu.driver. Nothing while
|
|
// reporting is off; too long a value is cut short.
|
|
void set_destination(std::wstring_view destination) noexcept;
|
|
void set_gpu(std::wstring_view name, std::wstring_view driver) noexcept;
|
|
}
|