2010-04-21 6 views
10

Ich habe eine std :: map < std :: string, std :: string> die mit einigen API-Aufruf initialisiert. Wenn ich versuche, diese Karte zu verwenden, erhalte ich einen Segmentierungsfehler. Wie kann ich ungültigen oder ungültigen Code oder Details erkennen, die mir helfen können, das Problem zu beheben? Code sieht wie folgt aus:Wie erkennt man Fehler bei der Segmentation mit Valgrind?

std::map< std::string, std::string> cont; 

some_func(cont); // getting parameter by reference and initialize it, someone corrupted memory (cont) inside this function 

std::cout << cont[ "some_key" ] << '\n'; // segmentation fault here, cannot access "some_key" 
+0

'cont' wäre nicht ein global, auf das Sie in einigen globalen Objekten Konstruktor zugreifen würde es? –

+0

@Davit: BTW, Sie möchten vielleicht ab und zu eine Antwort akzeptieren. Jeder weiß, welche Antwort Ihr Problem gelöst hat, ist ein wichtiger Aspekt der SO-Community. –

+0

ok Ich werde über Fehler –

Antwort

3

Im Allgemeinen bin ich mir nicht sicher, wie diese Zeile einen seg-Fehler erzeugen könnte: Der Klammeroperator gibt immer einen std :: string zurück (erzeugt bei Bedarf einen leeren) und sollte immer zum Drucken gültig sein.

Ist es möglich, dass stattdessen der Aufrufstack, den Sie sehen, auf die nächste Zeile zeigt, die ausgeführt werden soll, und in some_func endet? Wir sehen den Code dafür nicht, also kann ich nicht sagen, ob es das Problem verursachen könnte.

Ist alternativ some_func mit char * (ruft temp std :: string) initialisiert Strings in der Karte? Es ist möglich, dass es eine ungültige Zeichenkette in die Map einführt, die "für eine Weile funktioniert", aber wenn einige_func zurückkommt, interagiert es nicht mit der Druckquelle.

2

Sie Ihre Anwendung starten (im Debug-Modus kompiliert) mit der Syntax:

valgrind yourapp 

Valgrind Sie zeigt den Stapel Backtrace von wo Segmentierungsfehler aufgetreten. Danach liegt es an Ihnen zu finden, was passiert ist und es zu korrigieren.

In Ihrem Code, unabhängig von Valgrind, würde ich überprüfen, was cont[ "some_key" ] die wahrscheinlichste Ursache für Ihre segfault zurückgegeben wird, ist, dass der zurückgegebene Wert ist einige wilde Zeiger oder überhaupt nicht initialisiert. Wenn so versuchen Sie es wie cont["some_key"][0] zuzugreifen, würde auch einen Segmentierungsfehler verursachen.

Eine andere Idee: Was ist mit den String-Schlüsseln in Ihrer Karte? Ist es möglich, dass einige von ihnen stillschweigend (keine Ausnahme) den Datenteil der als Schlüssel verwendeten Zeichenfolge nicht zuordnen konnten. Die std :: map ist keine Hash-Tabelle, sondern nur ein geordneter Container. Wenn man einen Schlüssel sucht, muss man vielleicht auf andere Schlüssel zugreifen, und da könnte Scheiße passieren. Um zu überprüfen, ob Sie versuchen können, alle Schlüssel in Ihrer Map zu iterieren und Inhalt anzuzeigen (um zu sehen, ob ein Problem speziell mit "some_key" auftritt oder wenn Sie auf nichts in map zugreifen können.

Sie könnten auch mit einer unordered_map versuchen, wenn Sie Programm muss nicht sehen, die Bestellung, wenn das Verhalten ist das gleiche.

+0

Code wieder zu schreiben, ich aktualisierte es, fügte neue Kommentare hinzu, die Problem beschreiben müssen –

0

Neben valgrind, könnten Sie versuchen, einen Debugger, um mit auf Ihrem Problem zu konzentrieren.

einen Haltepunkt in some_func(cont) Linie, und untersucht wenn cont eine gültige Referenz ist

Darüber hinaus haben Sie überlegten, was cont["some_key"] zurückgibt, wenn some_key nicht vorhanden ist?