mirror of
https://github.com/Dingo-Shenanigans/ReSkate.git
synced 2026-10-24 19:26:18 +02:00
From 2.1.1's Sentry reports (60,000 in three days, 2026-10-21): - Textures: a stale render texture handle takes the game's default texture instead of reading through null (Skate.exe+0x3e897fb, a third of all reports, every one with TheVlixOne-Nike_Pack 2.3.x). - Physics: the wake pass's bitset is made as long as the world's owner list once indices pass 20000, after long multiplayer sessions (+0x3d99e2f, +0x3d9ee43, +0x3d9ee47). - Music: more than 1024 candidates are picked by ReSkate; the game's shuffle wrote past its stack table. - Streaming: a staged read's piece that reaches past its 64 KB buffer is left unfilled (VCRUNTIME memcpy). - Multiplayer: a remote skater or board whose parent bus link is damaged is left alive instead of destroyed (+0x2b94cd0). - Mesh pool: on an integrated GPU its budget is capped by the RAM and page file free; the Memory line says what the PC has left. Launcher: - A folder with non-ASCII letters is a hard stop (the boot crash +0x18df4cf came after "Start anyway"). - The game's data files are checked against the supported build's sizes (from Steam's manifest); missing, cut-short or online-only files send the player to verifying. - One game per folder: the launcher will not merge or start while one runs there, and ReSkate.dll holds the folder's mutex. - Advice on the ready screen for PCs short of RAM and page file; reports carry pc.ram_gb and pc.commit_free_gb. Stuck loads: - A load in one stage for two minutes sends a stuck-load report (every thread's stack and the log, error.type stall, load.stage, load.seconds) while the game goes on (crash protocol 6). - A load the player closes sends its timing with the stage it was in. Logs: the PanelTrace diagnostics and the neighborhood unlock override's observation lines are gone.
30 lines
1.7 KiB
C++
30 lines
1.7 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;
|
|
// A dump of the running game for a level load stuck in `stage` for `seconds`, sent as a stuck-load
|
|
// report (not a crash) with the log. The game goes on; a later crash is still captured. Waits for
|
|
// the helper (all the game's threads are held still while it writes the dump), so never call it
|
|
// from a game thread. False while reporting is off, another capture is in hand, or the helper did
|
|
// not answer.
|
|
bool capture_stuck_load(std::wstring_view stage, DWORD seconds) 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;
|
|
// Whether the GPU's breadcrumbs (DRED) are recorded this launch: the report's gpu.breadcrumbs tag.
|
|
void set_gpu_breadcrumbs(bool on) noexcept;
|
|
}
|