首页 > 解决方案 > 当特征对齐错误似乎与触发它们的确切代码无关时,如何调试它们

问题描述

我正在编写代码,它使用 Eigen 矩阵库进行坐标变换,还使用 ​​PCL 进行点云处理(它也大量使用 Eigen)。尽管我已经观察了文档中关于 Eigen 类型对齐的所有内容(https://eigen.tuxfamily.org/dox/group__DenseMatrixManipulation__Alignement.html),但我不断从 Eigen 收到关于未对齐访问的断言错误。

我只能在之前运行一些 Eigen 代码时触发此断言,但未能成功确定确切的条件是什么。例如,这是崩溃的代码:

Affine3f Transform::getAffine() const {
    // ... Vector3f translation(...)
    // ... Quaternionf rotation(...)
  Affine3f affine = Affine3:f:Identity(); /// <--- 
  affine.translate(translation);
  affine.rotate(rotation);
  return affine;
}

但前提是之前已经执行了一些特征代码。也许那是因为只有在Eigen::aligned_allocator.

但是,帮助页面告诉我应该使用调试器来准确检查哪个对象未对齐:

例如,如果您使用的是 GCC,则可以按如下方式使用 GDB 调试器:

$ gdb ./my_program          # Start GDB on your program
> run                       # Start running your program
...                         # Now reproduce the crash!
> bt                        # Obtain the backtrace

现在您已经准确地知道问题在您自己的代码中发生的位置,请继续阅读以了解您需要更改的内容。

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

问题

当错误仅在以后的分配期间触发时,如何有效地调试导致错位的代码?

标签: c++g++alignmentclang++eigen3

解决方案


推荐阅读