c++ - 调试堆上损坏的对象

标签 c++ gdb valgrind lldb

我正在调试一个非常重要的软件项目,其中堆上有一堆对象。在某个时间点(至少)这些对象之一被损坏。

我在我的类中添加了一个 const 成员作为金丝雀,事实上,它在执行过程中被破坏了。通常我会向这个变量添加一个观察点,以确定何时写入内存。但是,我不知道哪个实例被覆盖了,因为类中存储的任何信息也会被破坏。

我有太多的对象,无法在每个对象上设置观察点,而且我无法使用较小的输入集进行重现。运行 valgrind 我看到“大小为 4 的无效读取”,这是我正在读取的 4 个字节的 canary int,但此时已经为时已晚。

关于如何从这里开始有什么建议吗?

最佳答案

可能这不够具体,但当我遇到类似问题时,这就是我最终做的事情。我假设您可以确定性的方式重现您的问题。

我的策略是先找出是哪个实例导致了问题。这是我在暴露症状的特定线路上使用计数器完成的。例如,在 Visual Studio 上,我会设置一个在第 100000 次命中时触发的断点,这样它就永远不会触发;但 Visual Studio 仍然会告诉您在执行过程中遇到了多少次断点。通过反复试验,我会发现问题发生在第 20 次遇到断点时,因此我将断点设置为在第 19 次迭代时触发,以便能够在损坏发生之前区分适当的实例。

从那里开始,我可以获得之前损坏的变量的地址,并使用调试器找出发生了什么:收集有关故障实例的足够信息。

然后,我在战略位置设置了断点,这些断点由条件触发:例如。仅针对具有适本地址或成员中具有特定值的实例触发。

您可能会准确地知道症状何时出现,但不会知道问题所在,但这仍然很重要。

希望这对您有所帮助!

关于c++ - 调试堆上损坏的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37855192/

相关文章:

debugging - 在 GDB 中如何解决重复符号

c - Netbeans 8.1 C 调试器错误?

c - "Bad permissions for mapped region at address"哈希表的 Valgrind 错误

valgrind - 解释 callgrind 数据

c - 读取大小无效 - 查找命令行平均值

C++ 将 unsigned char 数组转换为 String 表示形式的 long(或 long long)

c++ - 使用上一次调用的结果递归调用每个元组成员

c - 如何让变量名和行号出现在 GDB 中?

c++ - 交互式编辑 QPixmap 上的现有矩形?

c++ - 必须重写的虚函数