ฉันจะพิมพ์ค่าทั้งหมดของสตริงแบบยาวใน gdb ได้อย่างไร?


คำตอบ:


504
set print elements 0

จากคู่มือ GDB :

set print elements number-of-elements
กำหนดขีด จำกัด จำนวนองค์ประกอบของอาร์เรย์ GDB ที่จะพิมพ์ หาก GDB กำลังพิมพ์อาร์เรย์ขนาดใหญ่มันจะหยุดการพิมพ์หลังจากที่ได้พิมพ์จำนวนองค์ประกอบที่กำหนดโดยset print elementsคำสั่ง ขีด จำกัด นี้ยังใช้กับการแสดงสตริง เมื่อ GDB เริ่มต้นขีด จำกัด นี้ถูกตั้งไว้ที่ 200 ตั้งค่าจำนวนขององค์ประกอบที่จะเป็นศูนย์หมายความว่าพิมพ์ไม่ จำกัด

4
ทุกวันนี้คุณอาจต้อง "ตั้งค่าการพิมพ์ซ้ำ 0" มิฉะนั้น GDB จะละเว้นองค์ประกอบที่ซ้ำกันของสตริง / อาร์เรย์
John Lindgren

นอกจากนี้ยังใช้กับประเภทอาเรย์ด้วย
Trevor Boyd Smith

1
คุณอาจต้อง "ตั้งค่าขนาดสูงสุดไม่ จำกัด "
ams

100

ตราบใดที่โปรแกรมของคุณอยู่ในสถานะมีสติคุณสามารถcall (void)puts(your_string)พิมพ์ไปยัง stdout ได้เช่นกัน หลักการเดียวกันนี้ใช้กับฟังก์ชั่นทั้งหมดที่มีในตัวดีบัก


2
คำตอบนี้ดียิ่งกว่า "ตั้งค่าองค์ประกอบการพิมพ์ 0" (สำหรับจุดประสงค์ของฉัน) เพราะจะเคารพตัวอักษรขึ้นบรรทัดใหม่ / การขึ้นบรรทัดใหม่แทนที่จะหนีออกมา
mhenry1384

6
ทางออกที่ดี แต่ไม่ทำงานเมื่อพยายามวิเคราะห์ core dump file
Elalfer

ข้อเสนอแนะที่ยอดเยี่ยมฉันหวังว่าฉันจะได้อ่านก่อนที่ฉันจะคัดลอกและวางลงในการโทร printf เพื่อให้ได้ผลลัพธ์ที่ไม่ใช้ค่า Escape .. : D
nevelis

4
หมายเหตุ: ตัวเลือกนี้จะทำงานเฉพาะเมื่อคุณทำการดีบักโปรแกรมสด คุณไม่สามารถใช้คำสั่ง "โทร" ของ GDB เมื่อทำการดีบั๊กไฟล์หลัก
โซโลมอนช้า

1
ยังต้องการ gdb ให้มีสติซึ่งดูเหมือนว่าจะไม่เป็นเช่นนั้นมากขึ้น (ฉันได้รับ "ไม่มีสัญลักษณ์" วาง "ในบริบทปัจจุบัน" ในเครื่อง Mac OS X ของฉัน)
Michael

39

มีตัวเลือกที่สามคือคำสั่ง x ซึ่งช่วยให้คุณสามารถกำหนดขีด จำกัด ที่แตกต่างกันสำหรับคำสั่งเฉพาะแทนที่จะเปลี่ยนการตั้งค่าร่วม หากต้องการพิมพ์อักขระ 300 ตัวแรกของสตริงที่คุณสามารถx/300s your_stringใช้ได้ เอาต์พุตอาจอ่านยากขึ้นเล็กน้อย ตัวอย่างเช่นการพิมพ์ผลแบบสอบถาม SQL ใน:

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "เลือกบทความ. r" ...
0x9cd958: "เป็นหนี้จาก articl" ...
..

3
ฉันสงสัยว่า "x / 300sb" หมายถึงอะไร ด้วยความช่วยเหลือของเอกสารสูตรนี้(pdf)ฉันได้แปล "x / 300sb cstr" เป็น "eXamine 300 หน่วย (ไบต์) ของหน่วยความจำที่ address cstr ตีความว่าเป็นสตริงที่สิ้นสุดด้วยค่า NULL" หากสตริงของคุณมีความยาว 100 คุณจะเห็นขยะจำนวนมากเพราะมีการพิมพ์ทั้งหมด 300 ไบต์ไม่ว่าจะเหมาะสมหรือไม่ +1 ยังแนะนำให้ฉันรู้จักx!
Rob W

39

printfคำสั่งจะพิมพ์สตริงสมบูรณ์:

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

2
ขอโทษด้วย แต่นี่ไม่เป็นความจริง
UmNyobe

11
นี้ดูเหมือนว่าจะเคารพset print elements nnnขีด จำกัด set print elements 0และจะไม่พิมพ์สตริงสมบูรณ์จนกว่าคุณจะทำ
Mark Lakata

3
เมื่อฉันลองทำสิ่งนี้ฉันจะได้รับ: "ไม่สามารถแปลงค่าเป็นจำนวนเต็มได้"
ฟิลิปป์ลุดวิก

2
สำหรับ std :: string คุณต้องการ string.c_str () เพื่อหลีกเลี่ยงข้อผิดพลาด "ค่าไม่สามารถแปลงเป็นจำนวนเต็ม" ได้
Paul Childs

21

เพียงเพื่อทำให้เสร็จ:

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

คุณต้องให้ความยาว แต่อาจเปลี่ยนการแสดงของสตริงนั้น:

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

สิ่งนี้อาจมีประโยชน์หากคุณต้องการแก้ไขข้อบกพร่องด้วยค่าของมัน


1

การใช้set elements ...ไม่ใช่วิธีที่ดีที่สุดเสมอไป set string-elements ...มันจะมีประโยชน์ถ้ามีที่แตกต่างกัน

ดังนั้นฉันใช้ฟังก์ชั่นเหล่านี้ใน. gdbinit ของฉัน:

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

คำเตือน:

  • สิ่งแรกคือ c ++ lib ขึ้นอยู่กับการเข้าถึงสมาชิกของ std :: string แต่ปรับได้ง่าย
  • ตัวที่สองสามารถใช้กับโปรแกรมที่กำลังรันได้เมื่อเรียกใช้ strlen เท่านั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.