Как обнаружить использование деталей отказа сегментации Valgrind?

У меня есть станд.:: карта <станд.:: строка, станд.:: строка>, который инициализировал с некоторым вызовом 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"
12
задан Davit Siradeghyan 21 April 2010 в 15:35
поделиться

3 ответа

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

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

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

3
ответ дан 2 December 2019 в 23:19
поделиться

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

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

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

0
ответ дан 2 December 2019 в 23:19
поделиться

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

valgrind yourapp

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

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

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

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

3
ответ дан 2 December 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: