具有相同编译器的相同程序代码导致不同的二进制文件

时间:2012-11-16 01:21:18

标签: c++ multithreading segmentation-fault qnx

我的代码存在一些问题,但有一些非常奇怪的症状。

  1. 代码在我的计算机上编译,版本如下:

    一个。 GCC版本:4.4.2

    湾CMAKE verson:2.8.7

    ℃。 QNX(操作系统)版本:6.5.0

  2. 代码有一个段错误,同时释放一些内存并退出函数(不会死于任何代码,只是在函数退出时)。

    关于这一点的奇怪之处是:

    1. 代码在发布模式下执行但不在调试模式下执行:

      一个。代码是线程化的,因此这表示竞争条件。

      湾我无法通过将其置于调试模式进行调试。

    2. 在具有相同版本的所有东西的同事机器上编译时的代码没有这个问题。

      一个。关于这一点的奇怪之处在于,工作人员代码可以工作,而且在他的机器上编译时创建的二进制文件(大约相同)大约增加了6mB。

    3. 现在烦人的是我无法发布代码,因为它太大而且也适合工作。但是,任何人都可以指出我解决这个问题的方法。

      由于我使用的是QNX,因此我的调试工具受限,我不能使用Valgrind,因为QNX不支持它,GDB并没有真正帮助。

      我正在寻找有类似/相同问题的人,原因是什么,以及他们如何修复它。

      修改

      Sooo ......我发现它是什么,但我仍然对它是如何发生有点困惑。

      罪魁祸首是:

      Eigen::VectorXd msBb = data.modelSearcher->getMinimumBoundingBox();
      

      getMinimumBoundingBox的定义是:

      Eigen::VectorXd ModelSearcher::getMinimumBoundingBox();
      

      并返回一个始终初始化为VectorXd output(6, 1)的VectorXd。所以我立即想到了,这一定是因为VectorXd没有被初始化,而是将其改为:

      Eigen::VectorXd msBb(6, 1); msBb = data.modelSearcher->getMinimumBoundingBox();
      

      但是这没用。事实上,我必须通过将函数的定义更改为:

      来修复它
      void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);
      

      和对此的调用

      Eigen::VectorXd msBb(6, 1); data.modelSearcher->getMinimumBoundingBox(msBb);
      

      现在新问题:

      到底是什么?为什么没有第一次改变工作,但第二次做了,为什么我必须通过引用?哦,还有一个大问题,当我的同事编辑它并运行它时,怎么没有这个突破呢?它是一个直接的内存错误,当然它不应该依赖于哪台计算机编译它,特别是因为编译器和所有其他重要的东西是相同的!! ??

      感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

  

...通过在他的机器上编译创建的二进制文件(相同)大约增加6mB

值得弄清楚区别的是什么(即使只是他的构建隐藏的情况,而你的构建隐藏了一个真正的错误):

  • 仔细检查您是否正在编译完全相同的代码(没有未提交的本地更改,包含搜索路径中没有额外的标题等)
    • 通过在cmake中为您的gcc参数添加-E开关进行三重检查,因此它将使用与常规编译相同的包含路径预处理您的文件;差异预处理器输出
  • 比较来自nmobjdump的输出或您对两个链接可执行文件的所有内容:如果某个系统或第三方库在一个框中是不同的版本,则可能会显示在此处< / LI>
  • 比较ldd的输出,如果它是动态链接的,请确保它们都获得相同的库版本
    • 比较实际在运行时获得的库版本,如果可能的话。希望您可以执行以下操作之一:运行pldd,比较.so中的/proc/pid/map条目,在strace / dtrace / truss下运行流程并比较运行时链接程序活动

至于代码......如果这不起作用:

Eigen::VectorXd ModelSearcher::getMinimumBoundingBox();
// ...
Eigen::VectorXd msBb(6, 1); msBb = data.modelSearcher->getMinimumBoundingBox();

这样做:

void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);
// ...
Eigen::VectorXd msBb(6, 1); data.modelSearcher->getMinimumBoundingBox(msBb);

你可能会对赋值运算符有问题。如果它执行浅复制并且向量中存在动态分配的内存,则最终会有两个向量保持相同的指针,并且它们都会free / delete

请注意,如果根本没有定义运算符,则默认为执行此浅复制。

答案 1 :(得分:0)

你说你必须改变:

void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);

之前是什么?

如果是:

void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd input);

并且复制构造函数/赋值运算符未正确实现,可能导致了问题。

请检查它们是如何实施的。这可能有助some info