Как определить данные о недостатках сегментации с помощью Valgrind?
У меня есть std:: map < std::string, std::string > , которые инициализируются с помощью некоторого вызова 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"
Ответы
Ответ 1
В общем, я не уверен, как эта строка может генерировать ошибку seg: оператор скобки всегда возвращает std::string (при необходимости создавая пустой), и он всегда должен быть действительным для печати.
Возможно ли, что вместо этого стек вызовов, который вы видите, указывает на следующую строку для выполнения, и она умирает в some_func? Мы не видим код для него, поэтому я не могу сказать, может ли это быть причиной проблемы.
Альтернативно some_func
с помощью char * (вызывает temp std::string) для инициализации строк на карте? Возможно, что он может ввести неверную строку в карту, которая "будет работать" некоторое время, но когда some_func вернется, она не взаимодействует с принтом хорошо.
Ответ 2
вы запускаете свое приложение (скомпилированное в режиме отладки) с синтаксисом:
valgrind yourapp
Valgrind покажет вам обратную сторону стека, где произошла ошибка сегментации. После этого вам решать, что произошло и исправить.
В вашем коде, независимо от valgrind, я бы проверял, что возвращает cont[ "some_key" ]
, наиболее вероятная причина вашего segfault заключается в том, что возвращаемое значение является некоторым диким указателем или вообще не инициализировано. Если все попытки получить доступ к нему, например, cont["some_key"][0]
, также приведет к ошибке сегментации.
Другая идея: как насчет строковых ключей на вашей карте? Возможно ли, что некоторые из них молча (без исключения) не смогли выделить часть данных строки, используемой в качестве ключа. Std:: map - это не хеш-таблица, а только некоторый упорядоченный контейнер. При поиске ключа ему может потребоваться доступ к другим клавишам, и там может произойти дерьмо. Чтобы проверить, что вы можете попробовать выполнить итерацию по всем клавишам на карте и показать контент (чтобы увидеть, возникает ли проблема с "some_key" или если вы не можете получить доступ к карте на карте.
Вы также можете попробовать с unordered_map, если ваша программа не нуждается в заказе, чтобы узнать, является ли поведение одинаковым.
Ответ 3
В дополнение к valgrind вы можете попробовать использовать отладчик, чтобы сосредоточиться на своей проблеме.
Установите точку останова в строке some_func(cont)
и проверьте, является ли cont
допустимой ссылкой.
Кроме того, считаете ли вы, что cont["some_key"]
возвращается, если some_key не присутствует?