Esempio n. 1
0
 public void LoadModule(string name, ulong base_address, ulong size)
 {
     if (0 == DbgHelpNative.SymLoadModule64(m_Handle, IntPtr.Zero, name, null, base_address, (uint)size))
     {
         throw new Win32Exception(Marshal.GetLastWin32Error(), "Failed to load " + name);
     }
 }
Esempio n. 2
0
        private void Dispose(bool disposing)
        {
            if (m_Handle.ToInt64() == 0)
            {
                return;
            }

            DbgHelpNative.SymCleanup(m_Handle);

            m_Handle = IntPtr.Zero;
        }
Esempio n. 3
0
        public bool LookupSymbol(ulong address, out SymbolInfo sym)
        {
            sym.FileName   = "";
            sym.LineNumber = 0;
            sym.Symbol     = "";
            sym.Address    = address;

            DbgHelpNative.SYMBOL_INFO data = new DbgHelpNative.SYMBOL_INFO();
            data.SizeOfStruct = (uint)Marshal.SizeOf(data) - 1024;
            data.MaxNameLen   = 1024;

            ulong displacement;

            if (DbgHelpNative.SymFromAddr(m_Handle, address, out displacement, ref data))
            {
                sym.Symbol = data.Name;
            }
            else
            {
                return(false);
            }

            DbgHelpNative.IMAGEHLP_LINE64 line = new DbgHelpNative.IMAGEHLP_LINE64();
            line.SizeOfStruct = (uint)Marshal.SizeOf(line);

            uint disp32;

            if (DbgHelpNative.SymGetLineFromAddr64(m_Handle, address, 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);
                }

                sym.FileName   = fn.ToString();
                sym.LineNumber = (int)line.LineNumber;
            }
            else
            {
                sym.FileName = "(no source)";
            }

            return(true);
        }
Esempio n. 4
0
        public DbgHelp(ICollection <string> symbol_search_paths)
        {
            IntPtr handle = IntPtr.Add(IntPtr.Zero, 0x7ffffffe);

            DbgHelpNative.SetErrorMode(DbgHelpNative.SetErrorFlags.SEM_FAILCRITICALERRORS | DbgHelpNative.SetErrorFlags.SEM_NOOPENFILEERRORBOX);

            DbgHelpNative.SymSetOptions(DbgHelpNative.Options.SYMOPT_DEFERRED_LOADS | DbgHelpNative.Options.SYMOPT_DEBUG);

            string search_paths = null;

            if (symbol_search_paths.Count > 0)
            {
                var path = new StringBuilder(1024);
                foreach (var sym in symbol_search_paths)
                {
                    if (path.Length > 0)
                    {
                        path.Append(";");
                    }
                    path.Append(sym);
                }
                search_paths = path.ToString();
            }


            if (!DbgHelpNative.SymInitialize(handle, search_paths, false))
            {
                throw new ApplicationException("Failed to initialize DbgHelp library");
            }

            m_CallbackGc = new DbgHelpNative.SymRegisterCallbackProc64(OnCallback);

            DbgHelpNative.SymRegisterCallback64(handle, m_CallbackGc, 0);

            m_Handle = handle;
        }
Esempio n. 5
0
    private static bool OnCallback(IntPtr hProcess, DbgHelpNative.DebugAction action_code, ulong callback_data, ulong user_context)
    {
      switch (action_code)
      {
        case DbgHelpNative.DebugAction.CBA_DEBUG_INFO:
          Debug.Write(Marshal.PtrToStringAnsi((IntPtr) callback_data));
          return true;

        default:
          return false;
      }
    }