12 #include "../../stdafx.h"
13 #include "../../crashlog.h"
14 #include "../../string_func.h"
15 #include "../../gamelog.h"
16 #include "../../saveload/saveload.h"
20 #include <sys/utsname.h>
22 #if defined(__GLIBC__)
24 # include <execinfo.h>
26 # include <ucontext.h>
30 #if defined(__NetBSD__)
34 #include "../../safeguards.h"
43 char *LogOSVersion(
char *buffer,
const char *last)
const
46 if (uname(&name) < 0) {
47 return buffer +
seprintf(buffer, last,
"Could not get OS version: %s\n", strerror(errno));
50 return buffer +
seprintf(buffer, last,
63 char *LogError(
char *buffer,
const char *last,
const char *
message)
const
65 return buffer +
seprintf(buffer, last,
71 message == NULL ?
"<none>" : message
77 struct StackWalkerParams {
90 static int SunOSStackWalker(uintptr_t pc,
int sig,
void *params)
92 StackWalkerParams *wp = (StackWalkerParams *)params;
96 if (dladdr((
void *)pc, &dli) != 0) {
97 *wp->bufptr +=
seprintf(*wp->bufptr, wp->last,
" [%02i] %s(%s+0x%x) [0x%x]\n",
98 wp->counter, dli.dli_fname, dli.dli_sname, (
int)((byte *)pc - (byte *)dli.dli_saddr), (uint)pc);
100 *wp->bufptr +=
seprintf(*wp->bufptr, wp->last,
" [%02i] [0x%x]\n", wp->counter, (uint)pc);
108 char *LogStacktrace(
char *buffer,
const char *last)
const
110 buffer +=
seprintf(buffer, last,
"Stacktrace:\n");
111 #if defined(__GLIBC__)
113 int trace_size = backtrace(trace,
lengthof(trace));
115 char **messages = backtrace_symbols(trace, trace_size);
116 for (
int i = 0; i < trace_size; i++) {
117 buffer +=
seprintf(buffer, last,
" [%02i] %s\n", i, messages[i]);
122 if (getcontext(&uc) != 0) {
123 buffer +=
seprintf(buffer, last,
" getcontext() failed\n\n");
127 StackWalkerParams wp = { &buffer, last, 0 };
128 walkcontext(&uc, &CrashLogUnix::SunOSStackWalker, &wp);
130 buffer +=
seprintf(buffer, last,
" Not supported.\n");
132 return buffer +
seprintf(buffer, last,
"\n");
156 for (
const int *i = _signals_to_handle; i !=
endof(_signals_to_handle); i++) {
161 printf(
"A serious fault condition occurred in the game. The game will shut down.\n");
162 printf(
"As you loaded an emergency savegame no crash information will be generated.\n");
167 printf(
"A serious fault condition occurred in the game. The game will shut down.\n");
168 printf(
"As you loaded an savegame for which you do not have the required NewGRFs\n");
169 printf(
"no crash information will be generated.\n");
182 for (
const int *i = _signals_to_handle; i !=
endof(_signals_to_handle); i++) {