2009-08-11 37 views
12

Trình gỡ lỗi DEC Tru64 UNIX cũ có tính năng (được gọi là "điểm giám sát để theo dõi biến") sẽ xem vị trí bộ nhớ (hoặc dải địa chỉ) cho hoạt động đọc hoặc ghi và khi phát hiện hoạt động đó sẽ phá vỡ chương trình để bạn có thể điều tra lý do. Xem để biết chi tiết:Tự động ngắt khi nội dung của vị trí bộ nhớ thay đổi hoặc được đọc

http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V50_HTML/ARH9QATE/DOCU_009.HTM

Có cách nào để làm việc này trong trình gỡ lỗi VisualStudio? Hoặc là có một add-on hoặc một số công cụ khác có thể làm điều này trong Windows?

Trả lời

19

Vâng, bạn có thể thực hiện việc này trong studio trực quan. Bạn có thể tạo một "Điểm ngắt dữ liệu mới" trong trình đơn gỡ lỗi trong khi bạn bị hỏng trong một chương trình đang chạy. Sau đó, bạn chỉ định địa chỉ để xem và số byte.

Điều này chỉ hoạt động để thay đổi giá trị. Tôi không biết cách xem để truy cập đọc. Tuy nhiên đó là một câu hỏi rất phổ biến để biết giá trị đã thay đổi ở đâu. Tôi thấy rằng tôi không muốn biết ai đọc một giá trị thường xuyên.

+2

Đó là những gì tôi đang tìm kiếm, cảm ơn! –

+0

Mục menu chỉ được bật trong khi trình gỡ lỗi đang hoạt động. Tôi nghĩ một lúc nó đã bị vô hiệu hóa trong Express. – Artfunkel

0

Có, điểm ngắt dữ liệu có thể phát hiện ghi. Không biết nếu nó có thể kiểm tra đọc, mặc dù. Tôi không tin rằng x86 có hỗ trợ bản địa cho điều đó.

6

Visual Studio allows to set điểm ngắt trên vị trí bộ nhớ chỉ có chiều dài 4 byte (trên phiên bản Windows 32 bit). Để truy cập bộ nhớ (đọc hoặc ghi), bạn có thể sử dụng lớp sau:

struct protect_mem_t { 
    protect_mem_t(void* addr, size_t size) : addr(addr), size(size), is_protected(FALSE) { 
     protect(); 
    } 
    ~protect_mem_t() { release(); } 
    BOOL protect() { 
     if (!is_protected) { 
      // To catch only read access you should change PAGE_NOACCESS to PAGE_READONLY 
      is_protected = VirtualProtect(addr, size, PAGE_NOACCESS, &old_protect); 
     } 
     return is_protected; 
    } 
    BOOL release() { 
     if (is_protected) 
      is_protected = !VirtualProtect(addr, size, old_protect, &old_protect); 
     return !is_protected; 
    } 

protected: 
    void* addr; 
    size_t size; 
    BOOL is_protected; 
    DWORD old_protect; 
}; 

Nó thay đổi chế độ truy cập trên các trang bộ nhớ đã chọn. Kích thước trang bằng 4096 byte trên các hệ thống 32 bit. Ngoại lệ sẽ được ném vào mọi quyền truy cập vào bộ nhớ được bảo vệ. Lớp này được giới hạn chỉ sử dụng cho các vùng bộ nhớ lớn, nhưng tôi hy vọng nó có thể hữu ích.

Nó có thể được sử dụng theo cách sau:

// some_array should be aligned on PAGE_SIZE boundaries 
protect_mem_t guard(&some_array, PAGE_SIZE); 
+0

Đây là quá mức cần thiết cho những gì tôi đang tìm kiếm, nhưng tôi sẽ gửi nó đi cho một số ngày không may mắn khi tôi đã có một vấn đề thực sự khó chịu để bắt. –

+0

Điều này thật tuyệt vời khi làm việc xung quanh giới hạn 4 điểm ngắt – paulm

1

Bạn có thể sử dụng WINDBG và thiết lập một breakpoint ba trên địa chỉ mong muốn

0

Tôi khuyên bạn nên the hwbreak project. Nó thậm chí còn cho phép thiết lập một điểm ngắt dữ liệu khi một vị trí được đọc.

Tôi đã sửa đổi nó để chỉ tạo một chuỗi và sử dụng lại chuỗi đó cho tất cả các điểm ngắt dữ liệu, nhưng đó chỉ là hiệu quả.

Các vấn đề liên quan