visual símbolos studio simbolo punto puede para opciones ningun las interrupción interrupcion fuente este encontrar documento depurador depuración código configuración compruebe codigo cargado archivo actualmente activará c# debugging pinvoke debug-symbols

c# - studio - Obtención de símbolos desde el proceso de depuración MainModule



no se ha cargado ningun simbolo para este documento c# (0)

Comencé a escribir un depurador en C #, para depurar cualquier proceso en mi sistema operativo. Por ahora, solo puede manejar puntos de interrupción (HW, SW y memoria), pero ahora quería mostrar el código de operación del proceso.

Mi primer intento fue con nidsasm (NASM), pero esto no es adecuado, ya que después del inicio, las instrucciones del ensamblador de la aplicación a.Net son diferentes de ndisasm (probado con CheatEngine).

Así que busqué un tiempo y encontré algunos métodos de dbghelp.dll a los que se puede llamar para enumerar todos los módulos y símbolos cargados (más la dirección base). Ok, mi intento es desarmar todos los módulos por separado con SharpDisasm.

Utilizo ProcessModuleCollection modules = ProcessData.Instance.MPMR.ReadProcess.Modules; Para obtener todos los módulos cargados del proceso. Esto funciona perfectamente.

Ahora intenté cargar los símbolos de MainModule, pero en este punto, me quedé con la implementación. Implementé la función SymEnumSymbols con p / Invoke y otras funciones necesarias como SymInitialize.

Cuando lo llamo con una Dirección de Base de, por ejemplo, "User32.dll", todos los símbolos se imprimen a la perfección, pero para el Módulo Principal, no obtuve ningún símbolo.

Esta es una captura de pantalla de CheatEngine: Símbolos obtenidos de Cheat Engine

Como puede ver, hay símbolos como "Form1_Load", que no obtengo con mi implementación.

Este es el ejemplo de código necesario:

if (!DebugApi.SymInitialize(ProcessData.Instance.MPMR.M_hProcess, null, false)) { var err = Marshal.GetLastWin32Error(); //throw new Exception("GetMemoryInfo failed : GetLastError() : " + new Win32Exception(err).Message); Console.WriteLine("GetMemoryInfo failed : GetLastError() : " + new Win32Exception(err).Message); return; } if (!DebugApi.SymEnumSymbols(ProcessData.Instance.MPMR.M_hProcess, (ulong)ProcessData.Instance.MPMR.ReadProcess.MainModule.BaseAddress, "!", DebugApi.EnumSyms, IntPtr.Zero)) { var err = Marshal.GetLastWin32Error(); //throw new Exception("GetMemoryInfo failed : GetLastError() : " + new Win32Exception(err).Message); Console.WriteLine("GetMemoryInfo failed : GetLastError() : " + new Win32Exception(err).Message); return; } DebugApi.SymCleanup(ProcessData.Instance.MPMR.M_hProcess);

Y mi DebugApi, con todas las funciones p / Invoke necesarias.

public class DebugApi { [DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SymInitialize(IntPtr hProcess, string UserSearchPath, [MarshalAs(UnmanagedType.Bool)]bool fInvadeProcess); [DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SymCleanup(IntPtr hProcess); [DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern ulong SymLoadModuleEx(IntPtr hProcess, IntPtr hFile, string ImageName, string ModuleName, long BaseOfDll, int DllSize, IntPtr Data, int Flags); [DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SymEnumSymbols(IntPtr hProcess, ulong BaseOfDll, string Mask, PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, IntPtr UserContext); public delegate bool PSYM_ENUMERATESYMBOLS_CALLBACK(ref SYMBOL_INFO pSymInfo, uint SymbolSize, IntPtr UserContext); public static bool EnumSyms(ref SYMBOL_INFO pSymInfo, uint SymbolSize, IntPtr UserContext) { Console.Out.WriteLine("Name: " + pSymInfo.Name); return true; } [Flags] public enum SymFlag : uint { VALUEPRESENT = 0x00000001, REGISTER = 0x00000008, REGREL = 0x00000010, FRAMEREL = 0x00000020, PARAMETER = 0x00000040, LOCAL = 0x00000080, CONSTANT = 0x00000100, EXPORT = 0x00000200, FORWARDER = 0x00000400, FUNCTION = 0x00000800, VIRTUAL = 0x00001000, THUNK = 0x00002000, TLSREL = 0x00004000, } [Flags] public enum SymTagEnum : uint { Null, Exe, Compiland, CompilandDetails, CompilandEnv, Function, Block, Data, Annotation, Label, PublicSymbol, UDT, Enum, FunctionType, PointerType, ArrayType, BaseType, Typedef, BaseClass, Friend, FunctionArgType, FuncDebugStart, FuncDebugEnd, UsingNamespace, VTableShape, VTable, Custom, Thunk, CustomType, ManagedType, Dimension }; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct SYMBOL_INFO { public uint SizeOfStruct; public uint TypeIndex; public ulong Reserved1; public ulong Reserved2; public uint Reserved3; public uint Size; public ulong ModBase; public SymFlag Flags; public ulong Value; public ulong Address; public uint Register; public uint Scope; public SymTagEnum Tag; public int NameLen; public int MaxNameLen; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] public string Name; } }

Mis funciones deberían estar bien, porque funciona con otros módulos (por ejemplo, archivos DLL cargados). Tal vez no entiendo el concepto de los símbolos de un ejecutable .Net o de que falte algo.