我的代码有一个问题,有一些非常奇怪的症状。
-
代码在我的计算机上用以下版本编译:
a。GCC版本:4.4.2
b。CMAKE版本:2.8.7
c。QNX(操作系统)版本:6.5.0
当释放一些内存并从函数中退出时,代码会出现segfault(不会在任何代码中死亡,只会在从函数退出时死亡)。
奇怪的是:
-
代码在发布模式下执行,但在调试模式下不执行:
a。代码是线程化的,因此这表示竞争条件。
b。我无法通过将其置于调试模式进行调试。
-
当代码在具有相同版本的所有东西的同事机器上编译时,不存在此问题。
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预处理器输出
- 通过在cmake中的gcc参数中添加
- 比较
nm
或objdump
的输出,或者您必须为两个链接的可执行文件进行的任何操作:如果某个系统或第三方库在一个框中是不同的版本,它可能会显示在此处 - 比较
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);
并且复制构造函数/赋值运算符没有正确实现,这可能导致了问题。
请检查它们是如何实现的。以下是一些可能有帮助的信息。