示例#1
0
// 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);
}