private bool EnumSymbolsCallback(ref NativeMethods.SYMBOL_INFO symInfo, uint symbolSize, IntPtr contextZero) { var si = new SymbolInfo() { Address = symInfo.Address, FileName = "", LineNumber = 0, Name = symInfo.Name }; // get the line NativeMethods.IMAGEHLP_LINE64 line = new NativeMethods.IMAGEHLP_LINE64(); line.SizeOfStruct = (uint)Marshal.SizeOf(line); ulong addr = si.Address; uint disp32; if (NativeMethods.SymGetLineFromAddr64(_libHandle, addr, out disp32, ref line)) { StringBuilder fn = new StringBuilder(128); for (int i = 0; ; ++i) { byte b = Marshal.ReadByte(IntPtr.Add(line.FileName, i)); if (0 == b) break; fn.Append((char)b); } si.FileName = fn.ToString(); si.LineNumber = (int)line.LineNumber; _symbolCache.Add(si); } else { si.FileName = "(no source)"; } return true; }
/// <summary> /// Update the provided symbol with source/line information. /// </summary> /// <param name="symbol">The symbol to update.</param> private void UpdateLineInformation(SymbolInfo symbol) { // get the line NativeMethods.IMAGEHLP_LINE64 line = new NativeMethods.IMAGEHLP_LINE64(); line.SizeOfStruct = (uint)Marshal.SizeOf(line); uint disp32; if (NativeMethods.SymGetLineFromAddr64(_libHandle, symbol.Address, out disp32, ref line)) { symbol.FileName = Marshal.PtrToStringAnsi(line.FileName); symbol.LineNumber = (int)line.LineNumber; } }