2012-06-12 27 views
24

Tôi đang gỡ lỗi chương trình trong gdb và tôi muốn chương trình dừng lại khi vùng bộ nhớ 0x08049000 đến 0x0804a000 được truy cập. Khi tôi cố gắng đặt các điểm ngắt bộ nhớ theo cách thủ công, gdb dường như không hỗ trợ nhiều hơn hai vị trí tại một thời điểm.Xem phạm vi bộ nhớ trong gdb?

(gdb) awatch *0x08049000 
Hardware access (read/write) watchpoint 1: *0x08049000 
(gdb) awatch *0x08049001 
Hardware access (read/write) watchpoint 2: *0x08049001 
(gdb) awatch *0x08049002 
Hardware access (read/write) watchpoint 3: *0x08049002 
(gdb) run 
Starting program: /home/iblue/git/some-code/some-executable 
Warning: 
Could not insert hardware watchpoint 3. 
Could not insert hardware breakpoints: 
You may have requested too many hardware breakpoints/watchpoints. 

Đã có câu hỏi được đặt ra và câu trả lời là có thể thực hiện điều này bằng valgrind. Thật không may câu trả lời không chứa bất kỳ ví dụ hoặc tham chiếu đến hướng dẫn valgrind, do đó, nó không phải là rất enlightning: How can gdb be used to watch for any changes in an entire region of memory?

Vì vậy: Làm thế nào tôi có thể xem toàn bộ khu vực bộ nhớ?

+0

thực tế thú vị: breakpoint PowerPC đã dao động (? Nhưng không watchpoints): http://stackoverflow.com/questions/ 13410941/set-breakpoint-on-every-line-in-gdb/31658056 # 31658056 –

+0

x86 hỗ trợ phạm vi đồng hồ nhỏ tối đa 8 byte: https://en.wikipedia.org/wiki/X86_debug_register –

Trả lời

23

Nếu bạn sử dụng GDB 7.4 cùng với Valgrind 3.7.0, thì bạn có điểm quan sát phần cứng "mô phỏng" không giới hạn.

Bắt đầu chương trình của bạn dưới Valgrind, đưa ra các đối số --vgdb=full --vgdb-error=0 sau đó sử dụng GDB để kết nối với nó (target remote | vgdb). Sau đó, bạn có thể, ví dụ: watch hoặc awatch hoặc rwatch một loạt bộ nhớ bằng cách làm rwatch (char[100]) *0x5180040

Xem the Valgrind user manual on gdb integration để biết thêm chi tiết

+2

Sau khi tôi đã dành phần tốt hơn của ngày nghịch ngợm với 'mprotect' và lạm dụng xử lý SIGSEV để truy cập bộ nhớ, tôi đã thử điều này. Nó hoạt động hoàn hảo. Bạn đã cứu ngày của tôi. Cảm ơn bạn! – iblue

+0

Có, cũng +1. Tôi đã săn tìm một tính năng như thế này trong nhiều tháng. – Crashworks

+0

Vì vậy, làm thế nào để xác định địa chỉ heap cho quá trình bắt đầu bằng valgrind? Tôi thường làm điều này thông qua */proc/[pid]/maps * nhưng khi tôi bắt đầu python thông qua lệnh valgrind này, tệp bản đồ không có mục nhập được xác định bởi ** [heap] ** như tôi đã sử dụng để tìm kiếm . –

10

Tính năng phát hiện khi địa chỉ bộ nhớ thay đổi được gọi là a hardware breakpoint và nó thực sự là một tính năng của CPU — một thanh ghi bên trong bộ điều khiển bộ nhớ phát hiện khi một địa chỉ cụ thể được truy cập và kích hoạt ngắt ngắt trình gỡ lỗi. Thật không may là the x86 architectureonly has four such registers và đó là lý do tại sao bạn bị giới hạn về số điểm ngắt đồng hồ bộ nhớ mà bạn có thể đặt.

Đó là lý do tại sao bạn cần sử dụng thứ gì đó như valgrind; nếu bạn muốn xem toàn bộ khu vực, bạn phải thực hiện bằng cách sử dụng phần mềm mô phỏng các mẫu truy cập bộ nhớ. Tôi không biết nếu valgrind thực sự hỗ trợ xem toàn bộ phạm vi bộ nhớ, mặc dù. Bạn có thể phải tự vá nó. Sửa đổi VALGRIND_MAKE_MEM_NOACCESS() để ném một điểm ngắt nhưng sau đó cho phép chương trình tiếp tục, có thể.

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