-const char * xbt_ex_catname(xbt_errcat_t cat) {
- switch (cat) {
- case unknown_error: return "unknown_err";
- case arg_error: return "invalid_arg";
- case mismatch_error: return "mismatch";
- case not_found_error: return "not found";
- case system_error: return "system_err";
- case network_error: return "network_err";
- case timeout_error: return "timeout";
- case thread_error: return "thread_err";
- default: return "INVALID_ERR";
- }
-}
-
-#ifndef HAVE_EXECINFO_H
-# if (defined(WIN32) && defined(_M_IX86))
-int
-backtrace (void **buffer, int size)
-{
- int pos = 0;
- STACKFRAME* stack_frame;
- int first = 1;
-
- IMAGEHLP_SYMBOL * pSym;
- unsigned long displacement = 0;
- IMAGEHLP_LINE line_info = {0};
- byte __buffer[(sizeof(SYMBOL_INFO) +MAX_SYM_NAME * sizeof(TCHAR) + sizeof(ULONG64) - 1) / sizeof(ULONG64)];
-
- CONTEXT context = {CONTEXT_FULL};
- GetThreadContext(GetCurrentThread(), &context);
-
- /* ebp pointe sur la base de la pile */
- /* esp pointe sur le stack pointer <=> sur le dernier élément déposé dans la pile (l'élément courant) */
- _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());
-
- if((NULL == dbg_hlp) || (size <= 0) || (NULL == buffer))
- {
- errno = EINVAL;
- return 0;
- }
-
- for(pos = 0; pos < size; pos++)
- buffer[pos] = NULL;
-
- pos = 0;
-
- pSym = (IMAGEHLP_SYMBOL*)__buffer;
-
- pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL);
- pSym->MaxNameLength = MAX_SYM_NAME;
-
-
- line_info.SizeOfStruct = sizeof(IMAGEHLP_LINE);
-
-
- while(pos < size)
- {
- stack_frame = (void*)calloc(1,sizeof(STACKFRAME));
-
- if(!stack_frame)
- {
- errno = ENOMEM;
- break;
- }
-
- stack_frame->AddrPC.Offset = context.Eip;
- stack_frame->AddrPC.Mode = AddrModeFlat;
-
- stack_frame->AddrFrame.Offset = context.Ebp;
- stack_frame->AddrFrame.Mode = AddrModeFlat;
-
- stack_frame->AddrStack.Offset = context.Esp;
- stack_frame->AddrStack.Mode = AddrModeFlat;
-
- if((*(dbg_hlp->stack_walk))(
- IMAGE_FILE_MACHINE_I386,
- dbg_hlp->process_handle,
- GetCurrentThread(),
- stack_frame,
- &context,
- NULL,
- dbg_hlp->sym_function_table_access,
- dbg_hlp->sym_get_module_base,
- NULL)
- && !first)
- {
- if(stack_frame->AddrReturn.Offset)
- {
-
- if((*(dbg_hlp->sym_get_sym_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &displacement,pSym))
- {
- if((*(dbg_hlp->sym_get_line_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &displacement,&line_info))
- buffer[pos++] = (void*)stack_frame;
- }
- }
- else
- {
- free(stack_frame); /* no symbol or no line info */
- break;
- }
- }
- else
- {
- free(stack_frame);
-
- if(first)
- first = 0;
- else
- break;
- }
- }
-
- return pos;
-}
-
-char **
-backtrace_symbols (void *const *buffer, int size)
-{
- int pos;
- int success = 0;
- char** strings;
- STACKFRAME* stack_frame;
- char str[MAX_SYM_NAME] = {0};
- IMAGEHLP_SYMBOL * pSym;
- unsigned long displacement = 0;
- IMAGEHLP_LINE line_info = {0};
- IMAGEHLP_MODULE module = {0};
- byte __buffer[(sizeof(SYMBOL_INFO) +MAX_SYM_NAME * sizeof(TCHAR) + sizeof(ULONG64) - 1) / sizeof(ULONG64)];
-
- if((NULL == dbg_hlp) || (size <= 0) || (NULL == buffer))
- {
- errno = EINVAL;
- return NULL;
- }
-
- strings = (char**)calloc(size,sizeof(char*));
-
- if(NULL == strings)
- {
- errno = ENOMEM;
- return NULL;
- }
-
- pSym = (IMAGEHLP_SYMBOL*)__buffer;
-
- pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL);
- pSym->MaxNameLength = MAX_SYM_NAME;
-
-
- line_info.SizeOfStruct = sizeof(IMAGEHLP_LINE);
- module.SizeOfStruct = sizeof(IMAGEHLP_MODULE);
-
- for(pos = 0; pos < size; pos++)
- {
- stack_frame = (STACKFRAME*)(buffer[pos]);
-
- if(NULL != stack_frame)
- {
-
- if((*(dbg_hlp->sym_get_sym_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &displacement,pSym))
- {
- if((*(dbg_hlp->sym_get_line_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &displacement,&line_info))
- {
-
- sprintf(str,"** In %s() at %s:%d", pSym->Name,line_info.FileName,line_info.LineNumber);
-
- strings[pos] = strdup(str);
- memset(str,0,MAX_SYM_NAME);
-
- success = 1;
- }
- else
- {
- strings[pos] = strdup("<no line>");
- }
- }
- else
- {
- strings[pos] = strdup("<no symbole>");
- }
-
- free(stack_frame);
- }
- else
- break;
- }
-
- if(!success)
- {
- free(strings);
- strings = NULL;
- }
-
- dbg_hlp_finalize();
-
- return strings;
-}
-
-void
-backtrace_symbols_fd(void *const *buffer, int size, int fd)