C++ 当特征对齐错误似乎与触发它们的确切代码无关时,我如何调试它们

C++ 当特征对齐错误似乎与触发它们的确切代码无关时,我如何调试它们,c++,g++,alignment,clang++,eigen3,C++,G++,Alignment,Clang++,Eigen3,我正在编写代码,它使用特征矩阵库进行坐标变换,也使用PCL进行点云处理(它也经常使用特征矩阵)。尽管我已经在文档中观察到了关于Eigen类型对齐()的所有内容,但我还是不断从Eigen得到关于未对齐访问的断言错误 我只能在一些特征代码以前运行过,但无法准确确定确切条件时触发此断言。例如,这是导致崩溃的代码: Affine3f Transform::getAffine() const { // ... Vector3f translation(...) // ... Quatern

我正在编写代码,它使用特征矩阵库进行坐标变换,也使用PCL进行点云处理(它也经常使用特征矩阵)。尽管我已经在文档中观察到了关于Eigen类型对齐()的所有内容,但我还是不断从Eigen得到关于未对齐访问的断言错误

我只能在一些特征代码以前运行过,但无法准确确定确切条件时触发此断言。例如,这是导致崩溃的代码:

Affine3f Transform::getAffine() const {
    // ... Vector3f translation(...)
    // ... Quaternionf rotation(...)
  Affine3f affine = Affine3:f:Identity(); /// <--- 
  affine.translate(translation);
  affine.rotate(rotation);
  return affine;
}
现在,您已经确切地知道问题发生在您自己的代码中的什么地方,请继续阅读 了解你需要改变什么

我当然是这样做的,但是这里的代码崩溃似乎满足了所有的要求

问题:
当错误仅在以后的分配过程中触发时,如何有效地调试导致未对齐的代码?

您可以使用内存调试器,例如查看它是否报告任何内容。当然,不要忘了构建时启用大量警告,以查看编译器本身是否捕获了任何内容。甚至可能使用一些静态分析器,它可以比编译器通常做的更深入。好建议。我没有使用静态分析仪的经验;你能推荐一个吗?对不起,我自己已经有一段时间没用了,所以我不知道现在有什么。但“谷歌”应该不会太难。你有没有检查过做广告的建议?一种经常有效的方法是开始删除部分代码,直到问题消失(然后重新插入它们并删除其他部分)。当然,这就是我所做的,但我永远不能用任何可以称为“最小”的东西来重现它。
$ gdb ./my_program          # Start GDB on your program
> run                       # Start running your program
...                         # Now reproduce the crash!
> bt                        # Obtain the backtrace