/// <summary> /// Opens a new SymbolReader. All diagnostics messages about symbol lookup go to 'log'. /// </summary> public SymbolReader(TextWriter log, SymPath nt_symbol_path) { SymbolPath = nt_symbol_path; log.WriteLine("Created SymbolReader with SymbolPath {0}", nt_symbol_path); // TODO FIX NOW. the code below does not support probing a file extension directory. // we work around this by adding more things to the symbol path var newSymPath = new SymPath(); foreach (var symElem in SymbolPath.Elements) { newSymPath.Add(symElem); if (!symElem.IsSymServer) { var probe = Path.Combine(symElem.Target, "dll"); if (Directory.Exists(probe)) newSymPath.Add(probe); probe = Path.Combine(symElem.Target, "exe"); if (Directory.Exists(probe)) newSymPath.Add(probe); } } var newSymPathStr = newSymPath.ToString(); // log.WriteLine("Morphed Symbol Path: {0}", newSymPathStr); this.m_log = log; SymbolReaderNativeMethods.SymOptions options = SymbolReaderNativeMethods.SymGetOptions(); SymbolReaderNativeMethods.SymSetOptions( SymbolReaderNativeMethods.SymOptions.SYMOPT_DEBUG | // SymbolReaderNativeMethods.SymOptions.SYMOPT_DEFERRED_LOADS | SymbolReaderNativeMethods.SymOptions.SYMOPT_LOAD_LINES | SymbolReaderNativeMethods.SymOptions.SYMOPT_EXACT_SYMBOLS | SymbolReaderNativeMethods.SymOptions.SYMOPT_UNDNAME ); m_currentProcess = Process.GetCurrentProcess(); // Only here to insure processHandle does not die. TODO get on safeHandles. m_currentProcessHandle = m_currentProcess.Handle; bool success = SymbolReaderNativeMethods.SymInitializeW(m_currentProcessHandle, newSymPathStr, false); if (!success) { // This captures the GetLastEvent (and has to happen before calling CloseHandle() m_currentProcessHandle = IntPtr.Zero; throw new Win32Exception(); } m_callback = new SymbolReaderNativeMethods.SymRegisterCallbackProc(this.StatusCallback); success = SymbolReaderNativeMethods.SymRegisterCallbackW64(m_currentProcessHandle, m_callback, 0); Debug.Assert(success); }
/// <summary> /// Opens a new SymbolReader. All diagnostics messages about symbol lookup go to 'log'. /// </summary> public SymbolReader(TextWriter log, SymPath nt_symbol_path) { SymbolPath = nt_symbol_path; log.WriteLine("Created SymbolReader with SymbolPath {0}", nt_symbol_path); // TODO FIX NOW. the code below does not support probing a file extension directory. // we work around this by adding more things to the symbol path var newSymPath = new SymPath(); foreach (var symElem in SymbolPath.Elements) { newSymPath.Add(symElem); if (!symElem.IsSymServer) { var probe = Path.Combine(symElem.Target, "dll"); if (Directory.Exists(probe)) newSymPath.Add(probe); probe = Path.Combine(symElem.Target, "exe"); if (Directory.Exists(probe)) newSymPath.Add(probe); } } var newSymPathStr = newSymPath.ToString(); // log.WriteLine("Morphed Symbol Path: {0}", newSymPathStr); this._log = log; SymbolReaderNativeMethods.SymOptions options = SymbolReaderNativeMethods.SymGetOptions(); SymbolReaderNativeMethods.SymSetOptions( SymbolReaderNativeMethods.SymOptions.SYMOPT_DEBUG | // SymbolReaderNativeMethods.SymOptions.SYMOPT_DEFERRED_LOADS | SymbolReaderNativeMethods.SymOptions.SYMOPT_LOAD_LINES | SymbolReaderNativeMethods.SymOptions.SYMOPT_EXACT_SYMBOLS | SymbolReaderNativeMethods.SymOptions.SYMOPT_UNDNAME ); if (newSymPathStr != s_symPath) StaticInit(newSymPathStr); }