问题描述
最近我一直遇到以下问题:
- 我有一个使用Eigen和PCL(也使用Eigen)的大型代码库
- 我需要使用几乎最新的Eigen master分支,并且由于需要依赖项而无法使用稳定版本。
- 项目中的PCL和其他依赖项均使用矢量指令,因此我使用
-march=native
进行编译。 - 在运行某些涉及本征类型的事物(仿射变换,点云查看)时,有时会在看似无意义的位置(例如,在
Eigen::Quaternionf
构造函数中)出现分段错误或其他崩溃。在其他情况下,会触发EIGEN_UNALIGNED_ASSERT
,将其引向this page,据我所知,我在代码中到处都可以看到其内容
我想成为一个好公民,因此我尝试通过一个最小的示例重现该问题,以将其发布到stackoverflow或相关的问题跟踪器中。但是,仅提取触发问题的位时,我总是无法重现崩溃。我的猜测是,内存是否对齐(是否需要特别注意)还取决于问题位置之前分配的内容,因此周围的代码有助于触发问题。
问题:我可以使用哪些技术和工具来有效确定Linux和/或macOS上C + 14中与内存对齐相关的崩溃的根源?
解决方法
我强烈推荐AddressSanitizer
。
在嵌入式应用程序上,我曾经在缓冲区上有一个小的堆栈溢出,只有当堆栈快满时才有副作用。我最终发现在我的cmake上包含此命令选项(适用于gcc)的堆栈溢出。请注意{{ 1}}找到与对齐相关的运行时错误,gcc documentation about ASan说:
当取消引用指针,将引用绑定到未充分对齐的目标时,或者在未充分对齐的对象上调用方法或构造函数时,使用此选项可以检查指针的对齐方式。
当您处理自定义对齐时,这些是最可能的错误
fsanitize=alignment