[英]How to detect segmentation fault details using 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"
您使用以下语法启动应用程序(在调试模式下编译):
valgrind yourapp
Valgrind将向您展示出现分段故障的堆栈回溯。 在那之后,你可以找到发生的事情并纠正它。
在你的代码中,无论valgrind如何,我都会检查返回cont[ "some_key" ]
什么是你的段错误的最可能原因是返回的值是一些狂野指针或根本没有初始化。 如果是这样,任何尝试访问它像cont["some_key"][0]
也会导致分段错误。
另一个想法:你的地图中的字符串键怎么样? 是否有可能其中一些(无例外)无法分配用作密钥的字符串的数据部分。 std :: map不是哈希表,只是一些有序的容器。 搜索密钥时,可能需要访问其他密钥,并且可能会发生这种情况。 要检查您是否可以尝试迭代地图中的所有键并显示内容(以查看问题是否与“some_key”具体相关,或者您是否可以在地图中访问任何内容。
如果您的程序不需要排序以查看行为是否相同,您也可以尝试使用unordered_map。
一般来说,我不确定该行如何产生seg错误:括号运算符将始终返回一个std :: string(如果需要,创建一个空字符串),它应始终对打印有效。
相反,您看到的调用堆栈是否可能指向要执行的下一行,并且它在some_func中死亡? 我们没有看到它的代码,所以我不能说它是否可能导致问题。
或者是some_func
使用char *(调用temp std :: string)初始化地图中的字符串? 它可能会在地图中引入一个无效的字符串“恰好工作”一段时间但是当some_func返回时它不会与打印井交互。
除了valgrind之外,您还可以尝试使用调试器来专注于您的问题。
在some_func(cont)
行中设置断点,并检查cont
是否为有效引用。
此外,如果some_key不存在,您是否考虑过cont["some_key"]
返回的内容?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.