Esempio n. 1
0
size_t GetFileLineFromAddress(void* address, char* fileName, size_t size,
                              size_t* lineNumber, size_t* offsetBytes)
{
    if (size) *fileName = 0;
    if (lineNumber) *lineNumber = 0;
    if (offsetBytes) *offsetBytes = 0;
    {
        char* sourceName;
        IMAGEHLP_LINE line = { sizeof (line) };
        GC_ULONG_PTR dwOffset = 0;
        if (!SymGetLineFromAddr(GetSymHandle(), CheckAddress(address), &dwOffset,
                                &line)) {
            return 0;
        }
        if (lineNumber) {
            *lineNumber = line.LineNumber;
        }
        if (offsetBytes) {
            *offsetBytes = dwOffset;
        }
        sourceName = line.FileName;
        /* TODO: resolve relative filenames, found in 'source directories'  */
        /* registered with MSVC IDE.                                        */
        if (size) {
            strncpy(fileName, sourceName, size)[size - 1] = 0;
        }
        return strlen(sourceName);
    }
}
Esempio n. 2
0
size_t GetStackFrames(size_t skip, void* frames[], size_t maxFrames)
{
	HANDLE hProcess = GetSymHandle();
	HANDLE hThread = GetCurrentThread();
	CONTEXT context;
	context.ContextFlags = CONTEXT_FULL;
	if (!GetThreadContext(hThread, &context)) {
		return 0;
	}
	// GetThreadContext might return invalid context for the current thread
#if defined(_M_IX86)
    __asm mov context.Ebp, ebp
#endif
	return GetStackFramesFromContext(hProcess, hThread, &context, skip + 1, frames, maxFrames);
}
Esempio n. 3
0
size_t GetModuleNameFromAddress(void* address, char* moduleName, size_t size)
{
	if (size) *moduleName = 0;
	{
		const char* sourceName;
		IMAGEHLP_MODULE moduleInfo = { sizeof (moduleInfo) };
		if (!SymGetModuleInfo(GetSymHandle(), CheckAddress(address), &moduleInfo)) {
			return 0;
		}
		sourceName = strrchr(moduleInfo.ImageName, '\\');
		if (sourceName) {
			sourceName++;
		} else {
			sourceName = moduleInfo.ImageName;
		}
		if (size) {
			strncpy(moduleName, sourceName, size)[size - 1] = 0;
		}
		return strlen(sourceName);
	}
}
Esempio n. 4
0
size_t GetSymbolNameFromAddress(void* address, char* symbolName, size_t size,
                                size_t* offsetBytes)
{
    if (size) *symbolName = 0;
    if (offsetBytes) *offsetBytes = 0;
    __try {
        ULONG_ADDR dwOffset = 0;
        union {
            IMAGEHLP_SYMBOL sym;
            char symNameBuffer[sizeof(IMAGEHLP_SYMBOL) + MAX_SYM_NAME];
        } u;
        u.sym.SizeOfStruct  = sizeof(u.sym);
        u.sym.MaxNameLength = sizeof(u.symNameBuffer) - sizeof(u.sym);

        if (!SymGetSymFromAddr(GetSymHandle(), CheckAddress(address), &dwOffset,
                               &u.sym)) {
            return 0;
        } else {
            const char* sourceName = u.sym.Name;
            char undName[1024];
            if (UnDecorateSymbolName(u.sym.Name, undName, sizeof(undName),
                                     UNDNAME_NO_MS_KEYWORDS | UNDNAME_NO_ACCESS_SPECIFIERS)) {
                sourceName = undName;
            } else if (SymUnDName(&u.sym, undName, sizeof(undName))) {
                sourceName = undName;
            }
            if (offsetBytes) {
                *offsetBytes = dwOffset;
            }
            if (size) {
                strncpy(symbolName, sourceName, size)[size - 1] = 0;
            }
            return strlen(sourceName);
        }
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        SetLastError(GetExceptionCode());
    }
    return 0;
}
Esempio n. 5
0
static ULONG_ADDR CheckAddress(void* address)
{
    ULONG_ADDR dwAddress = (ULONG_ADDR)(GC_ULONG_PTR)address;
    GetModuleBase(GetSymHandle(), dwAddress);
    return dwAddress;
}