diff options
Diffstat (limited to 'subversion/libsvn_subr/win32_crashrpt.c')
-rw-r--r-- | subversion/libsvn_subr/win32_crashrpt.c | 85 |
1 files changed, 52 insertions, 33 deletions
diff --git a/subversion/libsvn_subr/win32_crashrpt.c b/subversion/libsvn_subr/win32_crashrpt.c index d91cd06..4b665c1 100644 --- a/subversion/libsvn_subr/win32_crashrpt.c +++ b/subversion/libsvn_subr/win32_crashrpt.c @@ -21,6 +21,9 @@ * ==================================================================== */ +/* prevent "empty compilation unit" warning on e.g. UNIX */ +typedef int win32_crashrpt__dummy; + #ifdef WIN32 #ifdef SVN_USE_WIN32_CRASHHANDLER @@ -30,6 +33,7 @@ #include <direct.h> #include <stdio.h> #include <stdlib.h> +#include <time.h> #include "svn_version.h" @@ -46,6 +50,12 @@ HANDLE dbghelp_dll = INVALID_HANDLE_VALUE; #define LOGFILE_PREFIX "svn-crash-log" +#if defined(_M_IX86) +#define FORMAT_PTR "0x%08x" +#elif defined(_M_X64) +#define FORMAT_PTR "0x%016I64x" +#endif + /*** Code. ***/ /* Convert a wide-character string to utf-8. This function will create a buffer @@ -158,7 +168,7 @@ write_module_info_callback(void *data, MINIDUMP_MODULE_CALLBACK module = callback_input->Module; char *buf = convert_wbcs_to_utf8(module.FullPath); - fprintf(log_file, "0x%08x", module.BaseOfImage); + fprintf(log_file, FORMAT_PTR, module.BaseOfImage); fprintf(log_file, " %s", buf); free(buf); @@ -257,10 +267,10 @@ format_basic_type(char *buf, DWORD basic_type, DWORD64 length, void *address) switch(length) { case 1: - sprintf(buf, "%x", *(unsigned char *)address); + sprintf(buf, "0x%02x", (int)*(unsigned char *)address); break; case 2: - sprintf(buf, "%x", *(unsigned short *)address); + sprintf(buf, "0x%04x", (int)*(unsigned short *)address); break; case 4: switch(basic_type) @@ -268,9 +278,9 @@ format_basic_type(char *buf, DWORD basic_type, DWORD64 length, void *address) case 2: /* btChar */ { if (!IsBadStringPtr(*(PSTR*)address, 32)) - sprintf(buf, "\"%.31s\"", *(unsigned long *)address); + sprintf(buf, "\"%.31s\"", *(const char **)address); else - sprintf(buf, "%x", *(unsigned long *)address); + sprintf(buf, FORMAT_PTR, *(DWORD_PTR *)address); } case 6: /* btInt */ sprintf(buf, "%d", *(int *)address); @@ -279,7 +289,7 @@ format_basic_type(char *buf, DWORD basic_type, DWORD64 length, void *address) sprintf(buf, "%f", *(float *)address); break; default: - sprintf(buf, "%x", *(unsigned long *)address); + sprintf(buf, FORMAT_PTR, *(DWORD_PTR *)address); break; } break; @@ -287,7 +297,11 @@ format_basic_type(char *buf, DWORD basic_type, DWORD64 length, void *address) if (basic_type == 8) /* btFloat */ sprintf(buf, "%lf", *(double *)address); else - sprintf(buf, "%I64X", *(unsigned __int64 *)address); + sprintf(buf, "0x%016I64X", *(unsigned __int64 *)address); + break; + default: + sprintf(buf, "[unhandled type 0x%08x of length " FORMAT_PTR "]", + basic_type, length); break; } } @@ -297,7 +311,7 @@ format_basic_type(char *buf, DWORD basic_type, DWORD64 length, void *address) static void format_value(char *value_str, DWORD64 mod_base, DWORD type, void *value_addr) { - DWORD tag; + DWORD tag = 0; int ptr = 0; HANDLE proc = GetCurrentProcess(); @@ -325,17 +339,19 @@ format_value(char *value_str, DWORD64 mod_base, DWORD type, void *value_addr) LocalFree(type_name_wbcs); if (ptr == 0) - sprintf(value_str, "(%s) 0x%08x", - type_name, (DWORD *)value_addr); + sprintf(value_str, "(%s) " FORMAT_PTR, + type_name, (DWORD_PTR *)value_addr); else if (ptr == 1) - sprintf(value_str, "(%s *) 0x%08x", - type_name, *(DWORD *)value_addr); + sprintf(value_str, "(%s *) " FORMAT_PTR, + type_name, *(DWORD_PTR *)value_addr); else - sprintf(value_str, "(%s **) 0x%08x", - type_name, (DWORD *)value_addr); + sprintf(value_str, "(%s **) " FORMAT_PTR, + type_name, *(DWORD_PTR *)value_addr); free(type_name); } + else + sprintf(value_str, "[no symbol tag]"); } break; case 16: /* SymTagBaseType */ @@ -347,29 +363,28 @@ format_value(char *value_str, DWORD64 mod_base, DWORD type, void *value_addr) /* print a char * as a string */ if (ptr == 1 && length == 1) { - sprintf(value_str, "0x%08x \"%s\"", - *(DWORD *)value_addr, (char *)*(DWORD*)value_addr); - break; + sprintf(value_str, FORMAT_PTR " \"%s\"", + *(DWORD_PTR *)value_addr, *(const char **)value_addr); } - if (ptr >= 1) + else if (ptr >= 1) { - sprintf(value_str, "0x%08x", *(DWORD *)value_addr); - break; + sprintf(value_str, FORMAT_PTR, *(DWORD_PTR *)value_addr); } - if (SymGetTypeInfo_(proc, mod_base, type, TI_GET_BASETYPE, &bt)) + else if (SymGetTypeInfo_(proc, mod_base, type, TI_GET_BASETYPE, &bt)) { format_basic_type(value_str, bt, length, value_addr); - break; } } break; case 12: /* SymTagEnum */ - sprintf(value_str, "%d", *(DWORD *)value_addr); + sprintf(value_str, "%d", *(DWORD_PTR *)value_addr); break; case 13: /* SymTagFunctionType */ - sprintf(value_str, "0x%08x", *(DWORD *)value_addr); + sprintf(value_str, FORMAT_PTR, *(DWORD_PTR *)value_addr); + break; + default: + sprintf(value_str, "[unhandled tag: %d]", tag); break; - default: break; } } @@ -412,13 +427,15 @@ write_var_values(PSYMBOL_INFO sym_info, ULONG sym_size, void *baton) format_value(value_str, sym_info->ModBase, sym_info->TypeIndex, (void *)var_data); - fprintf(log_file, "%s=%s", sym_info->Name, value_str); + fprintf(log_file, "%.*s=%s", (int)sym_info->NameLen, sym_info->Name, + value_str); } - if (log_params == FALSE && sym_info->Flags & SYMFLAG_LOCAL) + if (!log_params && sym_info->Flags & SYMFLAG_LOCAL) { format_value(value_str, sym_info->ModBase, sym_info->TypeIndex, (void *)var_data); - fprintf(log_file, " %s = %s\n", sym_info->Name, value_str); + fprintf(log_file, " %.*s = %s\n", (int)sym_info->NameLen, + sym_info->Name, value_str); } return TRUE; @@ -451,8 +468,10 @@ write_function_detail(STACKFRAME64 stack_frame, int nr_of_frame, FILE *log_file) if (SymFromAddr_(proc, stack_frame.AddrPC.Offset, &func_disp, pIHS)) { fprintf(log_file, - "#%d 0x%08I64x in %.200s(", - nr_of_frame, stack_frame.AddrPC.Offset, pIHS->Name); + "#%d 0x%08I64x in %.*s(", + nr_of_frame, stack_frame.AddrPC.Offset, + pIHS->NameLen > 200 ? 200 : (int)pIHS->NameLen, + pIHS->Name); /* restrict symbol enumeration to this frame only */ ih_stack_frame.InstructionOffset = stack_frame.AddrPC.Offset; @@ -724,13 +743,13 @@ svn__unhandled_exception_filter(PEXCEPTION_POINTERS ptrs) return EXCEPTION_CONTINUE_SEARCH; /* ... or if we can't create the log files ... */ - if (get_temp_filename(dmp_filename, LOGFILE_PREFIX, "dmp") == FALSE || - get_temp_filename(log_filename, LOGFILE_PREFIX, "log") == FALSE) + if (!get_temp_filename(dmp_filename, LOGFILE_PREFIX, "dmp") || + !get_temp_filename(log_filename, LOGFILE_PREFIX, "log")) return EXCEPTION_CONTINUE_SEARCH; /* If we can't load a recent version of the dbghelp.dll, pass on this exception */ - if (load_dbghelp_dll() == FALSE) + if (!load_dbghelp_dll()) return EXCEPTION_CONTINUE_SEARCH; /* open log file */ |