2012-01-12 10 views
8

Chciałbym wiedzieć, w jaki sposób CLR lokalizuje pliki symboli pdb i czy to zachowanie może zostać nadpisane.W jaki sposób CLR lokalizuje pliki symboli pdb?

Sprawdziłem online (MSDN i inne zasoby), ale nie mogłem znaleźć dobrej odpowiedzi.

W mojej aplikacji mam biblioteki DLL umieszczone w kilku podkatalogach głównej ścieżki .EXE.

Chciałbym mieć Symbols \ dir, który będzie zawierał wszystkie symbole dla mojej aplikacji. Domyślnie uważam, że symbole są pobierane z miejsca montażu. Czy to można zmienić?

+0

Gdy zachodzi zarządzany wyjątek, tworzony jest obiekt wyjątku, a gdy symbole są dostępne, zawiera ślad stosu z informacjami o pliku (plik źródłowy: numer wiersza). Wierzę, że CLR (lub ktokolwiek dodaje ślad stosu do wyjątku zapytuje te pliki). –

+0

BTW CLR może wywoływać inny kod (Win32), więc częściowo jest prawdą, że sam w sobie może nie wiedzieć nic o plikach PDB. –

Odpowiedz

2

Można po prostu ustawić zmienną środowiskową _NT_SYMBOL_PATH dla własnego procesu. To zadziałało dobrze:

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

To nie wydaje się działać dla mnie. Czy będzie działać tylko podczas debugowania, czy też po wdrożeniu mojej aplikacji w innym miejscu? –

+0

Przetestowałem to bez debuggera i uruchomienia wersji Release. Nie widzę tutaj dobrego trybu awaryjnego, poza tym, że nie umieszczam pliku .pdbs w prawym podkatalogu. –

+0

Używam kompilacji DEBUG, nie jestem pewien, czy to ma znaczenie, czy nie. Ustawianie zmiennej środowiskowej na wczesnym etapie inicjowania mojej aplikacji. Umieściłem wszystkie symbole we właściwym folderze, ale nie wydaje się, aby to odebrać. –