Tôi muốn in toàn bộ chiều dài của chuỗi C trong GDB. Theo mặc định, nó được viết tắt, làm cách nào để buộc GDB in toàn bộ chuỗi?
Tôi muốn in toàn bộ chiều dài của chuỗi C trong GDB. Theo mặc định, nó được viết tắt, làm cách nào để buộc GDB in toàn bộ chuỗi?
Câu trả lời:
set print elements 0
set print elements
number-of-elements
Đặt giới hạn về số lượng phần tử của một mảng GDB sẽ in. Nếu GDB đang in một mảng lớn, nó sẽ dừng in sau khi đã in số lượng phần tử được đặt bởi set print elements
lệnh. Giới hạn này cũng áp dụng cho việc hiển thị các chuỗi. Khi GDB bắt đầu, giới hạn này được đặt thành 200. Đặt số phần tử thành 0 có nghĩa là in không giới hạn .
Miễn là chương trình của bạn ở trạng thái lành mạnh, bạn cũng có thể call (void)puts(your_string)
in nó ra thiết bị xuất chuẩn. Nguyên tắc tương tự áp dụng cho tất cả các chức năng có sẵn cho trình gỡ lỗi, thực sự.
Có một tùy chọn thứ ba: lệnh x, cho phép bạn đặt giới hạn khác cho lệnh cụ thể thay vì thay đổi cài đặt chung. Để in 300 ký tự đầu tiên của chuỗi, bạn có thể sử dụng x/300s your_string
. Đầu ra có thể khó đọc hơn một chút. Ví dụ: in một kết quả truy vấn SQL trong:
(gdb) x / 300sb stmt.c_str () 0x9cd948: "CHỌN bài viết.r" ... 0x9cd958: "nợ TỪ articl" ... ..
x
!
Các printf
lệnh sẽ in các chuỗi hoàn chỉnh:
(gdb) printf "%s\n", string
set print elements nnn
giới hạn và sẽ không in chuỗi hoàn chỉnh trừ khi bạn làm như vậy set print elements 0
.
Chỉ cần hoàn thành nó:
(gdb) p (char[10]) *($ebx)
$87 = "asdfasdfe\n"
Bạn phải đưa ra độ dài, nhưng có thể thay đổi cách biểu diễn của chuỗi đó:
(gdb) p/x (char[10]) *($ebx)
$90 = {0x61,
0x73,
0x64,
0x66,
0x61,
0x73,
0x64,
0x66,
0x65,
0xa}
Điều này có thể hữu ích nếu bạn muốn gỡ lỗi bởi các giá trị của chúng
Sử dụng set elements ...
không phải lúc nào cũng là cách tốt nhất. Nó sẽ hữu ích nếu có một sự khác biệtset string-elements ...
.
Vì vậy, tôi sử dụng các hàm này trong .gdbinit của mình:
define pstr
ptype $arg0._M_dataplus._M_p
printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end
define pcstr
ptype $arg0
printf "[%d] = %s\n", strlen($arg0), $arg0
end
Hãy cẩn thận: