如果无法在最小环境中重现内存对齐问题AVX,该如何调试?

问题描述

最近我一直遇到以下问题:

  1. 我有一个使用EigenPCL(也使用Eigen)的大型代码
  2. 我需要使用几乎最新的Eigen master分支,并且由于需要依赖项而无法使用稳定版本。
  3. 项目中的PCL和其他依赖项均使用矢量指令,因此我使用-march=native进行编译。
  4. 在运行某些涉及本征类型的事物(仿射变换,点云查看)时,有时会在看似无意义的位置(例如,在Eigen::Quaternionf构造函数中)出现分段错误或其他崩溃。在其他情况下,会触发EIGEN_UNALIGNED_ASSERT,将其引向this page,据我所知,我在代码中到处都可以看到其内容

我想成为一个好公民,因此我尝试通过一个最小的示例重现该问题,以将其发布到stackoverflow或相关的问题跟踪器中。但是,仅提取触发问题的位时,我总是无法重现崩溃。我的猜测是,内存是否对齐(是否需要特别注意)还取决于问题位置之前分配的内容,因此周围的代码有助于触发问题。

问题:我可以使用哪些技术和工具来有效确定Linux和/或macOS上C + 14中与内存对齐相关的崩溃的根源?

解决方法

我强烈推荐AddressSanitizer。 在嵌入式应用程序上,我曾经在缓冲区上有一个小的堆栈溢出,只有当堆栈快满时才有副作用。我最终发现在我的cmake上包含此命令选项(适用于gcc)的堆栈溢出。请注意{{ 1}}找到与对齐相关的运行时错误,gcc documentation about ASan说:

当取消引用指针,将引用绑定到未充分对齐的目标时,或者在未充分对齐的对象上调用方法或构造函数时,使用此选项可以检查指针的对齐方式。

当您处理自定义对齐时,这些是最可能的错误

fsanitize=alignment