c++ - 如何使用 Valgrind 检测段错误细节?

标签 c++ linux debugging valgrind

我有一个 std::map< std::string, std::string> ,它通过一些 API 调用进行了初始化。当我尝试使用此 map 时,我遇到了段错误。如何检测无效代码或无效代码或任何可以帮助我解决问题的细节?代码如下所示:

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"

最佳答案

您使用以下语法启动您的应用程序(在 Debug模式下编译):

valgrind yourapp

Valgrind 将向您显示发生段错误的堆栈回溯。之后,由您来查找发生的事情并进行纠正。

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

另一个想法:你的 map 中的字符串键怎么样?是否有可能其中一些静默(无异常(exception))未能分配用作键的字符串的数据部分。 std::map 不是哈希表,而只是一些有序容器。当搜索一个键时,它可能需要访问其他键并且那里可能会发生一些事情。检查您是否可以尝试迭代 map 中的所有键并显示内容(查看“some_key”是否特别出现问题,或者您是否无法访问 map 中的任何内容。

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

关于c++ - 如何使用 Valgrind 检测段错误细节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2683778/

相关文章:

c++ - windows.h和int min不喜欢彼此

linux - 如何定义一个 cron 表达式在每个月的第一个星期一执行脚本?

c - 为什么这个 printf() 语句不会在 C 中打印两个字符串变量?

python - 运行以退出代码 -1 结束的 Pycharm 调试

xcode - 中断 _NSLockError() 以进行调试......如何?

c++ - 是否有在 Openg GL 中使用混合的 glCopyImageSubData 版本?

c++ - 如何将二进制文件读入无符号字符 vector

c++ - kernel.cpp 在制作 kernel.o 时显示错误和 Makefile 错误

c++ - 更改或检查 std::ofstream 的打开模式

linux - 在 Linux 启动脚本中获取其他脚本