Author: stefan2
Date: Sun Nov 4 10:25:21 2012
New Revision: 1405519
URL: http://svn.apache.org/viewvc?rev=1405519&view=rev
Log:
Fix address formatting in our crash reporter under Win64. We must display
addresses using 16 hex digits and use DWORD_PTR (4 / 8 bytes) instead of
DWORD (always 4 bytes) when casting void* to addresses.
* subversion/libsvn_subr/win32_crashrpt.c
(FORMAT_PTR): new macro
(write_module_info_callback,
format_basic_type,
format_value): use macro for formatting; properly cast addresses
Modified:
subversion/trunk/subversion/libsvn_subr/win32_crashrpt.c
Modified: subversion/trunk/subversion/libsvn_subr/win32_crashrpt.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/win32_crashrpt.c?rev=1405519&r1=1405518&r2=1405519&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/win32_crashrpt.c (original)
+++ subversion/trunk/subversion/libsvn_subr/win32_crashrpt.c Sun Nov 4
10:25:21 2012
@@ -46,6 +46,12 @@ HANDLE dbghelp_dll = INVALID_HANDLE_VALU
#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 +164,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);
@@ -268,9 +274,9 @@ format_basic_type(char *buf, DWORD basic
case 2: /* btChar */
{
if (!IsBadStringPtr(*(PSTR*)address, 32))
- sprintf(buf, "\"%.31s\"", *(unsigned long *)address);
+ sprintf(buf, "\"%.31s\"", *(const char **)address);
else
- sprintf(buf, "0x%08x", (int)*(unsigned long *)address);
+ sprintf(buf, FORMAT_PTR, *(DWORD_PTR *)address);
}
case 6: /* btInt */
sprintf(buf, "%d", *(int *)address);
@@ -279,7 +285,7 @@ format_basic_type(char *buf, DWORD basic
sprintf(buf, "%f", *(float *)address);
break;
default:
- sprintf(buf, "0x%08x", *(unsigned long *)address);
+ sprintf(buf, FORMAT_PTR, *(DWORD_PTR *)address);
break;
}
break;
@@ -290,7 +296,8 @@ format_basic_type(char *buf, DWORD basic
sprintf(buf, "0x%016I64X", *(unsigned __int64 *)address);
break;
default:
- sprintf(buf, "[unhandled type 0x%08x of length 0x%08x]", basic_type,
length);
+ sprintf(buf, "[unhandled type 0x%08x of length " FORMAT_PTR "]",
+ basic_type, length);
break;
}
}
@@ -328,14 +335,14 @@ format_value(char *value_str, DWORD64 mo
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);
}
@@ -352,12 +359,12 @@ format_value(char *value_str, DWORD64 mo
/* print a char * as a string */
if (ptr == 1 && length == 1)
{
- sprintf(value_str, "0x%08x \"%s\"",
- *(DWORD *)value_addr, (char *)*(DWORD*)value_addr);
+ sprintf(value_str, FORMAT_PTR " \"%s\"",
+ *(DWORD_PTR *)value_addr, *(const char **)value_addr);
}
else if (ptr >= 1)
{
- sprintf(value_str, "0x%08x", *(DWORD *)value_addr);
+ sprintf(value_str, FORMAT_PTR, *(DWORD_PTR *)value_addr);
}
else if (SymGetTypeInfo_(proc, mod_base, type, TI_GET_BASETYPE, &bt))
{
@@ -366,10 +373,10 @@ format_value(char *value_str, DWORD64 mo
}
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);