< prev index next >

src/os/windows/vm/windbghelp.cpp

Print this page
rev 13549 : 8185712: [windows] Improve native symbol decoder
Reviewed-by: goetz, zgu

*** 114,208 **** } } } ///////////////////// External functions ////////////////////////// // All outside facing functions are synchronized. Also, we run // initialization on first touch. ! // Call InitializeCriticalSection as early as possible. ! class CritSect { ! CRITICAL_SECTION cs; ! public: ! CritSect() { ::InitializeCriticalSection(&cs); } ! void enter() { ::EnterCriticalSection(&cs); } ! void leave() { ::LeaveCriticalSection(&cs); } ! }; ! ! static CritSect g_cs; ! ! class EntryGuard { ! public: ! EntryGuard() { ! g_cs.enter(); if (g_state == state_uninitialized) { initialize(); } } ! ~EntryGuard() { ! g_cs.leave(); } ! }; DWORD WindowsDbgHelp::symSetOptions(DWORD arg) { ! EntryGuard entry_guard; if (g_pfn_SymSetOptions != NULL) { return g_pfn_SymSetOptions(arg); } return 0; } DWORD WindowsDbgHelp::symGetOptions(void) { ! EntryGuard entry_guard; if (g_pfn_SymGetOptions != NULL) { return g_pfn_SymGetOptions(); } return 0; } BOOL WindowsDbgHelp::symInitialize(HANDLE hProcess, PCTSTR UserSearchPath, BOOL fInvadeProcess) { ! EntryGuard entry_guard; if (g_pfn_SymInitialize != NULL) { return g_pfn_SymInitialize(hProcess, UserSearchPath, fInvadeProcess); } return FALSE; } BOOL WindowsDbgHelp::symGetSymFromAddr64(HANDLE hProcess, DWORD64 the_address, PDWORD64 Displacement, PIMAGEHLP_SYMBOL64 Symbol) { ! EntryGuard entry_guard; if (g_pfn_SymGetSymFromAddr64 != NULL) { return g_pfn_SymGetSymFromAddr64(hProcess, the_address, Displacement, Symbol); } return FALSE; } DWORD WindowsDbgHelp::unDecorateSymbolName(const char* DecoratedName, char* UnDecoratedName, DWORD UndecoratedLength, DWORD Flags) { ! EntryGuard entry_guard; if (g_pfn_UnDecorateSymbolName != NULL) { return g_pfn_UnDecorateSymbolName(DecoratedName, UnDecoratedName, UndecoratedLength, Flags); } if (UnDecoratedName != NULL && UndecoratedLength > 0) { UnDecoratedName[0] = '\0'; } return 0; } BOOL WindowsDbgHelp::symSetSearchPath(HANDLE hProcess, PCTSTR SearchPath) { ! EntryGuard entry_guard; if (g_pfn_SymSetSearchPath != NULL) { return g_pfn_SymSetSearchPath(hProcess, SearchPath); } return FALSE; } BOOL WindowsDbgHelp::symGetSearchPath(HANDLE hProcess, PTSTR SearchPath, int SearchPathLength) { ! EntryGuard entry_guard; if (g_pfn_SymGetSearchPath != NULL) { return g_pfn_SymGetSearchPath(hProcess, SearchPath, SearchPathLength); } return FALSE; } --- 114,206 ---- } } } + ///////////////////// External functions ////////////////////////// // All outside facing functions are synchronized. Also, we run // initialization on first touch. + static CRITICAL_SECTION g_cs; ! namespace { // Do not export. ! class WindowsDbgHelpEntry { ! public: ! WindowsDbgHelpEntry() { ! ::EnterCriticalSection(&g_cs); if (g_state == state_uninitialized) { initialize(); } } ! ~WindowsDbgHelpEntry() { ! ::LeaveCriticalSection(&g_cs); } ! }; ! } ! ! // Called at DLL_PROCESS_ATTACH. ! void WindowsDbgHelp::pre_initialize() { ! ::InitializeCriticalSection(&g_cs); ! } DWORD WindowsDbgHelp::symSetOptions(DWORD arg) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymSetOptions != NULL) { return g_pfn_SymSetOptions(arg); } return 0; } DWORD WindowsDbgHelp::symGetOptions(void) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymGetOptions != NULL) { return g_pfn_SymGetOptions(); } return 0; } BOOL WindowsDbgHelp::symInitialize(HANDLE hProcess, PCTSTR UserSearchPath, BOOL fInvadeProcess) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymInitialize != NULL) { return g_pfn_SymInitialize(hProcess, UserSearchPath, fInvadeProcess); } return FALSE; } BOOL WindowsDbgHelp::symGetSymFromAddr64(HANDLE hProcess, DWORD64 the_address, PDWORD64 Displacement, PIMAGEHLP_SYMBOL64 Symbol) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymGetSymFromAddr64 != NULL) { return g_pfn_SymGetSymFromAddr64(hProcess, the_address, Displacement, Symbol); } return FALSE; } DWORD WindowsDbgHelp::unDecorateSymbolName(const char* DecoratedName, char* UnDecoratedName, DWORD UndecoratedLength, DWORD Flags) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_UnDecorateSymbolName != NULL) { return g_pfn_UnDecorateSymbolName(DecoratedName, UnDecoratedName, UndecoratedLength, Flags); } if (UnDecoratedName != NULL && UndecoratedLength > 0) { UnDecoratedName[0] = '\0'; } return 0; } BOOL WindowsDbgHelp::symSetSearchPath(HANDLE hProcess, PCTSTR SearchPath) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymSetSearchPath != NULL) { return g_pfn_SymSetSearchPath(hProcess, SearchPath); } return FALSE; } BOOL WindowsDbgHelp::symGetSearchPath(HANDLE hProcess, PTSTR SearchPath, int SearchPathLength) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymGetSearchPath != NULL) { return g_pfn_SymGetSearchPath(hProcess, SearchPath, SearchPathLength); } return FALSE; }
*** 210,220 **** BOOL WindowsDbgHelp::stackWalk64(DWORD MachineType, HANDLE hProcess, HANDLE hThread, LPSTACKFRAME64 StackFrame, PVOID ContextRecord) { ! EntryGuard entry_guard; if (g_pfn_StackWalk64 != NULL) { return g_pfn_StackWalk64(MachineType, hProcess, hThread, StackFrame, ContextRecord, NULL, // ReadMemoryRoutine g_pfn_SymFunctionTableAccess64, // FunctionTableAccessRoutine, --- 208,218 ---- BOOL WindowsDbgHelp::stackWalk64(DWORD MachineType, HANDLE hProcess, HANDLE hThread, LPSTACKFRAME64 StackFrame, PVOID ContextRecord) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_StackWalk64 != NULL) { return g_pfn_StackWalk64(MachineType, hProcess, hThread, StackFrame, ContextRecord, NULL, // ReadMemoryRoutine g_pfn_SymFunctionTableAccess64, // FunctionTableAccessRoutine,
*** 224,263 **** } return FALSE; } PVOID WindowsDbgHelp::symFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase) { ! EntryGuard entry_guard; if (g_pfn_SymFunctionTableAccess64 != NULL) { return g_pfn_SymFunctionTableAccess64(hProcess, AddrBase); } return NULL; } DWORD64 WindowsDbgHelp::symGetModuleBase64(HANDLE hProcess, DWORD64 dwAddr) { ! EntryGuard entry_guard; if (g_pfn_SymGetModuleBase64 != NULL) { return g_pfn_SymGetModuleBase64(hProcess, dwAddr); } return 0; } BOOL WindowsDbgHelp::miniDumpWriteDump(HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam) { ! EntryGuard entry_guard; if (g_pfn_MiniDumpWriteDump != NULL) { return g_pfn_MiniDumpWriteDump(hProcess, ProcessId, hFile, DumpType, ExceptionParam, UserStreamParam, CallbackParam); } return FALSE; } BOOL WindowsDbgHelp::symGetLineFromAddr64(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINE64 Line) { ! EntryGuard entry_guard; if (g_pfn_SymGetLineFromAddr64 != NULL) { return g_pfn_SymGetLineFromAddr64(hProcess, dwAddr, pdwDisplacement, Line); } return FALSE; } --- 222,261 ---- } return FALSE; } PVOID WindowsDbgHelp::symFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymFunctionTableAccess64 != NULL) { return g_pfn_SymFunctionTableAccess64(hProcess, AddrBase); } return NULL; } DWORD64 WindowsDbgHelp::symGetModuleBase64(HANDLE hProcess, DWORD64 dwAddr) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymGetModuleBase64 != NULL) { return g_pfn_SymGetModuleBase64(hProcess, dwAddr); } return 0; } BOOL WindowsDbgHelp::miniDumpWriteDump(HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_MiniDumpWriteDump != NULL) { return g_pfn_MiniDumpWriteDump(hProcess, ProcessId, hFile, DumpType, ExceptionParam, UserStreamParam, CallbackParam); } return FALSE; } BOOL WindowsDbgHelp::symGetLineFromAddr64(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINE64 Line) { ! WindowsDbgHelpEntry entry_guard; if (g_pfn_SymGetLineFromAddr64 != NULL) { return g_pfn_SymGetLineFromAddr64(hProcess, dwAddr, pdwDisplacement, Line); } return FALSE; }
< prev index next >