#if (defined(WIN32) && defined(_M_IX86))
/*
- * Win32 (x86) implementation backtrace, backtrace_symbols, backtrace_symbols_fd
+ * Win32 (x86) implementation backtrace, backtrace_symbols
* : support for application self-debugging.
*/
char **
backtrace_symbols (void *const *buffer, int size);
-/*
- * backtrace_symbols_fd() function.
- *
- * Same as backtrace_symbols() function but, the the array of strings is wrotten
- * in a file (fd is the file descriptor of this file)
- */
-void
-backtrace_symbols_fd(void *const *buffer, int size, int fd);
#endif
/* default __ex_ctx callback function */
for(i=0; i<e->used; i++)
{
- e->bt_strings[i] = strdup(backtrace[i]);
+ e->bt_strings[i] = xbt_strdup(backtrace[i]);
free(backtrace[i]);
}
int first = 1;
IMAGEHLP_SYMBOL * pSym;
- unsigned long displacement = 0;
+ unsigned long offset = 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) */
+ /* 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
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_sym_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &offset,pSym))
{
- if((*(dbg_hlp->sym_get_line_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &displacement,&line_info))
+ if((*(dbg_hlp->sym_get_line_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &offset,&line_info))
buffer[pos++] = (void*)stack_frame;
}
}
int success = 0;
char** strings;
STACKFRAME* stack_frame;
- char str[MAX_SYM_NAME] = {0};
IMAGEHLP_SYMBOL * pSym;
- unsigned long displacement = 0;
+ unsigned long offset = 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 != 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_sym_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &offset,pSym))
{
- if((*(dbg_hlp->sym_get_line_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &displacement,&line_info))
+ if((*(dbg_hlp->sym_get_line_from_addr))(dbg_hlp->process_handle,stack_frame->AddrPC.Offset, &offset,&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;
+ strings[pos] = bprintf("** In %s() at %s:%d", pSym->Name,line_info.FileName,line_info.LineNumber);
}
else
{
- strings[pos] = strdup("<no line>");
+ strings[pos] = bprintf("** In %s()", pSym->Name);
}
+ success = 1;
}
else
{
- strings[pos] = strdup("<no symbole>");
+ strings[pos] = xbt_strdup("** <no symbol>");
}
free(stack_frame);
return strings;
}
-void
-backtrace_symbols_fd(void *const *buffer, int size, int fd)
-{
- int pos;
- int success = 0;
- 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) || (-1 == fd))
- {
- errno = EINVAL;
- return;
- }
-
- 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\n", pSym->Name,line_info.FileName,line_info.LineNumber);
-
- if(-1 == write(fd,str,strlen(str)))
- break;
-
- memset(str,0,MAX_SYM_NAME);
-
- success = 1;
- }
- }
-
- free(stack_frame);
- }
- else
- break;
- }
-
- dbg_hlp_finalize();
-
-}
-
static int
dbg_hlp_init(HANDLE process_handle)
{