تفتيش الحاوية القياسية (std::خريطة) المحتويات مع gdb

StackOverflow https://stackoverflow.com/questions/427589

  •  06-07-2019
  •  | 
  •  

سؤال

لنفترض أن شيئا من هذا القبيل:

#include <map>
int main(){
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;
}

وأود أن تكون قادرة على فحص محتويات الخريطة تشغيل البرنامج من جدب.
إذا حاولت استخدام مشغل منخفض أحصل على:

(gdb) p m[1]
Attempt to take address of value not located in memory.

استخدام أسلوب بحث لا تسفر عن نتائج أفضل:

(gdb) p m.find(1)
Cannot evaluate function -- may be inlined

هل هناك طريقة لتحقيق هذا الهدف ؟

هل كانت مفيدة؟

المحلول

وأعتقد أن ليس هناك، على الأقل ليس إذا تم تحسين المصدر الخ ومع ذلك، هناك بعض وحدات الماكرو لجدب التي يمكن أن تفقد حاويات STL لك:

http://sourceware.org/ml/gdb/2008-02/ msg00064.html

ولكن، أنا لا أستعمل هذا، لذلك YMMV

نصائح أخرى

القائمة الإجابات على هذا السؤال هي جدا خارج التاريخ.مع دول مجلس التعاون الخليجي مؤخرا و جدب يعمل فقطTM وذلك بفضل المدمج في بيثون في جدب 7.x و libstdc++ جدا الطابعات التي تأتي مع دول مجلس التعاون الخليجي.

بالنسبة OP سبيل المثال لا تحصل على:

(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}

إذا كان لا يعمل تلقائيا بالنسبة لك انظر النقطة الأولى على المحكمة الخاصة بلبنان دعم صفحة GDB ويكي.

يمكنك كتابة الثعبان جدا الطابعات الخاصة بك أنواع أيضا ، انظر جميلة الطباعة في جدب دليل.

وهناك دائما ما هو واضح: تحديد الخاصة بك اختبار وظيفة ... نسميها من جدب. منها مثلا:

#define SHOW(X) cout << # X " = " << (X) << endl

void testPrint( map<int,int> & m, int i )
{
  SHOW( m[i] );
  SHOW( m.find(i)->first );
}

int
main()
{
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;  // Line 15.
}

و:

....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD 

Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb) 

ووstl-views.gdb تستخدم ليكون أفضل رد كان هناك، ولكن ليس بعد الآن.

لا دمج هذا في GDB رئيسي بعد، ولكن هنا هو ما تحصل عليه باستخدام "آرتشر-tromey-الثعبان '<لأ href =" http://sourceware.org/gdb/wiki/ProjectArcher "يختلط = "noreferrer"> فرع :

(gdb) list
1   #include <map>
2   int main(){
3       std::map<int,int> m;
4       m[1] = 2;
5       m[2] = 4;
6       return 0;
7   }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run

Breakpoint 1, main () at map.cc:6
6       return 0;
(gdb) print m
$1 = std::map with 2 elements = {
  [1] = 2,
  [2] = 4
}
(gdb) quit

وحاول دي المراجع حاويات STL: في هذه الصفحة: HTTP: //www.yolinux كوم / الدروس / GDB-Commands.html

ويمكنك الحصول على حول المشكلة الثانية (Cannot evaluate function -- may be inlined) عن طريق التأكد من أن المترجم الخاص بك يستخدم (أو 3 أو 4) معلومات التصحيح-2 قزم عند ترجمة البرنامج. DWARF-2 يتضمن معلومات رمز مصدر، لذلك يجب أن تكون قادرة على استخدام أي من الأساليب التي وصفها للوصول إلى عناصر حاوية std::map الخاص بك.

لترجمة مع قزم-2 معلومات التصحيح، إضافة العلم -gdwarf-2 لقيادة الترجمة الخاصة بك.

والأجوبة أعلاه تعمل والغرامة. في حال كنت تستخدم STL-views.gdb، وهنا هو الطريقة المناسبة لعرض الخرائط والعناصر داخله. دعونا الخريطة الخاصة بك هي على النحو التالي:     std::map<char, int> myMap;

(gdb) pmap myMap char int

وأي بمعنى. pmap <variable_name> <left_element_type> <right_element_type> لرؤية العناصر في الخريطة.

وعلى أمل أن يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top