Làm cách nào để đặt điểm dừng có điều kiện trong gdb, khi char * x trỏ đến một chuỗi có giá trị bằng với hello hello?


Câu trả lời:


198

Bạn có thể sử dụng strcmp:

break x:20 if strcmp(y, "hello") == 0

20là số dòng, xcó thể là bất kỳ tên tệp nào và ycó thể là bất kỳ biến nào.


9
Lưu ý: bạn phải chạy chương trình để GDB sẽ thấy stdlib. No symbol "strcmp" in current context.
Mặt

1
@CiroSantilli 事件 法轮功 包 卓: Làm thế nào để cấu hình gdb để xem stdlib?
naive231

@ naive231 bằng cách "xem" Ý tôi là thấy các hàm để bạn có thể phá vỡ chúng chứ không phải nguồn: bạn phải đánh vào runđó để các thư viện động được tải. Đối với nguồn, hãy tìm google và tìm: stackoverflow.com/questions/10000335/
Kẻ

1
Phương pháp này có thể có tác dụng phụ. $_streqphương pháp từ @tlwhitec là tốt hơn.
rools

55
break x if ((int)strcmp(y, "hello")) == 0

Trên một số triển khai, gdb có thể không biết kiểu trả về của strcmp. Điều đó có nghĩa là bạn sẽ phải phân vai, nếu không nó sẽ luôn luôn đánh giá là đúng!


46

Vì GDB 7.5, bạn có thể sử dụng các Hàm tiện lợi gốc này :

$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)

Có vẻ như ít vấn đề hơn so với việc phải thực hiện "ngoại lệ" strcmp()trên ngăn xếp của quy trình mỗi khi điểm dừng bị tấn công. Điều này đặc biệt đúng đối với việc gỡ lỗi các quá trình đa luồng.

Lưu ý GDB của bạn cần được biên dịch với sự hỗ trợ của Python, đây không phải là vấn đề với các bản phân phối linux hiện tại. Để chắc chắn, bạn có thể kiểm tra nó bằng cách chạy show configurationbên trong GDB và tìm kiếm --with-python. Oneliner nhỏ này cũng thực hiện các mẹo:

$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
             --with-python=/usr (relocatable)

Đối với trường hợp demo của bạn, việc sử dụng sẽ là

break <where> if $_streq(x, "hello")

hoặc, nếu điểm dừng của bạn đã tồn tại và bạn chỉ muốn thêm điều kiện vào nó

condition <breakpoint number> $_streq(x, "hello")

$_streqchỉ khớp với toàn bộ chuỗi, vì vậy nếu bạn muốn một cái gì đó tinh vi hơn, bạn nên sử dụng $_regex, nó hỗ trợ cú pháp biểu thức chính quy Python .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.