summaryrefslogtreecommitdiff
path: root/subversion/libsvn_subr/win32_crashrpt.c
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/libsvn_subr/win32_crashrpt.c')
-rw-r--r--subversion/libsvn_subr/win32_crashrpt.c85
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 */