Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_subr/win32_crashrpt.c view on Meta::CPAN
else
{
ctx = *context;
}
if (context == NULL)
return;
/* Write the stack trace */
ZeroMemory(&stack_frame, sizeof(STACKFRAME64));
stack_frame.AddrPC.Mode = AddrModeFlat;
stack_frame.AddrStack.Mode = AddrModeFlat;
stack_frame.AddrFrame.Mode = AddrModeFlat;
#if defined(_M_IX86)
machine = IMAGE_FILE_MACHINE_I386;
stack_frame.AddrPC.Offset = context->Eip;
stack_frame.AddrStack.Offset = context->Esp;
stack_frame.AddrFrame.Offset = context->Ebp;
#elif defined(_M_X64)
machine = IMAGE_FILE_MACHINE_AMD64;
stack_frame.AddrPC.Offset = context->Rip;
stack_frame.AddrStack.Offset = context->Rsp;
stack_frame.AddrFrame.Offset = context->Rbp;
#elif defined(_M_IA64)
machine = IMAGE_FILE_MACHINE_IA64;
stack_frame.AddrPC.Offset = context->StIIP;
stack_frame.AddrStack.Offset = context->SP;
stack_frame.AddrBStore.Mode = AddrModeFlat;
stack_frame.AddrBStore.Offset = context->RsBSP;
#else
#error Unknown processortype, please disable SVN_USE_WIN32_CRASHHANDLER
#endif
while (1)
{
if (! StackWalk64_(machine, proc, GetCurrentThread(),
&stack_frame, &ctx, NULL,
SymFunctionTableAccess64_, SymGetModuleBase64_, NULL))
{
break;
}
if (i >= skip)
{
/* Try to include symbolic information.
Also check that the address is not zero. Sometimes StackWalk
returns TRUE with a frame of zero. */
if (stack_frame.AddrPC.Offset != 0)
{
write_function_detail(stack_frame, i, log_file);
}
}
i++;
}
#else
#error Unknown processortype, please disable SVN_USE_WIN32_CRASHHANDLER
#endif
}
/* Check if a debugger is attached to this process */
static BOOL
is_debugger_present()
{
HANDLE kernel32_dll = LoadLibrary("kernel32.dll");
BOOL result;
ISDEBUGGERPRESENT IsDebuggerPresent_ =
(ISDEBUGGERPRESENT)GetProcAddress(kernel32_dll, "IsDebuggerPresent");
if (IsDebuggerPresent_ && IsDebuggerPresent_())
result = TRUE;
else
result = FALSE;
FreeLibrary(kernel32_dll);
return result;
}
/* Load the dbghelp.dll file, try to find a version that matches our
requirements. */
static BOOL
load_dbghelp_dll()
{
dbghelp_dll = LoadLibrary(DBGHELP_DLL);
if (dbghelp_dll != INVALID_HANDLE_VALUE)
{
DWORD opts;
/* load the functions */
MiniDumpWriteDump_ =
(MINIDUMPWRITEDUMP)GetProcAddress(dbghelp_dll, "MiniDumpWriteDump");
SymInitialize_ =
(SYMINITIALIZE)GetProcAddress(dbghelp_dll, "SymInitialize");
SymSetOptions_ =
(SYMSETOPTIONS)GetProcAddress(dbghelp_dll, "SymSetOptions");
SymGetOptions_ =
(SYMGETOPTIONS)GetProcAddress(dbghelp_dll, "SymGetOptions");
SymCleanup_ =
(SYMCLEANUP)GetProcAddress(dbghelp_dll, "SymCleanup");
SymGetTypeInfo_ =
(SYMGETTYPEINFO)GetProcAddress(dbghelp_dll, "SymGetTypeInfo");
SymGetLineFromAddr64_ =
(SYMGETLINEFROMADDR64)GetProcAddress(dbghelp_dll,
"SymGetLineFromAddr64");
SymEnumSymbols_ =
(SYMENUMSYMBOLS)GetProcAddress(dbghelp_dll, "SymEnumSymbols");
SymSetContext_ =
(SYMSETCONTEXT)GetProcAddress(dbghelp_dll, "SymSetContext");
SymFromAddr_ = (SYMFROMADDR)GetProcAddress(dbghelp_dll, "SymFromAddr");
StackWalk64_ = (STACKWALK64)GetProcAddress(dbghelp_dll, "StackWalk64");
SymFunctionTableAccess64_ =
(SYMFUNCTIONTABLEACCESS64)GetProcAddress(dbghelp_dll,
"SymFunctionTableAccess64");
SymGetModuleBase64_ =
(SYMGETMODULEBASE64)GetProcAddress(dbghelp_dll, "SymGetModuleBase64");
if (! (MiniDumpWriteDump_ &&
SymInitialize_ && SymSetOptions_ && SymGetOptions_ &&
SymCleanup_ && SymGetTypeInfo_ && SymGetLineFromAddr64_ &&
( run in 0.860 second using v1.01-cache-2.11-cpan-e1769b4cff6 )