Crash log: Increase crash log length limit on Unix
Allocate buffer using mmap if possible
This commit is contained in:
@@ -696,7 +696,7 @@ bool CrashLog::WriteScreenshot(char *filename, const char *filename_last, const
|
|||||||
* information like paths to the console.
|
* information like paths to the console.
|
||||||
* @return true when everything is made successfully.
|
* @return true when everything is made successfully.
|
||||||
*/
|
*/
|
||||||
bool CrashLog::MakeCrashLog()
|
bool CrashLog::MakeCrashLog(char *buffer, const char *last)
|
||||||
{
|
{
|
||||||
/* Don't keep looping logging crashes. */
|
/* Don't keep looping logging crashes. */
|
||||||
static bool crashlogged = false;
|
static bool crashlogged = false;
|
||||||
@@ -708,7 +708,6 @@ bool CrashLog::MakeCrashLog()
|
|||||||
}
|
}
|
||||||
|
|
||||||
char filename[MAX_PATH];
|
char filename[MAX_PATH];
|
||||||
char buffer[65536 * 4];
|
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
|
||||||
char *name_buffer_date = this->name_buffer + seprintf(this->name_buffer, lastof(this->name_buffer), "crash-");
|
char *name_buffer_date = this->name_buffer + seprintf(this->name_buffer, lastof(this->name_buffer), "crash-");
|
||||||
@@ -716,7 +715,7 @@ bool CrashLog::MakeCrashLog()
|
|||||||
strftime(name_buffer_date, lastof(this->name_buffer) - name_buffer_date, "%Y%m%dT%H%M%SZ", gmtime(&cur_time));
|
strftime(name_buffer_date, lastof(this->name_buffer) - name_buffer_date, "%Y%m%dT%H%M%SZ", gmtime(&cur_time));
|
||||||
|
|
||||||
printf("Crash encountered, generating crash log...\n");
|
printf("Crash encountered, generating crash log...\n");
|
||||||
this->FillCrashLog(buffer, lastof(buffer));
|
this->FillCrashLog(buffer, last);
|
||||||
printf("%s\n", buffer);
|
printf("%s\n", buffer);
|
||||||
printf("Crash log generated.\n\n");
|
printf("Crash log generated.\n\n");
|
||||||
|
|
||||||
@@ -752,6 +751,12 @@ bool CrashLog::MakeCrashLog()
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CrashLog::MakeCrashLogWithStackBuffer()
|
||||||
|
{
|
||||||
|
char buffer[65536 * 4];
|
||||||
|
return this->MakeCrashLog(buffer, lastof(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a desync crash log, writes it to a file and then subsequently tries
|
* Makes a desync crash log, writes it to a file and then subsequently tries
|
||||||
* to make a crash savegame. It uses DEBUG to write
|
* to make a crash savegame. It uses DEBUG to write
|
||||||
|
@@ -152,7 +152,8 @@ public:
|
|||||||
bool WriteSavegame(char *filename, const char *filename_last, const char *name = "crash") const;
|
bool WriteSavegame(char *filename, const char *filename_last, const char *name = "crash") const;
|
||||||
bool WriteScreenshot(char *filename, const char *filename_last, const char *name = "crash") const;
|
bool WriteScreenshot(char *filename, const char *filename_last, const char *name = "crash") const;
|
||||||
|
|
||||||
bool MakeCrashLog();
|
bool MakeCrashLog(char *buffer, const char *last);
|
||||||
|
bool MakeCrashLogWithStackBuffer();
|
||||||
bool MakeDesyncCrashLog(const std::string *log_in, std::string *log_out, const DesyncExtraInfo &info) const;
|
bool MakeDesyncCrashLog(const std::string *log_in, std::string *log_out, const DesyncExtraInfo &info) const;
|
||||||
bool MakeInconsistencyLog(const InconsistencyExtraInfo &info) const;
|
bool MakeInconsistencyLog(const InconsistencyExtraInfo &info) const;
|
||||||
bool MakeVersionInfoLog() const;
|
bool MakeVersionInfoLog() const;
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
#if defined(WITH_DBG_GDB)
|
#if defined(WITH_DBG_GDB)
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
@@ -585,7 +586,13 @@ static void CDECL HandleCrash(int signum)
|
|||||||
#else
|
#else
|
||||||
CrashLogUnix log(signum);
|
CrashLogUnix log(signum);
|
||||||
#endif
|
#endif
|
||||||
log.MakeCrashLog();
|
const size_t length = 65536 * 16;
|
||||||
|
char *buffer = (char *)mmap(nullptr, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
|
if (buffer != MAP_FAILED) {
|
||||||
|
log.MakeCrashLog(buffer, buffer + length - 1);
|
||||||
|
} else {
|
||||||
|
log.MakeCrashLogWithStackBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
CrashLog::AfterCrashLogCleanup();
|
CrashLog::AfterCrashLogCleanup();
|
||||||
abort();
|
abort();
|
||||||
|
Reference in New Issue
Block a user