X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bccebf423e34203bb20f22ac5b52c756aba29e26..f8cf41c8401043b29a756dc6a3efed702b31433c:/src/xbt/backtrace_windows.c diff --git a/src/xbt/backtrace_windows.c b/src/xbt/backtrace_windows.c index 16cdd74a4b..154c31232b 100644 --- a/src/xbt/backtrace_windows.c +++ b/src/xbt/backtrace_windows.c @@ -1,4 +1,4 @@ -/* $Id: ex.c 5173 2008-01-07 22:10:52Z mquinson $ */ +/* $Id$ */ /* backtrace_windows - backtrace displaying on windows platform */ /* This file is included by ex.c on need (windows x86) */ @@ -10,12 +10,13 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ /* - * Win32 (x86) implementation backtrace, backtrace_symbols - * : support for application self-debugging. + * Win32 (x86) implementation backtrace, backtrace_symbols: + * support for application self-debugging. */ #include + /* Pointer function to SymInitialize() */ typedef BOOL(WINAPI * xbt_pfn_sym_initialize_t) (HANDLE, PSTR, BOOL); @@ -70,11 +71,94 @@ typedef struct s_xbt_debug_help { /* the address to the unique reference to the debug help library interface */ static xbt_debug_hlp_t dbg_hlp = NULL; -/* initialize the debug help library */ -static int dbg_hlp_init(HANDLE process_handle); +/* Module creation/destruction: nothing to do on linux */ +void xbt_backtrace_init(void) { + HANDLE process_handle = GetCurrentProcess(); + + if (dbg_hlp) { + /* debug help is already loaded */ + return; + } + + /* allocation */ + dbg_hlp = xbt_new0(s_xbt_debug_hlp_t, 1); + + /* load the library */ + dbg_hlp->instance = LoadLibraryA("Dbghelp.dll"); + + if (!dbg_hlp->instance) { + free(dbg_hlp); + dbg_hlp = NULL; + return; + } + + /* get the pointers to debug help library exported functions */ + dbg_hlp->sym_initialize = + (xbt_pfn_sym_initialize_t) GetProcAddress(dbg_hlp->instance, "SymInitialize"); + + dbg_hlp->sym_cleanup = + (xbt_pfn_sym_cleanup_t) GetProcAddress(dbg_hlp->instance, "SymCleanup"); + + dbg_hlp->sym_function_table_access = + (xbt_pfn_sym_function_table_access_t) GetProcAddress(dbg_hlp->instance, "SymFunctionTableAccess"); + + dbg_hlp->sym_get_line_from_addr = + (xbt_pfn_sym_get_line_from_addr_t) GetProcAddress(dbg_hlp->instance, "SymGetLineFromAddr"); + + dbg_hlp->sym_get_module_base = + (xbt_pfn_sym_get_module_base_t) GetProcAddress(dbg_hlp->instance, "SymGetModuleBase"); + + dbg_hlp->sym_get_options = + (xbt_pfn_sym_get_options_t) GetProcAddress(dbg_hlp->instance, "SymGetOptions"); + + dbg_hlp->sym_get_sym_from_addr = + (xbt_pfn_sym_get_sym_from_addr_t) GetProcAddress(dbg_hlp->instance, "SymGetSymFromAddr"); + + dbg_hlp->sym_set_options = + (xbt_pfn_sym_set_options_t) GetProcAddress(dbg_hlp->instance, "SymSetOptions"); + + dbg_hlp->stack_walk = + (xbt_pfn_stack_walk_t) GetProcAddress(dbg_hlp->instance, "StackWalk"); + + /* Check that everything worked well */ + if (!dbg_hlp->sym_initialize || + !dbg_hlp->sym_cleanup || + !dbg_hlp->sym_function_table_access || + !dbg_hlp->sym_get_line_from_addr || + !dbg_hlp->sym_get_module_base || + !dbg_hlp->sym_get_options || + !dbg_hlp->sym_get_sym_from_addr || + !dbg_hlp->sym_set_options || + !dbg_hlp->stack_walk + ) { + FreeLibrary(dbg_hlp->instance); + free(dbg_hlp); + dbg_hlp = NULL; + return; + } + + dbg_hlp->process_handle = process_handle; + + (*(dbg_hlp->sym_set_options)) ((*(dbg_hlp->sym_get_options)) () | + SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS); + + if (!(*(dbg_hlp->sym_initialize)) (dbg_hlp->process_handle, 0, 1)) { + FreeLibrary(dbg_hlp->instance); + free(dbg_hlp); + dbg_hlp = NULL; + } +} +void xbt_backtrace_exit(void) { + if (!dbg_hlp) + return; + + if ((dbg_hlp->sym_cleanup) (dbg_hlp->process_handle)) + FreeLibrary(dbg_hlp->instance); + -/* finalize the debug help library */ -static int dbg_hlp_finalize(void); + free(dbg_hlp); + dbg_hlp = NULL; +} /* * backtrace() function. @@ -139,11 +223,11 @@ int backtrace(void **buffer, int size) /* ebp points on stack base */ /* esp points on stack pointer, ie on last stacked element (current element) */ _asm call $ + 5 - _asm pop eax - _asm mov context.Eip, eax - _asm mov eax, esp - _asm mov context.Esp, eax - _asm mov context.Ebp, ebp dbg_hlp_init(GetCurrentProcess()); + _asm pop eax + _asm mov context.Eip, eax + _asm mov eax, esp + _asm mov context.Esp, eax + _asm mov context.Ebp, ebp if ((NULL == dbg_hlp) || (size <= 0) || (NULL == buffer)) { errno = EINVAL; @@ -167,11 +251,6 @@ int backtrace(void **buffer, int size) while (pos < size) { stack_frame = (void *) xbt_new0(STACKFRAME, 1); - if (!stack_frame) { - errno = ENOMEM; - break; - } - stack_frame->AddrPC.Offset = context.Eip; stack_frame->AddrPC.Mode = AddrModeFlat; @@ -238,11 +317,6 @@ char **backtrace_symbols(void *const *buffer, int size) strings = xbt_new0(char *, size); - if (NULL == strings) { - errno = ENOMEM; - return NULL; - } - pSym = (IMAGEHLP_SYMBOL *) __buffer; pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL); @@ -284,157 +358,5 @@ char **backtrace_symbols(void *const *buffer, int size) strings = NULL; } - dbg_hlp_finalize(); - return strings; } - -static int dbg_hlp_init(HANDLE process_handle) -{ - if (dbg_hlp) { - /* debug help is already loaded */ - return 0; - } - - /* allocation */ - dbg_hlp = xbt_new0(s_xbt_debug_hlp_t, 1); - - if (!dbg_hlp) - return ENOMEM; - - /* load the library */ - dbg_hlp->instance = LoadLibraryA("Dbghelp.dll"); - - if (!(dbg_hlp->instance)) { - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - /* get the pointers to debug help library exported functions */ - - if (! - ((dbg_hlp->sym_initialize) = - (xbt_pfn_sym_initialize_t) GetProcAddress(dbg_hlp->instance, - "SymInitialize"))) { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - if (! - ((dbg_hlp->sym_cleanup) = - (xbt_pfn_sym_cleanup_t) GetProcAddress(dbg_hlp->instance, - "SymCleanup"))) { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - if (! - ((dbg_hlp->sym_function_table_access) = - (xbt_pfn_sym_function_table_access_t) GetProcAddress(dbg_hlp->instance, - "SymFunctionTableAccess"))) - { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - if (! - ((dbg_hlp->sym_get_line_from_addr) = - (xbt_pfn_sym_get_line_from_addr_t) GetProcAddress(dbg_hlp->instance, - "SymGetLineFromAddr"))) - { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - if (! - ((dbg_hlp->sym_get_module_base) = - (xbt_pfn_sym_get_module_base_t) GetProcAddress(dbg_hlp->instance, - "SymGetModuleBase"))) { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - if (! - ((dbg_hlp->sym_get_options) = - (xbt_pfn_sym_get_options_t) GetProcAddress(dbg_hlp->instance, - "SymGetOptions"))) { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - if (! - ((dbg_hlp->sym_get_sym_from_addr) = - (xbt_pfn_sym_get_sym_from_addr_t) GetProcAddress(dbg_hlp->instance, - "SymGetSymFromAddr"))) - { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - if (! - ((dbg_hlp->sym_set_options) = - (xbt_pfn_sym_set_options_t) GetProcAddress(dbg_hlp->instance, - "SymSetOptions"))) { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - if (! - ((dbg_hlp->stack_walk) = - (xbt_pfn_stack_walk_t) GetProcAddress(dbg_hlp->instance, - "StackWalk"))) { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - dbg_hlp->process_handle = process_handle; - - (*(dbg_hlp->sym_set_options)) ((*(dbg_hlp->sym_get_options)) () | - SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS); - - if (!(*(dbg_hlp->sym_initialize)) (dbg_hlp->process_handle, 0, 1)) { - FreeLibrary(dbg_hlp->instance); - free(dbg_hlp); - dbg_hlp = NULL; - return (int) GetLastError(); - } - - - return 0; -} - -static int dbg_hlp_finalize(void) -{ - if (!dbg_hlp) - return EINVAL; - - if (!(*(dbg_hlp->sym_cleanup)) (dbg_hlp->process_handle)) - return (int) GetLastError(); - - if (!FreeLibrary(dbg_hlp->instance)) - return (int) GetLastError(); - - free(dbg_hlp); - dbg_hlp = NULL; - - return 0; -}