Câu trả lời:
Bạn có thể sử dụng strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
là số dòng, x
có thể là bất kỳ tên tệp nào và y
có thể là bất kỳ biến nào.
No symbol "strcmp" in current context.
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/
$_streq
phương pháp từ @tlwhitec là tốt hơn.
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!
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 configuration
bê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")
$_streq
chỉ 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 .
strncmp
vàstrstr
là các hàm truy vấn C hữu ích khác.