如何使用Valgrind检测分段故障细节?

时间:2010-04-21 14:26:29

标签: c++ linux debugging 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"

3 个答案:

答案 0 :(得分:3)

使用以下语法启动应用程序(以调试模式编译):

valgrind yourapp

Valgrind将向您显示发生分段故障的堆栈回溯。在那之后,你可以找到发生的事情并纠正它。

在你的代码中,无论valgrind如何,我都会检查返回cont[ "some_key" ]最可能导致你的段错误的原因是返回的值是一些狂野指针还是根本没有初始化。如果是这样,任何尝试像cont["some_key"][0]那样尝试访问它也会导致分段错误。

另一个想法:地图中的字符串键怎么样?是否有可能其中一些(无例外)无法分配用作密钥的字符串的数据部分。 std :: map不是哈希表,只是一些有序的容器。搜索密钥时,可能需要访问其他密钥,并且可能会发生这种情况。要检查您是否可以尝试迭代地图中的所有键并显示内容(查看问题是否与“some_key”具体相关,或者您是否可以在地图中访问任何内容。

如果您的程序不需要排序以查看行为是否相同,您也可以尝试使用unordered_map。

答案 1 :(得分:3)

一般来说,我不确定该行是如何生成seg错误的:括号运算符将始终返回一个std :: string(如果需要,创建一个空的),它应该始终对打印有效。

是否有可能相反,您看到的调用堆栈指向要执行的下一行,并且它在some_func中死亡?我们没有看到它的代码,所以我不能说它是否可能导致问题。

或者some_func使用char *(调用temp std :: string)初始化地图中的字符串?有可能它会在地图中引入一个无效的字符串“碰巧工作”一段时间但是当some_func返回时它不会与打印井交互。

答案 2 :(得分:0)

除了v​​algrind之外,您还可以尝试使用调试器来专注于您的问题。

some_func(cont)行中设置断点,并检查cont是否为有效参考。

此外,如果some_key不存在,您是否考虑了cont["some_key"]返回的内容?