0

我正在远程 linux 服务器上编译一个程序。程序编译。但是,当我运行它时,程序突然结束。所以我使用 DDT 调试了程序。它吐出以下错误:

    Process 0:
    Memory error detected in ClassName::function (filename.cpp:6462).
    Thread 1 attempted to dereference a null pointer or execute an SSE instruction with an 
    incorrectly aligned memory address (the latter may sometimes occur spuriously if guard 
    pages are enabled)
    Tip: Use the stack list and the local variables to explore your program's current 
    state and identify the source of the error.

谁能告诉我这个错误到底是什么意思?

程序停止的行如下所示:

    SumUtility = ParaEst[0] + hhincome * ParaEst[71] + IsBlack * ParaEst[61] + IsBachAss * (ParaEst[55]);

这是在一个开关盒内。

这些是变量类型

    vector<double> ParaEst;
    double hhincome;
    int IsBlack, Is BachAss;

谢谢您的帮助!

4

2 回答 2

2

代表着:

  1. ParaEst 为 NULL 或错误的指针
  2. ParaEst 的各个数组值未与 SSE 所需的 16 字节边界对齐。
  3. hhincome、IsBlack 或 IsBachAss 未与 16 字节边界对齐,并且是 SSE 类型值。
  4. SumUtility 未与 16 字节对齐,是 SSE 类型字段。

如果您可以发布失败的确切行的汇编代码以及该汇编程序行的寄存器值,我们可以准确地告诉您上述哪些条件失败了。它还有助于查看显示的每个变量的类型,以帮助缩小原因。

于 2012-05-17T16:41:30.780 回答
0

好的...问题终于解决了。

问题是代码被破坏的表达式在一个新定义的函数中。但是由于某些奇怪的原因,运行 make-file 并没有包含这些更改,并且仍在使用先前编译的 .o 文件进行编译。这导致垃圾值被分配给这个新函数中的变量。最重要的是,程序调用这个函数作为第一步。因此出现了这种系统性的崩溃。这就是迈克尔所暗示的技术方面。

在此之后,我总是建议在 make 文件中使用 make clean 选项。为什么运行 make 文件无法编译修改后的源文件的问题是一个绝对值得进一步讨论的问题。

感谢您的回复!

于 2012-05-18T23:19:49.387 回答