Bagaimana cara mencetak nilai penuh dari string panjang di gdb?


376

Saya ingin mencetak panjang penuh C-string di GDB. Secara default disingkat, bagaimana cara memaksa GDB untuk mencetak seluruh string?

Jawaban:


504
set print elements 0

Dari manual GDB :

set print elements number-of-elements
Tetapkan batas pada berapa banyak elemen dari array yang akan dicetak oleh GDB. Jika GDB mencetak array besar, itu berhenti mencetak setelah telah mencetak jumlah elemen yang ditetapkan oleh set print elementsperintah. Batas ini juga berlaku untuk tampilan string. Ketika GDB dimulai, batas ini diatur ke 200. Mengatur jumlah elemen ke nol berarti bahwa pencetakan tidak terbatas .

4
Saat ini Anda mungkin juga perlu "mengatur print repeats 0", jika tidak GDB akan menghilangkan elemen berulang dari string / array.
John Lindgren

ini juga berlaku untuk tipe array juga
Trevor Boyd Smith

1
Anda mungkin juga perlu "mengatur ukuran maksimum nilai-tak terbatas".
am

100

Selama program Anda dalam keadaan waras, Anda juga call (void)puts(your_string)dapat mencetaknya ke stdout. Prinsip yang sama berlaku untuk semua fungsi yang tersedia untuk debugger, sebenarnya.


2
Jawaban ini bahkan lebih baik daripada "atur elemen cetak 0" (untuk tujuan saya) karena itu menghormati baris baru / carriage return chars bukannya menghindari mereka.
mhenry1384

6
Solusi yang bagus, tetapi tidak berfungsi ketika mencoba menganalisis file dump inti
Elalfer

Saran brilian duskwuff, saya berharap saya telah membaca itu sebelum saya menyalin & menempelkannya ke panggilan printf untuk mendapatkan hasil yang tidak
terhindar

4
Catatan: opsi ini hanya berfungsi jika Anda sedang men-debug program langsung. Anda tidak dapat menggunakan perintah "panggilan" GDB ketika Anda sedang debug file inti.
Solomon Slow

1
juga membutuhkan gdb untuk menjadi waras, yang sepertinya semakin TIDAK menjadi kasus (saya mendapatkan "Tidak ada simbol" menempatkan "dalam konteks saat ini." pada mesin Mac OS X saya)
Michael

39

Ada opsi ketiga: perintah x, yang memungkinkan Anda untuk menetapkan batas berbeda untuk perintah tertentu alih-alih mengubah pengaturan global. Untuk mencetak 300 karakter pertama dari sebuah string yang dapat Anda gunakan x/300s your_string. Outputnya mungkin sedikit lebih sulit untuk dibaca. Misalnya mencetak hasil query SQL di:

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "SELECT article.r" ...
0x9cd958: "owid FROM articl" ...
..

3
Saya bertanya-tanya apa arti "x / 300sb". Dengan bantuan lembar contekan ini (pdf) , saya telah menerjemahkan "x / 300sb cstr" sebagai "eXamine 300 units (Bytes) memori pada address cstr, diartikan sebagai string yang diakhiri dengan NULL (S).". Jika string Anda memiliki panjang 100, maka Anda akan melihat banyak sampah, karena semua 300 byte dicetak, apakah masuk akal atau tidak. Namun +1 telah memperkenalkan saya x!
Rob W

39

The printfperintah akan mencetak string lengkap:

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

2
maaf tapi ini tidak benar
UmNyobe

11
Ini tampaknya menghormati set print elements nnnbatas, dan tidak akan mencetak string yang lengkap kecuali Anda melakukannya set print elements 0.
Mark Lakata

3
Ketika saya mencoba ini, saya hanya mendapatkan: "Nilai tidak dapat dikonversi ke integer."
Philipp Ludwig

2
untuk std :: string Anda memerlukan string.c_str () untuk menghindari kesalahan "Nilai tidak dapat dikonversi ke integer"
Paul Childs

21

Hanya untuk melengkapinya:

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

Anda harus memberi panjang, tetapi dapat mengubah representasi string itu:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

Ini mungkin berguna jika Anda ingin men-debug berdasarkan nilainya


1

Menggunakan set elements ...tidak selalu merupakan cara terbaik. Akan bermanfaat jika ada yang berbeda set string-elements ....

Jadi, saya menggunakan fungsi-fungsi ini di .gdbinit saya:

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

Peringatan:

  • Yang pertama bergantung pada c ++ lib karena mengakses anggota std :: string, tetapi mudah disesuaikan.
  • Yang kedua hanya dapat digunakan pada program yang sedang berjalan karena memanggil strlen.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.