valgrind可以报告丢失块的内存地址(用于调试递归函数调用)吗?

时间:2016-05-05 14:20:35

标签: c++ recursion valgrind

This问题与我的问题最相似,但它相当陈旧,所以我想知道从那以后发生了什么变化。

我的valgrind输出是:

==29443== 109 (16 direct, 93 indirect) bytes in 2 blocks are definitely lost in loss record 270 of 309
==29443==    at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29443==    by 0x4F4E8DB: grl::Configuration::Configuration(grl::Configuration const&) (configuration.h:192)
==29443==    by 0x4F49973: grl::YAMLConfigurator::load(YAML::Node const&, grl::Configuration*, std::string const&) (configurable.cpp:74)
==29443==    by 0x4F499FC: grl::YAMLConfigurator::load(YAML::Node const&, grl::Configuration*, std::string const&) (configurable.cpp:75)
==29443==    by 0x4F499FC: grl::YAMLConfigurator::load(YAML::Node const&, grl::Configuration*, std::string const&) (configurable.cpp:75)
==29443==    by 0x4F499FC: grl::YAMLConfigurator::load(YAML::Node const&, grl::Configuration*, std::string const&) (configurable.cpp:75)
==29443==    by 0x40C78E: grl::YAMLConfigurator::load(std::string, grl::Configuration*, std::string const&) (configurable.h:321)
==29443==    by 0x40B897: main (deployer.cpp:180)

程序在开始时配置了从yaml文件读取的递归调用,并将所有必需参数作为一对(name, allocated address)存储在地图中。我可以打印这些对。因此,如果valgrind可以告诉我一个丢失值的地址,那么我可以得到一个参数的名称,并检查它没有被释放的原因。

如果无法使用该功能,我还可以使用其他什么?

1 个答案:

答案 0 :(得分:0)

您可以使用vgdb在valgrind + gdb下运行您的程序。 见http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver

然后你可以使用各种valgrind memcheck监视器命令来做 泄漏搜索并具有泄漏块的地址/大小。 见http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands