Tôi đang chạy một ứng dụng thông qua gdb và tôi muốn đặt điểm ngắt cho bất kỳ lúc nào một biến cụ thể được truy cập/thay đổi. Có một phương pháp tốt để làm điều này? Tôi cũng sẽ quan tâm đến các cách khác để theo dõi một biến trong C/C++ để xem liệu/khi nó thay đổi.Tôi có thể đặt điểm ngắt trên 'truy cập bộ nhớ' trong GDB không?
Trả lời
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.
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.
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
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.
Có thể. http://www.technochakra.com/debugging-types-of-data-breakpoints-in-gdb/ thảo luận về các điểm ngắt dữ liệu khác nhau cho gdb.
Liên kết đã trở nên cũ. – eush77
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.
Đ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.
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 ... –
- 1. Có thể đặt tên điểm ngắt trong GDB không?
- 2. Đặt điểm ngắt trong GDB
- 3. Điểm ngắt gdb trên pthread_create
- 4. Đặt điểm ngắt trên mỗi dòng trong GDB
- 5. Cách đặt điểm ngắt trên hàm python trong gdb
- 6. Tôi có thể đặt điểm ngắt Firebug trong jsFiddle không?
- 7. gdb: điểm ngắt cài đặt lỗi nội bộ
- 8. GDB kiểm tra quyền truy cập bộ nhớ
- 9. Tôi có thể thêm điểm ngắt trên CreateProcess trong VS
- 10. Xem phạm vi bộ nhớ trong gdb?
- 11. tạm dừng gdb mà không có điểm ngắt
- 12. Đặt điểm ngắt trên hàm có tên
- 13. Tôi có thể truy cập mọi thứ trong bộ nhớ không?
- 14. SIGTRAP mặc dù không có điểm ngắt được đặt; điểm ngắt phần cứng ẩn?
- 15. Eclipse Không thể cài đặt điểm ngắt
- 16. Thiết lập điểm ngắt bộ nhớ trong Visual Studio 2012
- 17. thiết lập điểm ngắt thoát gdb không hoạt động?
- 18. các chương trình của tôi có thể truy cập nhiều hơn 4GB bộ nhớ không?
- 19. Tôi có thể kích hoạt điểm ngắt trên lỗi OpenGL trong Xcode 4 không?
- 20. Google Chrome sẽ không cho phép tôi đặt điểm ngắt
- 21. Không thể đặt các điểm ngắt trong Eclipse
- 22. Điểm ngắt có điều kiện GDB trên các loại tùy ý
- 23. Thực hiện hành động cụ thể khi một số điểm ngắt nhất định trong gdb
- 24. Làm thế nào tôi có thể xem cách một lớp C++ được đặt ra trong bộ nhớ với gdb?
- 25. Truy cập bộ nhớ nhanh trong C++?
- 26. đặt điểm ngắt khi biến đạt giá trị cụ thể
- 27. truy cập bộ nhớ so với bản sao bộ nhớ
- 28. Cách đặt điểm ngắt trên phương thức trong khung .net
- 29. Gỡ lỗi và đếm số lần truy cập điểm ngắt
- 30. Làm cách nào để đặt điểm ngắt phần mềm trên bộ xử lý ARM?
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'. –
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? –
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