ฉันต้องการตรวจสอบเนื้อหาของ a std::vector
ใน GDB ฉันจะทำอย่างไร สมมติว่ามันเป็นstd::vector<int>
เรื่องของความเรียบง่าย
ฉันต้องการตรวจสอบเนื้อหาของ a std::vector
ใน GDB ฉันจะทำอย่างไร สมมติว่ามันเป็นstd::vector<int>
เรื่องของความเรียบง่าย
คำตอบ:
หากต้องการดู vector std :: vector myVector เนื้อหาเพียงพิมพ์ใน GDB:
(gdb) print myVector
สิ่งนี้จะสร้างผลลัพธ์คล้ายกับ:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
เพื่อให้บรรลุเป้าหมายข้างต้นคุณต้องมี gdb 7 (ฉันทดสอบใน gdb 7.01) และ python pretty-printer กระบวนการติดตั้งของสิ่งเหล่านี้อธิบายไว้ในgdb wikiวิกิพีเดีย
มีอะไรเพิ่มเติมหลังจากติดตั้งข้างต้นมันใช้งานได้ดีกับEclipse C ++ debugger GUI (และ IDE อื่น ๆ ที่ใช้ GDB อย่างที่ฉันคิด)
$HOME/.gdbinit
จำเป็น ในขณะที่ฉันจบลงด้วยไม่มีไฟล์ดังกล่าวที่ทุกคนและถูกต้องแสดงเนื้อหาของgdb
std::vector
อย่างไรก็ตามเนื่องจากในระหว่างการพยายาม "rambling" ของฉันฉันเพิ่งติดตั้งและ unistalled แล้วcgdb
และฉันได้libstdc++5
ติดตั้งแล้วฉันไม่ทราบว่าทำไมการพิมพ์สวยไม่ทำงานในขณะนี้ทำงาน
ด้วย GCC 4.1.2 หากต้องการพิมพ์ std :: vector <int> ทั้งหมดที่เรียกว่า myVector ให้ทำดังนี้:
print *(myVector._M_impl._M_start)@myVector.size()
หากต้องการพิมพ์เฉพาะองค์ประกอบ N แรกให้ทำ:
print *(myVector._M_impl._M_start)@N
คำอธิบาย
นี่อาจขึ้นอยู่กับเวอร์ชันคอมไพเลอร์เป็นอย่างมาก แต่สำหรับ GCC 4.1.2 ตัวชี้ไปยังอาร์เรย์ภายในคือ:
myVector._M_impl._M_start
และคำสั่ง GDB เพื่อพิมพ์องค์ประกอบ N ของอาร์เรย์เริ่มต้นที่ตัวชี้ P คือ:
print P@N
หรือในรูปแบบย่อ (สำหรับ. gdbinit มาตรฐาน):
p P@N
Cannot evaluate function -- may be inlined
_M_impl
ฯลฯ ) สำหรับคอมไพเลอร์ของคุณภายใต้ GDB 7.0+ ให้ใช้print /r myVector
'การดู' คอนเทนเนอร์ STL ในขณะที่การดีบักค่อนข้างเป็นปัญหา นี่คือโซลูชั่นที่แตกต่างกัน 3 แบบที่ฉันเคยใช้ในอดีตไม่มีวิธีแก้ปัญหาใดที่สมบูรณ์แบบ
1) ใช้สคริปต์ GDB จากhttp://clith.com/gdb_stl_utils/สคริปต์เหล่านี้อนุญาตให้คุณพิมพ์เนื้อหาของคอนเทนเนอร์ STL เกือบทั้งหมด ปัญหาคือว่าสิ่งนี้ไม่ได้ผลสำหรับภาชนะซ้อนกันเช่นกองซ้อนของชุด
2) Visual Studio 2005 มีการสนับสนุนที่ยอดเยี่ยมสำหรับการดูคอนเทนเนอร์ STL ใช้งานได้กับคอนเทนเนอร์ที่ซ้อนอยู่ แต่ใช้สำหรับการใช้งาน STL เท่านั้นและไม่ทำงานหากคุณวางคอนเทนเนอร์ STL ในคอนเทนเนอร์ Boost
3) เขียนฟังก์ชั่น 'print' ของคุณเอง (หรือวิธีการ) สำหรับรายการเฉพาะที่คุณต้องการพิมพ์ขณะทำการดีบั๊กและใช้ 'call' ในขณะที่อยู่ใน GDB เพื่อพิมพ์รายการ โปรดทราบว่าหากฟังก์ชั่นการพิมพ์ของคุณไม่ได้ถูกเรียกที่ใดในรหัส g ++ จะทำการกำจัดโค้ดที่ตายแล้วและฟังก์ชัน 'พิมพ์' จะไม่ถูกค้นพบโดย GDB (คุณจะได้รับข้อความแจ้งว่าฟังก์ชั่นอินไลน์) ดังนั้นคอมไพล์ด้วย -fkeep-inline-functions
ใส่ต่อไปนี้ใน ~ / .gdbinit
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
หลังจากรีสตาร์ท gdb (หรือการจัดหา ~ / .gdbinit) ให้แสดงความช่วยเหลือที่เกี่ยวข้องเช่นนี้
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
ตัวอย่างการใช้งาน:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}
สายไปงานเลี้ยงเล็กน้อยดังนั้นส่วนใหญ่เตือนให้ฉันในครั้งต่อไปที่ฉันทำการค้นหานี้!
ฉันสามารถใช้:
p/x *(&vec[2])@4
พิมพ์ 4 องค์ประกอบ (เป็นฐานสิบหก) จากราคาเริ่มต้นที่vec
vec[2]