ฉันต้องการพิมพ์ความยาวเต็มของ C-string ใน GDB โดยค่าเริ่มต้นมันเป็นตัวย่อฉันจะบังคับให้ GDB พิมพ์สตริงทั้งหมดได้อย่างไร
ฉันต้องการพิมพ์ความยาวเต็มของ C-string ใน GDB โดยค่าเริ่มต้นมันเป็นตัวย่อฉันจะบังคับให้ GDB พิมพ์สตริงทั้งหมดได้อย่างไร
คำตอบ:
set print elements 0
set print elements
number-of-elements
กำหนดขีด จำกัด จำนวนองค์ประกอบของอาร์เรย์ GDB ที่จะพิมพ์ หาก GDB กำลังพิมพ์อาร์เรย์ขนาดใหญ่มันจะหยุดการพิมพ์หลังจากที่ได้พิมพ์จำนวนองค์ประกอบที่กำหนดโดยset print elements
คำสั่ง ขีด จำกัด นี้ยังใช้กับการแสดงสตริง เมื่อ GDB เริ่มต้นขีด จำกัด นี้ถูกตั้งไว้ที่ 200 ตั้งค่าจำนวนขององค์ประกอบที่จะเป็นศูนย์หมายความว่าพิมพ์ไม่ จำกัด
ตราบใดที่โปรแกรมของคุณอยู่ในสถานะมีสติคุณสามารถcall (void)puts(your_string)
พิมพ์ไปยัง stdout ได้เช่นกัน หลักการเดียวกันนี้ใช้กับฟังก์ชั่นทั้งหมดที่มีในตัวดีบัก
มีตัวเลือกที่สามคือคำสั่ง x ซึ่งช่วยให้คุณสามารถกำหนดขีด จำกัด ที่แตกต่างกันสำหรับคำสั่งเฉพาะแทนที่จะเปลี่ยนการตั้งค่าร่วม หากต้องการพิมพ์อักขระ 300 ตัวแรกของสตริงที่คุณสามารถx/300s your_string
ใช้ได้ เอาต์พุตอาจอ่านยากขึ้นเล็กน้อย ตัวอย่างเช่นการพิมพ์ผลแบบสอบถาม SQL ใน:
(gdb) x / 300sb stmt.c_str () 0x9cd948: "เลือกบทความ. r" ... 0x9cd958: "เป็นหนี้จาก articl" ... ..
x
!
printf
คำสั่งจะพิมพ์สตริงสมบูรณ์:
(gdb) printf "%s\n", string
set print elements nnn
ขีด จำกัด set print elements 0
และจะไม่พิมพ์สตริงสมบูรณ์จนกว่าคุณจะทำ
เพียงเพื่อทำให้เสร็จ:
(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}
สิ่งนี้อาจมีประโยชน์หากคุณต้องการแก้ไขข้อบกพร่องด้วยค่าของมัน
การใช้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
คำเตือน: