Как обнаружить детали ошибки сегментации, используя Valgrind? - PullRequest
12 голосов
/ 21 апреля 2010

У меня есть std :: map , который инициализирован с помощью некоторого вызова API. Когда я пытаюсь использовать эту карту, я получаю ошибку сегментации. Как я могу обнаружить недействительный код или что является недействительным или какие-либо детали, которые могут помочь мне решить проблему? Код выглядит так:

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"

Ответы [ 3 ]

3 голосов
/ 21 апреля 2010

В общем, я не уверен, как эта строка могла генерировать ошибку сегмента: оператор скобок всегда будет возвращать std :: string (при необходимости создавая пустую), и он всегда должен быть действительным для печати. ​​

Возможно ли, что вместо этого стек вызовов, который вы видите, указывает на следующую строку для выполнения, и он умирает в some_func?Мы не видим код для него, поэтому я не могу сказать, может ли это быть причиной проблемы.

Альтернативно some_func с использованием char * (вызывает temp std :: string) для инициализации строк вкарта?Вполне возможно, что это может привести к появлению недопустимой строки на карте, которая «работает» некоторое время, но когда возвращается some_func, она плохо взаимодействует с печатью.

3 голосов
/ 21 апреля 2010

вы запускаете ваше приложение (скомпилированное в режиме отладки) с синтаксисом:

valgrind yourapp

Valgrind покажет вам трассировку стека, где произошла ошибка сегментации. После этого вам решать, что произошло, и исправить это.

В вашем коде, независимо от valgrind, я бы проверил, что возвращает cont[ "some_key" ] Наиболее вероятная причина вашего segfault заключается в том, что возвращаемое значение является неким диким указателем или не инициализируется вообще. В этом случае любая попытка доступа к нему, например cont["some_key"][0], также приведет к ошибке сегментации.

Еще одна идея: как насчет строковых ключей на вашей карте? Возможно ли, что некоторые из них молча (без исключения) не смогли выделить часть данных строки, используемой в качестве ключа. Std :: map - это не хеш-таблица, а просто какой-то упорядоченный контейнер. При поиске ключа может потребоваться доступ к другим ключам, и там может произойти дерьмо. Чтобы проверить, что вы можете попытаться выполнить итерацию по всем ключам на вашей карте и показать содержимое (чтобы увидеть, возникает ли проблема именно с «some_key» или если вы ничего не можете получить в карте.

Вы также можете попробовать использовать unordered_map, если ваша программа не нуждается в упорядочении, чтобы увидеть, является ли поведение таким же.

0 голосов
/ 21 апреля 2010

В дополнение к valgrind, вы можете попробовать использовать отладчик, чтобы сосредоточиться на вашей проблеме.

Установите точку останова в строке some_func(cont) и проверьте, является ли cont действительной ссылкой.

Кроме того, вы рассмотрели, что cont["some_key"] возвращает, если some_key отсутствует?

...