Probleme beim debuggen mit STL Set



  • Hallo,

    ich schreibe ein Programm, in dem ich mehrere sets aus der STL benutze. Ich habe aber ein Problem, bei dem mir die Suchfunktion und auch Google nicht weiter helfen konnten. Ich kann im Debugger nämlich nicht nachschauen, welche Elemente ein set gerade enthält. Das set selber mit seinen Eigenschaften wird angezeigt, die Elemente, die es enthält aber nicht. Ich arbeite unter Linux mit kdevelop. Zum Testen habe ich folgenden Code genommen:

    std::set<int> intSet;
    intSet.insert(10);
    intSet.insert(2);
    intSet.insert(4);
    std::set<int>::iterator iter;
    for(iter=intSet.begin(); iter!=intSet.end(); iter++)
    {
    	std::cout << *iter << std::endl;
    }
    

    Das Programm gibt dann auch die Zahlen 2, 4 und 10 aus. Wenn ich das Programm nach der for-Schleife anhalte steht das hier im Debugger-Fenster:

    Variable                                                     Wert              Typ
    
    intSet                                                                         std::set<int,std::less<int>,std::allocator<int> >
      _M_t                                                                         std::_Rb_tree<int,int,std::_Identity<int>,std::less<int>,std::allocator<int> >
        _M_impl                                                                    std::_Rb_tree<int,int,std::_Identity<int>,std::less<int>,std::allocator<int> >::_Rb_tree_impl<std::less<int>,false>
          <std::allocator<std::_Rb_tree_node<int>>                                 std::_Rb_tree<int,int,std::_Identity<int>,std::less<int>,std::allocator<int> >::_Rb_tree_impl<std::less<int>,false>
            <__gnu_cxx::new_allocator<std::_Rb_tree_node<int> >> <No data fields>  std::_Rb_tree<int,int,std::_Identity<int>,std::less<int>,std::allocator<int> >::_Rb_tree_impl<std::less<int>,false>
          _M_key_compare                                                           std::less<int>
            <>                                                   <No data fields>  std::less<int>
          _M_header                                                                std::_Rb_tree_node_base
            _M_color                                                               std::_S_redstd::_Rb_tree_color
            _M_parent                                            0x804c038         std::_Rb_tree_node_base *
              ...
            _M_left                                              0x804c008         std::_Rb_tree_node_base 
              ...
            _M_right                                             0x804c020         std::_Rb_tree_node_base *
              ...
          _M_node_count                                          3	               size_t
    

    Sollten unter _M_key_compare oder irgendwo anders nicht die drei Integer 10, 2 und 4 stehen?
    Ich habe das Programm auch einmal mit dem Debugger ddd laufen lassen, der zeigt aber auch das gleiche an.
    Dem Kompiler habe ich die Option -g zum Debuggen mit gegeben.
    Was muss ich einstellen, dass ich die Werte im Debugger sehen kann? Ich will ja nicht an allen Stellen, an denen ich das set untersuchen will, die for-Schleife von oeben rein kopieren und nachher wieder löschen.

    Schon mal vielen Dank für eure Antworten



  • Die Werte des set's werden üblicherweise in einem Binärbaum untergebracht, also müsstest du dich durch die Zeigerstruktur durchahngeln, die unter dem _M_Header aufgebaut ist (bist du sicher, daß zwischen den ... keine _M_Value (oder so ähnlich) Einträge zu finden sind, wo die einzelnen Werte stehen?).

    Ansonsten: Die STL-Klassen sind eigentlich recht zuverlässig (wenn du sie nicht zweckentfremdet hast) - da ist es normalerweise nicht nötig, sie zu debuggen. Und wenn doch, bleibt noch die Möglichkeit, den Inhalt aus dem Programm heraus auszugeben.



  • Ich will ja nicht die STL Klassen debuggen, sondern nur zur Laufzeit gucken, welche Elemente gerade im set drin sind, weil in meinem Programm irgendwo eine Fehler steckt, den ich nicht finde.
    Unter _M_header gibt es vier Elemente: _M_color, _M_parent, _M_left und _M_right. _M_parent, _M_left und _M_right haben wieder diese vier Elemente unter sich, die wieder _M_color, _M_parent, _M_left und _M_right haben, usw. Ich kann mich da soviel durch hangeln wie ich will, es kommen aber immer wieder nur diese Elemente. Einen int-Wert finde ich da nicht.


Anmelden zum Antworten