2008-09-12 51 views

Trả lời

240

hồ chỉ phá vỡ trên viết, rwatch cho phép bạn phá vỡ vào đọc, và awatch cho phép bạn phá vỡ vào đọc/ghi.

Bạn có thể đặt đọc watchpoints vào vị trí bộ nhớ:

gdb$ rwatch *0xfeedface 
Hardware read watchpoint 2: *0xfeedface 

nhưng một hạn chế áp dụng cho rwatch và lệnh awatch; bạn không thể sử dụng các biến gdb trong các biểu thức:

gdb$ rwatch $ebx+0xec1a04f 
Expression cannot be implemented with read/access watchpoint. 

Vì vậy, bạn phải mở rộng chúng mình:

gdb$ print $ebx 
$13 = 0x135700 
gdb$ rwatch *0x135700+0xec1a04f 
Hardware read watchpoint 3: *0x135700 + 0xec1a04f 
gdb$ c 
Hardware read watchpoint 3: *0x135700 + 0xec1a04f 

Value = 0xec34daf 
0x9527d6e7 in objc_msgSend() 

Edit: Oh, và bằng cách này. Bạn cần phần cứng hoặc phần mềm hỗ trợ. Phần mềm rõ ràng là chậm hơn nhiều. Để tìm hiểu xem hệ điều hành của bạn có hỗ trợ điểm quan sát phần cứng hay không, bạn có thể xem cài đặt môi trường có thể sử dụng-hw-watchpoints.

gdb$ show can-use-hw-watchpoints 
Debugger's willingness to use watchpoint hardware is 1. 
+5

Nếu bạn muốn xem một thành viên của một phương pháp C++, tôi thấy biến thể này vô cùng hữu ích: 'watch -location mTextFormatted'. –

+0

Nếu tôi không có địa chỉ của một biến thì sao? Tôi có thể sử dụng tên của nó không? –

+5

Bạn có thể yêu cầu GDB in địa chỉ của biến bằng toán tử địa chỉ. 'print & variable' – Loduwijk

9

Tôi chỉ cố gắng như sau:

$ cat gdbtest.c 
int abc = 43; 

int main() 
{ 
    abc = 10; 
} 
$ gcc -g -o gdbtest gdbtest.c 
$ gdb gdbtest 
... 
(gdb) watch abc 
Hardware watchpoint 1: abc 
(gdb) r 
Starting program: /home/mweerden/gdbtest 
... 

Old value = 43 
New value = 10 
main() at gdbtest.c:6 
6  } 
(gdb) quit 

Vì vậy, có vẻ như có thể, nhưng bạn dường như cần một số hỗ trợ phần cứng.

+0

Nếu nền tảng của bạn không hỗ trợ các điểm quan sát phần cứng, gdb sẽ rơi trở lại điểm xem phần mềm. – Tod

22

Giả sử câu trả lời đầu tiên là đề cập đến cú pháp C-like (char *)(0x135700 +0xec1a04f) thì câu trả lời để làm rwatch *0x135700+0xec1a04f là không chính xác. Cú pháp chính xác là rwatch *(0x135700+0xec1a04f).

Việc thiếu () s ở đó đã gây ra cho tôi rất nhiều nỗi đau khi cố gắng sử dụng các điểm giám sát.

1

Sử dụng đồng hồ để xem khi nào một biến được ghi vào, rwatch khi nó được đọc và awatch khi nó được đọc/ghi từ/đến, như đã nói ở trên. Tuy nhiên, xin lưu ý rằng để sử dụng lệnh này, bạn phải phá vỡ chương trình và biến phải nằm trong phạm vi khi bạn đã phá vỡ chương trình:

Sử dụng lệnh theo dõi. Đối số cho lệnh theo dõi là biểu thức được đánh giá. Điều này ngụ ý rằng variabel bạn muốn để đặt điểm quan sát phải nằm trong phạm vi hiện tại. Vì vậy, để đặt điểm quan sát trên biến không phải toàn cầu, bạn phải đặt điểm ngắt sẽ dừng chương trình của bạn khi biến nằm trong phạm vi. Bạn đặt điểm quan sát sau khi ngắt chương trình.

14

Điều bạn đang tìm kiếm được gọi là điểm quan sát .

Cách sử dụng

(gdb) watch foo: xem giá trị của biếnfoo

(gdb) watch *(int*)0x12345678: xem giá trị được trỏ bởi một địa chỉ, Casted đến bất cứ loại bạn muốn

(gdb) watch a*b + c/d: đồng hồ một biểu thức phức tạp phức tạp, va nắp bằng tiếng mẹ đẻ của chương trình

Watchpoints là ba loại:

  • hồ: gdb sẽ phá vỡ khi một ghi xảy ra
  • rwatch: gdb sẽ phá vỡ wnen một đọc xảy ra
  • awatch: gdb sẽ ngắt trong cả hai trường hợp

Bạn có thể chọn phù hợp hơn với nhu cầu của mình.

Để biết thêm thông tin, hãy kiểm tra this.

+3

Tôi đã viết ** một câu trả lời ** khác vì những câu trả lời hiện tại dường như không đơn giản đối với tôi ... –

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