【问题标题】:What could be causing this crash?什么可能导致此崩溃?
【发布时间】:2009-09-28 15:51:40
【问题描述】:

我有一个 C++ 程序 (GCC),当我将一个或多个 int 成员添加到抽象基类时,程序开始崩溃。在我检查过的情况下,似乎通过添加此成员,派生类中的成员退出初始化(或在某些时候被踩到)。如果我添加更多成员,它开始(不)工作不同。这真的很奇怪,因为该成员从未在任何地方使用过。我可以注释掉那一行,程序重新编译就好了,运行没有错误。

整个程序约为 3KLOC,很难剥离。

我完全不知道从哪里开始寻找。有什么想法吗?


更新

我发现了问题:free-ing malloc-ed 内存和delete-ing new-ed 内存在同一个程序中不安全。

【问题讨论】:

  • 我们也不知所措,因为我们不知道您的代码是什么样的。发布抽象类。发布派生类。在它崩溃的地方发布代码行。发布一些东西!
  • 您是否构建了所有其他相关的二进制文件?例如,如果您的 Windows 正在使用多个 Dll 之类的东西,而您的基类是一个 dll,而派生在另一个 dll 中,那么您需要同时构建两者。
  • 如果您能提供仍然重现故障的最小程序,那将非常有帮助。我知道这可能需要您付出很大的努力。
  • @BCS:这意味着您可以按照 quamrana 的建议解决问题!
  • 关于更新,我想这在某些平台上可能是个问题,但我从来没有在同一个程序中同时执行 malloc/free 和 new/delete 遇到问题(使用旧库的乐趣)。当然,malloc/delete 或 new/free 可能会导致很多问题...

标签: c++ gcc


【解决方案1】:

100 次中有 99 次我发现如果你改变了一个类的数据结构并且你开始出现奇怪的崩溃,那么构建依赖关系就不太正确,即你需要重建一些由于某种原因没有重建的东西。

如果完全清理和重建你的整个项目不是一个主要的痛苦,那么我会试一试,然后我们可以排除这个答案。

【讨论】:

  • 这是我找到崩溃位置后的第一个想法。没有骰子。
【解决方案2】:

在我的脑海中,没有看到任何代码(请参阅您的问题中的 cmets)注意。

尝试添加不同大小的成员,或更多(未使用的)int 成员,或者可能是以下形式的字符串:const char xxx[50]; 以保留更多空间。

【讨论】:

  • 现在这很有趣:添加更多的 int 会改变失败的模式。这值得调查...
  • ...如果您的类实例是在堆上分配的,则使用 valgrind。它可能会很慢,但它会比人类在调试器中眯着眼睛盯着位模式试图弄清楚是什么在做踩踏要快得多。它只会在发生时为您提供完整的堆栈。
【解决方案3】:

更多关于崩溃的信息会很有帮助,因为程序崩溃的方式有很多种。但是,如果我怀疑它可能是内存错误,我在 Linux 上做的第一件事就是通过Valgrind (Memcheck) 运行程序,看看它能告诉我什么。

同样是在黑暗中拍摄,您的构建系统是否正确生成依赖项?一种可能性是您修改了抽象类,但没有重新编译依赖于抽象类的所有源文件,这可能会出现问题。

【讨论】:

  • 我正在使用 make 重新制作一个 makefile 的东西,所以我认为依赖关系是正确的。此外,如果我进行全面重建,它不会消失。 :(
  • 既然我们现在知道这不是一个过时的构建问题,我会使用这里建议的 valgrind 方法,因为下一个要测试的合乎逻辑的事情是你的程序是否只有在额外的成员不存在。运行 valgrind 很简单,但速度可能非常慢,因此请确保您知道如何以最短的路线到达崩溃 :)
  • 崩溃发生在大约 0.1 秒内,所以速度应该不是问题。
【解决方案4】:

尝试在 gdb 中运行您的程序。

gdb your_executable

然后按 'r' 然后输入 当您的代码崩溃时,您可以点击“bt”然后输入以查看有问题的代码行。

【讨论】:

  • 在一种情况下,它给了我一个糟糕的堆栈,顶部有 strlenprintf,在另一种情况下,它给了我在 list.hyyparse 中的一些位置(我认为这是另一个损坏的堆栈,因为 main 没有调用 yyparse)
  • 你能复制回溯并放在评论中吗?但我最初的想法是,在某个地方,您不能安全地向上或向下转换派生对象。
【解决方案5】:

更改类后是否重新编译了所有源代码?

如果您只重新编译基类或派生类(不确定将新 int 放在哪里),那么所有其他对象的大小对于您的类来说都是错误的。您需要删除所有目标文件并重新构建它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-12-04
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多