Skip to content
← Todas las publicaciones
· Delta1 Labs .NETDecompiladorDepuración

Cómo depurar una app .NET cuando no tienes el código fuente

¿No tienes el código de ese paquete NuGet o de una DLL heredada? Un decompilador de .NET convierte el ensamblado de nuevo en C# legible que puedes navegar, comparar entre versiones y exportar a un proyecto, para que encuentres el fallo sin el código original.

Para depurar una app .NET cuando no tienes el código fuente, abre el ensamblado compilado en un decompilador como Glass.NET: lee el IL y los metadatos que hay dentro de la DLL o el EXE y reconstruye C# legible que puedes navegar, buscar y exportar, sin archivos de código fuente, PDB ni compilaciones especiales. Eso convierte el “no tengo ni idea de qué hace esta dependencia” en “déjame leer el método y averiguarlo”. A continuación tienes cómo abordar los escenarios habituales sin código fuente, y dónde están sus límites honestos.

Por qué acabas depurando sin código fuente

Le pasa a todo el mundo tarde o temprano:

  • Un fallo en un paquete NuGet de terceros. El comportamiento es incorrecto, la documentación no lo explica y el paquete se distribuye sin símbolos. Necesitas ver qué hace realmente el método, no lo que supones que hace.
  • Una DLL heredada sin código fuente. Una biblioteca interna de un equipo que ya no está, un componente cuyo repositorio desapareció hace tiempo, o un ensamblado de un proveedor del que dependes y cuyo código fuente no puedes conseguir.
  • Sin símbolos para una compilación de producción. Llega un fallo con un rastro de pila que apunta a un ensamblado al que no puedes entrar paso a paso, y necesitas entender la ruta de código.

En todos los casos el ensamblado compilado lo tienes delante, y como .NET distribuye IL más metadatos ricos, ese ensamblado lleva una descripción casi completa y recuperable del programa. Un decompilador es la forma de leerlo.

¿Cómo consigue un decompilador darte C# legible?

Un ensamblado de .NET no es código máquina. El compilador emite Intermediate Language (lenguaje intermedio), un conjunto de instrucciones basado en pila, más metadatos que nombran cada tipo, método, campo y parámetro. El decompilador ejecuta el compilador a la inversa: lee el IL, hace coincidir sus patrones de nuevo con construcciones de C# (un foreach, un método async, una consulta LINQ) y da formato al resultado. Para la mayoría de los ensamblados la salida es precisa y a menudo recompilable. (El recorrido completo está en cómo decompilar una DLL de .NET a C#.)

Abre el ensamblado (en Glass: Archivo ▸ Abrir ensamblado, o arrástralo a la ventana), despliega el árbol de espacios de nombres ▸ tipos ▸ miembros y haz clic en el tipo que te interesa para decompilarlo bajo demanda. En segundos estás leyendo C# de código del que nunca tuviste el fuente.

Leer un método es fácil; entender cómo encaja todo es el verdadero trabajo de depuración. Aquí es donde un decompilador centrado en la navegación se gana su sitio, y es en torno a lo que está construido Glass.NET.

Sigue la lógica con Ir a definición y Buscar todas las referencias

Cuando un método llama a algo que no entiendes, Ir a definición (F12) salta directamente a ello, y Buscar todas las referencias (Mayús+F12) muestra cada llamador, de modo que puedes responder a “¿qué llama realmente a esto, y con qué?” en lugar de adivinar. Las referencias se resuelven desde el propio árbol sintáctico del decompilador, así que aterrizas en el símbolo correcto, no en una coincidencia de texto.

Ve la forma con la jerarquía de llamadas y de tipos

La jerarquía de llamadas y la jerarquía de tipos te permiten subir y bajar por la estructura: quién llama al método defectuoso, qué sobrescribe a qué, dónde se implementa una interfaz. Para rastrear cómo llega un valor hasta el código que lo maneja mal, esto es mucho más rápido que desplazarse.

Salta a cualquier parte con Ir a todo

Ir a todo (Ctrl+T) es una apertura rápida difusa sobre todos los tipos y miembros del ensamblado. Cuando un rastro de pila nombra un método, escríbelo y ya estás ahí. Una miga de pan espacio de nombres ▸ tipo ▸ miembro y el historial de navegación te mantienen orientado al moverte.

Baja al IL cuando el C# resulte sorprendente

A veces el C# reconstruido hace algo que no esperabas. Cambia el mismo miembro a la vista de IL para confirmar qué hace realmente el código a nivel de instrucción, algo inestimable cuando la coincidencia de patrones del decompilador produce algo que se lee de forma extraña pero que es técnicamente correcto.

Encontrar una regresión: compara dos versiones

Uno de los movimientos más prácticos de depuración sin código fuente: una dependencia funcionaba en la versión 2.1 y se rompió en la 2.2, y no hay ningún registro de cambios que lo explique. Decompila ambos ensamblados y compáralos lado a lado. Glass tiene una comparación de ensamblados con un diff por líneas, así que puedes ver con precisión qué cambió en el método que sospechas: la condición alterada, la llamada reordenada, la nueva comprobación de null que no es segura ante null. Leer el diff del C# reconstruido a menudo identifica una regresión en minutos, sin código fuente alguno.

Llevar el código al disco

Cuando quieras hacerle grep, anotarlo o abrirlo en Visual Studio, exporta a un proyecto compilable (en la GUI, normalmente Archivo ▸ Exportar a proyecto), que escribe un .csproj más los archivos .cs reconstruidos. Glass también incluye un subcomando de CLI glass export para que puedas automatizarlo. Un ensamblado pequeño suele recompilar directamente; uno grande puede necesitar correcciones manuales para referencias no resueltas o construcciones generadas por el compilador. Una vez que es un proyecto, todas tus herramientas habituales (búsqueda, análisis estático, incluso montar una reproducción local) vuelven a estar sobre la mesa. Consulta la página de características de Glass.NET para ver el conjunto completo de navegación y exportación.

Los límites honestos

Un decompilador es potente, pero no es magia, y fingir lo contrario te hace perder el tiempo.

  • Decompilado ≠ original. Obtienes C# preciso de lo que el código hace, pero los comentarios desaparecen, la mayoría de los nombres de variables locales se pierden salvo que un PDB los aporte, y construcciones como las máquinas de estado async y los iteradores se reconstruyen, no se recuperan literalmente. Nombres como num2 y flag son habituales.
  • Es estático, no un depurador en vivo. Glass, ILSpy y dotPeek leen y reconstruyen código; no lo ejecutan. Si necesitas recorrer el ensamblado en tiempo de ejecución, observando cómo cambian los valores, ese es otro trabajo: dnSpyEx es la herramienta mantenida por la comunidad para la depuración de código gestionado en vivo, o un decompilador con generación de PDB / servidor de símbolos (dotPeek) puede permitir que Visual Studio entre paso a paso.
  • El código ofuscado es difícil a propósito. Si el ensamblado estaba protegido, los identificadores renombrados, las cadenas cifradas y el flujo de control aplanado sobreviven todos a la decompilación, así que obtienes C# válido pero difícil de seguir. Aún puedes seguir la estructura y el comportamiento, pero la navegación por símbolos con nombre pierde buena parte de su valor.
  • Analiza solo aquello sobre lo que tengas derecho. Depurar tu propio código, o una dependencia sobre la que tienes licencia o derecho legal de inspección, es rutinario. Decompilar software de terceros puede estar restringido por su EULA o por la ley local: compruébalo antes de ponerte a hurgar.

¿Qué herramienta deberías usar?

Para leer y navegar por un ensamblado del que no tienes el código fuente, cualquier decompilador gratuito capaz te dará C# preciso. Si específicamente necesitas depuración en vivo, usa dnSpyEx. Si quieres una experiencia de lectura rápida y centrada en la navegación (Ir a definición, Buscar todas las referencias, Ir a todo, jerarquía de llamadas y de tipos, vistas de C# e IL, comparación de ensamblados y exportación de proyectos), Glass.NET está hecho exactamente para este flujo de trabajo. Está construido sobre el mismo motor ICSharpCode.Decompiler que ILSpy, así que la precisión del C# está a la par; lo que Glass añade es la experiencia alrededor del código, de modo que moverse por un ensamblado desconocido se siente como navegar por tu propio proyecto.

En resumen

No tener código fuente no es un callejón sin salida. Decompila el ensamblado, lee el C# reconstruido, sigue la lógica con navegación de verdad, haz un diff de dos versiones para aislar una regresión, y exporta a un proyecto cuando lo quieras en disco; y podrás depurar un paquete de terceros o una DLL heredada casi como si tuvieras su código fuente. Solo ten presentes los límites: estás leyendo lo que el código hace, no el archivo original. Descarga Glass.NET gratis (sin licencia, sin puestos, sin registro), abre el ensamblado que te está dando problemas y pulsa F12.

Prueba Nebula.NET

Endurece tu código .NET en minutos — empieza con la edición gratuita.