Store some desync messages in a ring buffer, append to log on desync

desync-debugging
Jonathan G Rennison 5 years ago
parent 816d0fe723
commit d0b95ef8b3

@ -763,8 +763,10 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
SetTownRatingTestMode(false);
if (!random_state.Check()) {
DEBUG(desync, 0, "Random seed changed in test command: date{%08x; %02x}; company: %02x; tile: %06x (%u x %u); p1: %08x; p2: %08x; cmd: %08x; \"%s\" (%s)",
_date, _date_fract, (int)_current_company, tile, TileX(tile), TileY(tile), p1, p2, cmd & ~CMD_NETWORK_COMMAND, text, GetCommandName(cmd));
std::string msg = stdstr_fmt("Random seed changed in test command: company: %02x; tile: %06x (%u x %u); p1: %08x; p2: %08x; cmd: %08x; \"%s\" (%s)",
(int)_current_company, tile, TileX(tile), TileY(tile), p1, p2, cmd & ~CMD_NETWORK_COMMAND, text, GetCommandName(cmd));
DEBUG(desync, 0, "msg: date{%08x; %02x}; %s", _date, _date_fract, msg.c_str());
LogDesyncMsg(std::move(msg));
}
CommandLogEntryFlag log_flags;

@ -398,6 +398,7 @@ char *CrashLog::FillDesyncCrashLog(char *buffer, const char *last) const
buffer = this->LogGamelog(buffer, last);
buffer = this->LogRecentNews(buffer, last);
buffer = this->LogRecentCommands(buffer, last);
buffer = DumpDesyncMsgLog(buffer, last);
bool have_cache_log = false;
extern void CheckCaches(bool force_check, std::function<void(const char *)> log);

@ -14,6 +14,8 @@
#include "string_func.h"
#include "fileio_func.h"
#include "settings_type.h"
#include "date_func.h"
#include <array>
#if defined(_WIN32)
#include "os/windows/win32.h"
@ -266,3 +268,55 @@ const char *GetLogPrefix()
return _log_prefix;
}
struct DesyncMsgLogEntry {
Date date;
DateFract date_fract;
std::string msg;
DesyncMsgLogEntry() { }
DesyncMsgLogEntry(std::string msg)
: date(_date), date_fract(_date_fract), msg(msg) { }
};
static std::array<DesyncMsgLogEntry, 32> desync_msg_log;
static unsigned int desync_msg_log_count = 0;
static unsigned int desync_msg_log_next = 0;
void ClearDesyncMsgLog()
{
desync_msg_log_count = 0;
desync_msg_log_next = 0;
}
char *DumpDesyncMsgLog(char *buffer, const char *last)
{
if (!desync_msg_log_count) return buffer;
const unsigned int count = min<unsigned int>(desync_msg_log_count, desync_msg_log.size());
unsigned int log_index = desync_msg_log_next;
buffer += seprintf(buffer, last, "Desync Msg Log:\n Showing most recent %u of %u messages\n", count, desync_msg_log_count);
for (unsigned int i = 0 ; i < count; i++) {
if (log_index > 0) {
log_index--;
} else {
log_index = desync_msg_log.size() - 1;
}
const DesyncMsgLogEntry &entry = desync_msg_log[log_index];
YearMonthDay ymd;
ConvertDateToYMD(entry.date, &ymd);
buffer += seprintf(buffer, last, " %2u | %4i-%02i-%02i, %2i | %s\n", i, ymd.year, ymd.month + 1, ymd.day, entry.date_fract, entry.msg.c_str());
}
buffer += seprintf(buffer, last, "\n");
return buffer;
}
void LogDesyncMsg(std::string msg)
{
desync_msg_log[desync_msg_log_next] = DesyncMsgLogEntry(std::move(msg));
desync_msg_log_next = (desync_msg_log_next + 1) % desync_msg_log.size();
desync_msg_log_count++;
}

@ -125,4 +125,8 @@ const char *GetLogPrefix();
/** The real time in the game. */
extern uint32 _realtime_tick;
void ClearDesyncMsgLog();
void LogDesyncMsg(std::string msg);
char *DumpDesyncMsgLog(char *buffer, const char *last);
#endif /* DEBUG_H */

@ -31,6 +31,7 @@
#include "viewport_kdtree.h"
#include "newgrf_profiling.h"
#include "command_func.h"
#include "debug.h"
#include "safeguards.h"
@ -65,6 +66,7 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin
AllocateMap(size_x, size_y);
ClearRecentCommandLog();
ClearDesyncMsgLog();
_pause_mode = PM_UNPAUSED;
_fast_forward = 0;

@ -316,6 +316,7 @@ static void ShutdownGame()
UninitFreeType();
ClearRecentCommandLog();
ClearDesyncMsgLog();
}
/**
@ -1152,7 +1153,11 @@ void CheckCaches(bool force_check, std::function<void(const char *)> log)
#define CCLOG(...) { \
seprintf(cclog_buffer, lastof(cclog_buffer), __VA_ARGS__); \
DEBUG(desync, 0, "%s", cclog_buffer); \
if (log) log(cclog_buffer); \
if (log) { \
log(cclog_buffer); \
} else { \
LogDesyncMsg(cclog_buffer); \
} \
}
/* Check the town caches. */

Loading…
Cancel
Save