2012-01-12 9 views
8

Tôi muốn biết cách CLR định vị tệp biểu tượng pdb và nếu hành vi này có thể bị ghi đè.Cách CLR định vị các tệp ký hiệu pdb

Tôi đã xem trực tuyến (MSDN và các tài nguyên khác) nhưng không thể tìm thấy câu trả lời hay.

Trong ứng dụng của mình, tôi có các tệp DLL được đặt trong một số thư mục con của đường dẫn chính .EXE.

Tôi muốn có một Ký hiệu \ dir sẽ chứa tất cả các biểu tượng cho ứng dụng của tôi. Theo mặc định, tôi tin rằng các biểu tượng được chọn từ nơi lắp ráp. Điều này có thể thay đổi không?

+0

Khi ngoại lệ được quản lý xảy ra, đối tượng ngoại lệ được tạo và khi có biểu tượng, nó chứa dấu vết ngăn xếp với thông tin tệp (tệp nguồn: số dòng). Tôi tin rằng CLR (hoặc bất cứ ai thêm dấu vết ngăn xếp vào các truy vấn ngoại lệ các tệp này). –

+0

BTW CLR có thể gọi vào mã khác (Win32), do đó, nó là một phần đúng rằng bản thân nó có thể không biết bất cứ điều gì về các tập tin PDB. –

Trả lời

2

Bạn chỉ có thể thiết lập các biến môi trường _NT_SYMBOL_PATH cho quá trình của riêng bạn. Điều này làm việc tốt:

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

Điều này dường như không hiệu quả đối với tôi. Nó sẽ chỉ hoạt động khi gỡ lỗi hoặc khi tôi triển khai ứng dụng của mình ở nơi khác? –

+0

Tôi đã thử nghiệm điều này mà không cần trình gỡ lỗi và chạy bản dựng Bản phát hành. Tôi không thấy một chế độ thất bại tốt cho điều này, khác hơn là không đặt các .pdbs trong thư mục con bên phải của khóa học. –

+0

Tôi đang chạy bản xây dựng DEBUG, không chắc chắn có quan trọng hay không. Đặt biến môi trường sớm trong quá trình khởi tạo ứng dụng của tôi. Tôi đã đặt tất cả các biểu tượng trong thư mục chính xác, tuy nhiên nó dường như không nhận được nó từ đó. –