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++) {