سؤال

أريد فحص محتويات أ 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'}}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top