Darling, why don’t you just look at the std::map?

Ich hasse es, STL-Container debuggen zu müssen.

In Microsofts Visual Studio kann man sich ja im Debugger recht schön Element für Element den Inhalt einer std::map, eines std::sets oder eines std::vectors anzeigen lassen. Dummerweise kenne ich keine einfache Möglichkeit, sich die Speicherstelle anzeigen zu lassen, an der ein Element oder die size dieses Containers liegt, um auf diese Speicherstelle einen Breakpoint zu setzen, der mich alarmiert, wenn sich da was ändert.

Beispiel: ich habe eine std::map von Daten-Varianten, die ihrerseits eine std::map verschiedenen Ressourcen enthalten, die ihrerseits eine std::map von Kapazitätsobjekten dieser Ressourcen enhalten, die ihrerseits eine std::map von den eigentlichen Kapazitätswerten enthalten. Irgendwo, irgendwie, irgendwann gehen mir manche dieser std::maps mit Kapazitätswerten kaputt. Jetzt würde ich gerne herausfinden, an welcher Stelle im Programm das passiert, und dazu einen Daten-Haltepunkt auf der size dieser std::map anlegen. Das wäre schön praktisch: ich lasse das Programm laufen, und irgendwann, *blink*, meldet sich der Debugger, weil die Größe meiner std::map plötzlich bei drölfzig Milliarden liegt statt bei, sagen wir, 42.
Guter Plan.

Um sich den Speicherort ausgeben zu lassen, an dem man diesen Breakpoint setzen kann, muss man aber solche Verrenkungen unternehmen wie

&(m_pGanttViewCtrl->m_varMan
->m_variants._Myhead->_Left->_Myval.second
->m_pRessourcen->m_resMap._Myhead->_Right->_Myval.second
->m_pResKapazitaeten->m_capacities._Mysize)

womit der Debugger das erste Element der m_variants-map nimmt, dort dem Ressourcenpointer in seine m_resMap folgt, dort (in diesem Beispiel) das letzte Ressourcen-Element rausgreift, von dem er sich den Kapazitätenpointer und dessen m_capacities-map geben lässt, in der er dann _Mysize findet, wovon er sich schlussendlich die Speicherstelle ausgeben lässt.

Heute nacht habe ich mich in verschachtelten STL-Containern verlaufen, und alle waren knallbunt und riesengroß und enthielten jeweils noch ein ganzes Containerschiff voller Container, und die waren auch alle knallbunt und riesengroß und enthielten jeweils noch ein ganzes Containerschiff voller Container, und so weiter, und alle sollten sofort entladen werden, und ich musste doch noch was finden, aber ich wusste nicht mehr, was, und die Zeit drängte so und ich konnte es nicht finden, ich wusste ja nicht, wo es war, und dann — dann klingelte der Wecker.

Advertisements

2 Antworten zu “Darling, why don’t you just look at the std::map?

    • Ja, ich weiß, dass ich in Visual Studio allerlei interessanten Kram anstellen kann, wenn ich diese Datei editiere. Ich kann auch bestimmt noch viel mehr und noch interessanteren Kram anstellen, wenn ich Visual Studio re-engineere und ein wenig drin rumhacke.
      Es gibt ja auch bei Sourceforge ein nettes Projekt (zumindest für VS6), das man in eben diese Datei einbinden kann und welches einem für Container allerlei Wissenswertes anzeigt. Das ist aber nicht der Punkt.
      Worauf ich hinauswollte: MMn sollte sowas wie „Wo werden die meinem STL-Container zu Grunde liegenden Strukturen im Speicher abgelegt?“ eigentlich mit einem einfach Menü-Eintrag ein- und auszuschalten sein. Dann hat man halt entweder die komfortable Übersicht oder den präzisen Einblick.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s