c++ - Valgrind 在程序出现段错误之前就以 "pure virtual method called"中止

标签 c++ inheritance memory-leaks gdb valgrind

当我运行单元测试时,我试图找出导致段错误的原因。

当我通过 gdb 运行它时,程序完成了有问题的测试 block ,然后抛出一个带有消息“损坏的双链表”的 SIGABORT。从回溯中,我确定问题发生在全局 ProtocolType 对象的析构函数中。

因此,我通过 valgrind 运行该程序,发生了两件事:其一,我收到大量错误;其二,我收到大量错误。太多了,无法手动挑选。其次,它给了我不同的终止消息。 Valgrind 仅在第二个测试用例中崩溃,输出为“调用纯虚拟方法”。

我相当确定这与我的第一个错误有不同的原因,因为 ProtocolType 类不使用任何虚拟方法,并且不是任何其他类的父类或子类。

有没有办法抑制“纯虚方法调用”异常,以便 valgrind 能够到达我的错误发生的地方?或者我可以从 valgrind 的异常生成回溯以便我可以解决这个问题吗?

最佳答案

你的想法完全倒退了。您在发布代码中看到的错误是早期发生的损坏的受害者。你不能从受害者身上解决问题,你需要看看肇事者。因此,开始查看这些消息。

你可能是对的,其中很多都是虚假的。如果是这样,您将快速将它们过滤成类别。但甚至有可能存在一些被您称为“糟糕”的代码,而这些代码通常会以无害的方式失败。例如,如果您有一个错误,访问数组超出了一个字节的范围,如果该数组通常是 10 个字节,那么这可能是无害的,因为您的分配器可能分配 16 个字节。但如果数组大小是16字节,...

从头开始。您不想尝试解决执行环境已损坏很久之后可能发生的问题。

由于这些是单元测试,因此如果您可以仅运行该单元测试,则可以单独调试每个单元测试。然后您就知道每次测试都是从干净的环境开始的。但不要忽略执行运行早期的任何警告或错误。

关于c++ - Valgrind 在程序出现段错误之前就以 "pure virtual method called"中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63141925/

相关文章:

c# - C# 程序员学习 C++ 的最佳场所

C++调用函数导致调用另一个函数

python - 在多重继承的情况下, super 方法如何在 python 中工作?

php - Apache 崩溃 : Cannot allocate memory

c++ - 成功分配的数组太大时访问指针时出错

c++ - 如何使 std::wofstream 写入 UTF-8?

c++ - 成员变量可以用来初始化初始化列表中的其他成员吗?

c++ - 从基指针调用派生方法

javascript - 关闭时销毁 JQuery UI 对话框时出现大量 IE7 内存泄漏

iphone - UINavigationController:推送的 View 何时收到 Dealloc 消息?