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;
            }
        }