// Initializes the symbol files BOOL InitSymInfo( PCSTR lpszInitialSymbolPath ) { CHAR lpszSymbolPath[BUFFERSIZE]; DWORD symOptions = SymGetOptions(); symOptions |= SYMOPT_LOAD_LINES; symOptions &= ~SYMOPT_UNDNAME; SymSetOptions( symOptions ); InitSymbolPath( lpszSymbolPath, lpszInitialSymbolPath ); return SymInitialize( GetCurrentProcess(), lpszSymbolPath, TRUE); }
static void JKG_WriteStackCrawl( fileHandle_t *f, DWORD *stackCrawl ) { int i, dmod, gotsource, sourcedisp; HANDLE proc, thread; IMAGEHLP_LINE line; DWORD disp; char ModName[260]; static char SymPath[4096]; static char basepath[260]; static char fspath[260]; PIMAGEHLP_SYMBOL sym = (PIMAGEHLP_SYMBOL)malloc(1024); proc = GetCurrentProcess(); thread = GetCurrentThread(); SymPath[0] = 0; basepath[0] = 0; fspath[0] = 0; InitSymbolPath(SymPath, NULL); SymInitialize(proc, SymPath, TRUE); memset(sym, 0, 1024); sym->MaxNameLength = 800; sym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL); for(i = 0; i < MAX_JKG_ASSERT_STACK_CRAWL; i++) { if(stackCrawl[i] == 0) continue; // Grab the base address of the module that's the problem atm dmod = SymGetModuleBase(proc, stackCrawl[i]); if (!dmod) { strcpy(ModName,"Unknown"); } else { GetModuleBaseName(proc,(HMODULE)dmod, ModName, 260); } if (SymGetLineFromAddr(proc, stackCrawl[i], (PDWORD)&sourcedisp, &line)) { gotsource = 1; } else { gotsource = 0; } if (SymGetSymFromAddr(proc, stackCrawl[i], &disp, sym)) { if (gotsource) { JKG_WriteToAssertLogEasy(va("%s::%s(+0x%X) [0x%08X] - (%s:%i)\r\n", ModName, sym->Name, disp, stackCrawl[i], line.FileName, line.LineNumber), f); } else { JKG_WriteToAssertLogEasy(va("%s::%s(+0x%X) [0x%08X]\r\n", ModName, sym->Name, disp, stackCrawl[i]), f); } } else { if (gotsource) { // Not likely... JKG_WriteToAssertLogEasy(va("%s [0x%08X] - (%s:%i)\r\n", ModName, stackCrawl[i], line.FileName, line.LineNumber), f); } else { JKG_WriteToAssertLogEasy(va("%s [0x%08X]\r\n", ModName, stackCrawl[i]), f); } } } free(sym); JKG_WriteToAssertLogEasy("\r\n", f); }