2010-04-21 6 views
10

Mam std :: map < std :: string, std :: string>, które zostały zainicjalizowane za pomocą niektórych wywołań API. Kiedy próbuję użyć tej mapy, otrzymuję błąd segmentacji. Jak wykryć niepoprawny kod lub co jest nieważne lub jakikolwiek szczegół, który może mi pomóc rozwiązać problem? Kod wygląda następująco:Jak wykryć szczegóły uszkodzenia segmentacji za pomocą 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' nie jest przypadkiem globalnym, do którego uzyskujesz dostęp w niektórych konstruktorach obiektów globalnych, prawda? –

+0

@Davit: BTW, możesz chcieć zaakceptować odpowiedź co jakiś czas. Poinformowanie wszystkich, która odpowiedź rozwiązała Twój problem, jest ważnym aspektem społeczności SO. –

+0

ok, napiszę o poprawce –

Odpowiedz

3

Generalnie nie jestem pewien, w jaki sposób linia może generować błąd seg: operator nawias zawsze będzie zwracał std :: string (w razie potrzeby tworząc pustą) i powinien zawsze być ważny do drukowania.

Czy to możliwe, że stos wywołań, który widzisz, wskazuje na następną linię do wykonania i umiera w some_func? Nie widzimy kodu, więc nie mogę powiedzieć, czy to może być przyczyną problemu.

Alternatywnie jest some_func za pomocą char * (wywołuje temp std :: string), aby zainicjować ciągi na mapie? Możliwe, że mógł wprowadzić nieprawidłowy ciąg znaków na mapie, który "zadziałał" przez jakiś czas, ale gdy some_func zwróci, nie wchodzi w interakcje z odciskiem.

2

uruchomić aplikację (skompilowany w trybie debugowania) ze składnią:

valgrind yourapp 

Valgrind pokaże ślad stosu gdzie wystąpiły usterki segmentacji. Następnie musisz znaleźć to, co się stało i poprawić.

W twoim kodzie, niezależnie od valgrind, sprawdziłbym, co zwraca cont[ "some_key" ] najbardziej prawdopodobną przyczyną twojego segfaulta jest to, że zwrócona wartość jest jakimś wild pointerem lub w ogóle nie jest zainicjalizowana. Jeśli tak, każda próba dostępu do niego, taka jak cont["some_key"][0], spowoduje również błąd segmentacji.

Kolejny pomysł: co z kluczami łańcuchowymi na mapie? Czy jest możliwe, że niektórym z nich w trybie cichym (bez wyjątku) nie udało się przydzielić części danych ciągu znaków użytego jako klucz. Std :: map nie jest tablicą haszującą, ale tylko zamówionym kontenerem. Szukając klucza, może potrzebować dostępu do innych kluczy i może się tam zdarzyć gówno. Aby sprawdzić, czy możesz spróbować iterować na wszystkich klawiszach na mapie i wyświetlać zawartość (aby sprawdzić, czy problem występuje z użyciem "some_key" lub nie masz dostępu do mapy). Program nie wymaga zamawiania, aby zobaczyć, czy problem jest taki sam.

+0

ponownie sprawdzę kod, zaktualizowałem go, dodałem nowe komentarze, które muszą opisywać problem –

0

Oprócz valgrind, można spróbować użyć debuggera aby skupić się na problemie.

Ustaw punkt przerwania w some_func(cont) linii i zbadać jeśli cont jest prawidłową referencją:

Co więcej, zastanawiałeś się, co powraca cont["some_key"], jeśli some_key nie występuje?

Powiązane problemy