/** * Adds a symbol to the debug info manager. * * @returns VBox status. * @param pVM VM Handle. * @param ModuleAddress Module address. Use 0 if no module. * @param SymbolAddress Symbol address * @param cbSymbol Size of the symbol. Use 0 if info not available. * @param pszSymbol Symbol name. */ VMMR3DECL(int) DBGFR3SymbolAdd(PVM pVM, RTGCUINTPTR ModuleAddress, RTGCUINTPTR SymbolAddress, RTUINT cbSymbol, const char *pszSymbol) { /* * Validate. */ if (!pszSymbol || !*pszSymbol) { AssertMsgFailed(("No symbol name!\n")); return VERR_INVALID_PARAMETER; } /* * Lazy init. */ if (!pVM->dbgf.s.fSymInited) { int rc = dbgfR3SymLazyInit(pVM); if (RT_FAILURE(rc)) return rc; } #ifdef HAVE_DBGHELP if (SymAddSymbol(pVM, ModuleAddress, (char *)(void *)pszSymbol, SymbolAddress, cbSymbol, 0)) return VINF_SUCCESS; return win32Error(pVM); #else /** @todo module lookup. */ return dbgfR3SymbolInsert(pVM, pszSymbol, SymbolAddress, cbSymbol, NULL); #endif }
/*********************************************************************** * symbol_read_symtable * * Read a symbol file into the hash table. */ void symbol_read_symtable(const char* filename, unsigned long offset) { dbg_printf("No longer supported\n"); #if 0 /* FIXME: have to implement SymAddSymbol in dbghelp, but likely we'll need to link * this with an already loaded module !! */ FILE* symbolfile; unsigned addr; char type; char* cpnt; char buffer[256]; char name[256]; if (!(symbolfile = fopen(filename, "r"))) { WINE_WARN("Unable to open symbol table %s\n", filename); return; } dbg_printf("Reading symbols from file %s\n", filename); while (1) { fgets(buffer, sizeof(buffer), symbolfile); if (feof(symbolfile)) break; /* Strip any text after a # sign (i.e. comments) */ cpnt = strchr(buffer, '#'); if (cpnt) *cpnt = '\0'; /* Quietly ignore any lines that have just whitespace */ for (cpnt = buffer; *cpnt; cpnt++) { if (*cpnt != ' ' && *cpnt != '\t') break; } if (!*cpnt || *cpnt == '\n') continue; if (sscanf(buffer, "%lx %c %s", &addr, &type, name) == 3) { if (value.addr.off + offset < value.addr.off) WINE_WARN("Address wrap around\n"); value.addr.off += offset; SymAddSymbol(current_process->handle, BaseOfDll, name, addr, 0, 0); } } fclose(symbolfile); #endif }
virtual void NotifyFunctionEmitted(const Function &F, void *Code, size_t Size, const EmittedFunctionDetails &Details) { #if defined(_OS_WINDOWS_) && defined(_CPU_X86_64_) assert(!jl_in_stackwalk); jl_in_stackwalk = 1; uintptr_t catchjmp = (uintptr_t)Code+Size; *(uint8_t*)(catchjmp+0) = 0x48; *(uint8_t*)(catchjmp+1) = 0xb8; // mov RAX, QWORD PTR [...] *(uint64_t*)(catchjmp+2) = (uint64_t)&_seh_exception_handler; *(uint8_t*)(catchjmp+10) = 0xff; *(uint8_t*)(catchjmp+11) = 0xe0; // jmp RAX PRUNTIME_FUNCTION tbl = (PRUNTIME_FUNCTION)((catchjmp+12+3)&~(uintptr_t)3); uint8_t *UnwindData = (uint8_t*)((((uintptr_t)&tbl[1])+3)&~(uintptr_t)3); RUNTIME_FUNCTION fn = {0,(DWORD)Size+13,(DWORD)(intptr_t)(UnwindData-(uint8_t*)Code)}; tbl[0] = fn; UnwindData[0] = 0x09; // version info, UNW_FLAG_EHANDLER UnwindData[1] = 4; // size of prolog (bytes) UnwindData[2] = 2; // count of unwind codes (slots) UnwindData[3] = 0x05; // frame register (rbp) = rsp UnwindData[4] = 4; // second instruction UnwindData[5] = 0x03; // mov RBP, RSP UnwindData[6] = 1; // first instruction UnwindData[7] = 0x50; // push RBP *(DWORD*)&UnwindData[8] = (DWORD)(catchjmp-(intptr_t)Code); DWORD mod_size = (DWORD)(size_t)(&UnwindData[8]-(uint8_t*)Code); if (!SymLoadModuleEx(GetCurrentProcess(), NULL, NULL, NULL, (DWORD64)Code, mod_size, NULL, SLMFLAG_VIRTUAL)) { static int warned = 0; if (!warned) { JL_PRINTF(JL_STDERR, "WARNING: failed to insert function info for backtrace\n"); warned = 1; } } else { if (!SymAddSymbol(GetCurrentProcess(), (ULONG64)Code, F.getName().data(), (DWORD64)Code, mod_size, 0)) { JL_PRINTF(JL_STDERR, "WARNING: failed to insert function name into debug info\n"); } if (!RtlAddFunctionTable(tbl,1,(DWORD64)Code)) { JL_PRINTF(JL_STDERR, "WARNING: failed to insert function stack unwind info\n"); } } jl_in_stackwalk = 0; FuncInfo tmp = {&F, Size, std::string(), std::string(), tbl, Details.LineStarts}; #else FuncInfo tmp = {&F, Size, std::string(F.getName().data()), std::string(), Details.LineStarts}; #endif info[(size_t)(Code)] = tmp; }
BOOLEAN SymWAddSymbol(IN PCHAR pszSymbolName, IN ULONG64 uSymbolAddress, IN ULONG uOffset, IN ULONG uBitPosition, IN ULONG uBitLength) { return SymAddSymbol(pszSymbolName, uSymbolAddress, uOffset, uBitPosition, uBitLength); }