使用相同编译器的相同程序代码会导致不同的二进制文件



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

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

    a。GCC版本:4.4.2

    b。CMAKE版本:2.8.7

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

当释放一些内存并从函数中退出时,代码会出现segfault(不会在任何代码中死亡,只会在从函数退出时死亡)。

奇怪的是:

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

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

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

  2. 当代码在具有相同版本的所有东西的同事机器上编译时,不存在此问题。

    a。更糟糕的是,同事们的代码可以工作,但在他的机器上编译创建的二进制文件也一样,大约大了6mB。

现在令人恼火的是,我不能发布代码,因为它太大了,也不适合工作。但有人能给我指一条解决这个问题的道路吗。

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

我正在寻找任何有类似/相同问题的人,原因是什么,他们是如何解决的。

编辑:

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

罪魁祸首代码是这样的:

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

其中getMinimumBoundingBox的定义是:

Eigen::VectorXd ModelSearcher::getMinimumBoundingBox();

并且它返回总是初始化为CCD_ 2的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);

所以现在的新问题是:

什么鬼东西?为什么第一次没有成功,而第二次成功了,为什么我必须通过参考?哦,还有一个大问题,当我的同事编译它并运行它时,它怎么不坏呢?这是一个直接的内存错误,当然不应该取决于哪台计算机编译它,尤其是因为编译器和所有其他重要的东西都是一样的!!??

谢谢你们的帮助。

。。。在他的机器上编译产生的二进制文件也是一样,大约比大6mB

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

  • 仔细检查是否编译了完全相同的代码(没有未提交的本地更改,include搜索路径中没有额外的头,等等)
    • 通过在cmake中的gcc参数中添加-E开关进行三重检查,因此它将使用与常规编译相同的include路径预处理您的文件;diff预处理器输出
  • 比较nmobjdump的输出,或者您必须为两个链接的可执行文件进行的任何操作:如果某个系统或第三方库在一个框中是不同的版本,它可能会显示在此处
  • 比较ldd的输出(如果它是动态链接的),确保它们都获得相同的库版本如果可能的话,
    • 也会比较在运行时实际得到的库版本。希望您可以执行以下操作之一:运行pldd,比较/proc/pid/map中的.so条目,在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

请注意,如果根本没有定义运算符,那么默认情况是执行此浅层复制。

你说你必须从更改

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

以前是什么?

如果是:

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

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

请检查它们是如何实现的。以下是一些可能有帮助的信息。

相关内容

  • 没有找到相关文章

最新更新