- 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)
-{
- if(dbg_hlp)
- {
- /* debug help is already loaded */
- return 0;
- }
-
- /* allocation */
- dbg_hlp = (xbt_debug_hlp_t)calloc(1,sizeof(s_xbt_debug_hlp_t));
-
- 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;
-}