كيف يمكنني طباعة عناصر متجه C ++ في GDB؟
سؤال
أريد فحص محتويات أ std::vector
في GDB ، كيف أفعل ذلك؟ دعنا نقول أنها أ std::vector<int>
من أجل البساطة.
المحلول
لعرض المتجه std :: vector myVector Contents ، فقط اكتب في GDB:
(gdb) print myVector
سيؤدي هذا إلى إنتاج ناتج مشابه لـ:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
لتحقيق أعلاه ، تحتاج إلى الحصول على GDB 7 (لقد اختبرته على GDB 7.01) وبعض Python Prettle Printer. تم وصف عملية تركيب هذه GDB ويكي.
ما هو أكثر من ذلك ، بعد التثبيت أعلاه ، هذا يعمل بشكل جيد مع كسوف C ++ Debugger واجهة المستخدم الرسومية (وأي IDE آخر باستخدام GDB ، كما أعتقد).
نصائح أخرى
مع GCC 4.1.2 ، لطباعة كامل std :: ناقلاتu003Cint> يسمى 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 لطباعة عناصر صفيف تبدأ من المؤشر P هو:
print P@N
أو ، في شكل قصير (لمعايير .gdbinit):
p P@N
"مشاهدة" حاويات STL أثناء تصحيح الأخطاء يمثل مشكلة إلى حد ما. فيما يلي 3 حلول مختلفة استخدمتها في الماضي ، لا يوجد أي منها مثالي.
1) استخدام البرامج النصية GDB من http://clith.com/gdb_stl_utils/ تتيح لك هذه البرامج النصية طباعة محتويات جميع حاويات STL تقريبًا. المشكلة هي أن هذا لا يعمل مع الحاويات المتداخلة مثل مجموعة من المجموعات.
2) Visual Studio 2005 لديه دعم رائع لمشاهدة حاويات STL. هذا يعمل مع الحاويات المتداخلة ولكن هذا مخصص لتنفيذها لـ STL فقط ولا يعمل إذا كنت تضع حاوية STL في حاوية دفعة.
3) اكتب وظيفة "الطباعة" الخاصة بك (أو الطريقة) للعنصر المحدد الذي تريد طباعته أثناء تصحيح الأخطاء واستخدام "الاتصال" أثناء وجوده في GDB لطباعة العنصر. لاحظ أنه إذا لم يتم استدعاء وظيفة الطباعة الخاصة بك في أي مكان في الكود ، فستقوم G ++ بإزالة الكود الميت ولن يتم العثور على وظيفة "الطباعة" بواسطة GDB (ستحصل على رسالة تقول إن الوظيفة مضمّنة). لذا ، قم بالتجميع مع وظائف المحافظين
ضع ما يلي في ~/.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'}}