Làm cách nào để in toàn bộ giá trị của một chuỗi dài trong gdb?


376

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:


504
set print elements 0

Từ hướng dẫn GDB :

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 elementslệ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 .

4
Ngày nay, bạn cũng có thể cần "thiết lập in 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.
John Lindgren

điều này cũng áp dụng cho các kiểu mảng
Trevor Boyd Smith

1
Bạn cũng có thể cần "đặt kích thước giá trị tối đa không giới hạn".
AMS

100

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ự.


2
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" (cho mục đích của tôi) bởi vì nó tôn trọng ký tự trả về dòng mới / vận chuyển thay vì thoát chúng.
mhenry1384

6
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

Duskwuff gợi ý tuyệt vời, tôi ước rằng tôi đã đọc nó trước khi tôi sao chép và dán nó vào một cuộc gọi printf để có được đầu ra không được giải quyết ..: D
nevelis

4
Lưu ý: tùy chọn này chỉ hoạt động nếu bạn đang gỡ lỗi một chương trình trực tiếp. Bạn không thể sử dụng lệnh "gọi" của GDB khi bạn gỡ lỗi một tệp cốt lõi.
Solomon chậm

1
cũng yêu cầu gdb phải lành mạnh, điều này dường như ngày càng KHÔNG xảy ra (tôi nhận được "Không có biểu tượng" đặt "trong bối cảnh hiện tại." trên máy Mac OS X của tôi)
Michael

39

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" ...
..

3
Tôi đã tự hỏi "x / 300sb" nghĩa là gì. Với sự trợ giúp của bảng cheat này (pdf) , tôi đã dịch "x / 300sb cstr" thành "đơn vị eXamine 300 (Byte) tại địa chỉ cstr, được hiểu là một chuỗi kết thúc NULL (S).". Nếu chuỗi của bạn có độ 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. Tuy nhiên +1 đã giới thiệu cho tôi x!
Rob W

39

Các printflệnh sẽ in các chuỗi hoàn chỉnh:

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

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

11
Điều này dường như tôn trọng set print elements nnngiớ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.
Đánh dấu Lakata

3
Khi tôi thử điều này, tôi chỉ nhận được: "Giá trị không thể được chuyển đổi thành số nguyên."
Philipp Ludwig

2
đối với std :: chuỗi bạn cần chuỗi.c_str () để tránh lỗi "Giá trị không thể chuyển đổi thành số nguyên"
Paul Childs

21

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


1

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:

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