2008-10-24 32 views

Trả lời

418
set print elements 0 

From the GDB manual:

set print elements number-of-elements
Thiết lập một giới hạn về số yếu 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 nó đã in số phần tử được đặt bởi lệnh set print elements. 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ố lượng các phần tử về 0 có nghĩa là việc in không giới hạn.
+0

Ngày nay, bạn cũng có thể cần "đặt lặp lại 0", nếu không GDB sẽ bỏ qua các phần tử lặp lại của chuỗi/mảng. –

86

Miễn là chương trình của bạn ở trạng thái tốt, bạn cũng có thể call (void)puts(your_string) để in nó thành 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ự.

+1

Câu trả lời này thậm chí còn tốt hơn "thiết lập các yếu tố in 0" (vì mục đích của tôi) vì nó tôn trọng các ký tự trả về dòng mới/vận chuyển thay vì thoát chúng. – mhenry1384

+4

Giải pháp tốt, nhưng không hoạt động khi cố gắng phân tích tệp kết xuất lõi – Elalfer

+0

Duskwuff gợi ý rực rỡ, tôi ước tôi đã đọc trước khi tôi sao chép và dán nó vào cuộc gọi printf để có được kết quả không thoát.: D – nevelis

29

Có 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: "SELECT article.r"... 
0x9cd958: "owid FROM articl"... 
.. 
+3

Tôi đã tự hỏi "x/300sb" có nghĩa là gì. Với sự trợ giúp của [cheat sheet (pdf)] (http://refcards.com/docs/peschr/gdb/gdb-refcard-a4.pdf), tôi đã dịch "x/300sb cstr" thành "eXamine 300 đơn vị (byte) của bộ nhớ tại địa chỉ cstr, được hiểu là một chuỗi NULL chấm dứt (S). Nếu chuỗi của bạn có chiều dài 100, thì bạn sẽ thấy rất nhiều rác, bởi vì tất cả 300 byte được in, cho dù chúng có ý nghĩa hay không. +1 tuy nhiên để giới thiệu tôi với 'x'! –

15

Chỉ cần để hoàn thành nó:

(gdb) p (char[10]) *($ebx) 
$87 = "asdfasdfe\n" 

Bạn phải cung cấp một độ dài, nhưng có thể thay đổi các đại 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 theo giá trị của chúng

21

Lệnh printf sẽ in hoàn tất strings:

(gdb) printf "%s\n", string 
+0

Cảm ơn, điều này đã làm việc trong trường hợp của tôi – BSalunke

+1

xin lỗi nhưng điều này không đúng – UmNyobe

+1

Điều này dường như tôn trọng giới hạn 'yếu tố in ấn nnn' và sẽ không in chuỗi hoàn chỉnh trừ khi bạn đặt' yếu tố in 0'. –

1

Sử dụng set elements ... không phải lúc nào cũng là cách tốt nhất. Sẽ hữu ích nếu có một số khác biệt set string-elements ....

Vì vậy, tôi sử dụng các chức năng này trong .gdbinit tôi:

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:

  • Đầu tiên là C++ lib phụ thuộc vì nó truy cập các thành viên của std :: string, nhưng có thể dễ dàng điều chỉnh .
  • Chỉ có thể sử dụng thứ hai trên một chương trình đang chạy khi chương trình gọi strlen.
+0

phải là 'các phần tử in đã đặt ...' không phải là 'các phần tử được đặt' ... – NoahR

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