2012-01-12 13 views
8

Me gustaría saber cómo el CLR localiza los archivos de símbolos pdb, y si este comportamiento puede ser anulado.Cómo CLR localiza los archivos de símbolos pdb

Miré en línea (MSDN y otros recursos) pero no pude encontrar una buena respuesta.

En mi aplicación, tengo DLL colocados en varios subdirectorios de la ruta principal .EXE.

Me gustaría tener un Symbols \ dir que contendrá todos los símbolos para mi aplicación. De manera predeterminada, creo que los símbolos se recogen de donde está el ensamblaje. ¿Se puede cambiar esto?

+0

Cuando se produce una excepción gestionada, se crea un objeto Excepción y cuando los símbolos están disponibles, contiene un seguimiento de pila con información de archivo (archivo fuente: número de línea). Creo que CLR (o quien agregue el seguimiento de la pila a la excepción consulta estos archivos). –

+0

BTW el CLR puede llamar a otro código (Win32), por lo que es parcialmente cierto que en sí mismo puede no saber nada sobre los archivos PDB. –

Respuesta

2

Usted podría simplemente establecer la variable de entorno _NT_SYMBOL_PATH para su propio proceso. Esto funcionó bien:

using System; 
using System.Runtime.CompilerServices; 
using System.Reflection; 
using System.IO; 

class Program { 
    static void Main(string[] args) { 
     var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
     path = Path.Combine(path, "symbols"); 
     Environment.SetEnvironmentVariable("_NT_SYMBOL_PATH", path); 
     try { 
      Kaboom(); 
     } 
     catch (Exception ex) { 
      Console.WriteLine(ex.ToString()); 
     } 
     Console.ReadLine(); 
    } 
    [MethodImpl(MethodImplOptions.NoInlining)] 
    static void Kaboom() { 
     throw new Exception("test"); 
    } 
} 
+0

Esto no parece funcionar para mí. ¿Funcionará solo cuando se depure o cuando implemente mi aplicación en otro lugar? –

+0

Probé esto sin un depurador y ejecutando la versión Release. No veo un buen modo de falla para esto, aparte de no poner los .pdbs en el subdirectorio correcto, por supuesto. –

+0

Estoy ejecutando una compilación DEBUG, no estoy seguro si eso importa o no. Establecer la variable de entorno temprano en la inicialización de mi aplicación. He colocado todos los símbolos en la carpeta correcta, sin embargo, no parece recogerlos desde allí. –

Cuestiones relacionadas