Как определить данные о недостатках сегментации с помощью 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 не присутствует?