当我运行单元测试时,我试图找出导致段错误的原因。
当我通过 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/