MEX 文件可以使用 -fsanitize=address 运行吗?
Can MEX files be run with -fsanitize=address?
我有一个用g++正常编译的MEX文件。
我最近将其编译更改为使用 clang++,并将-fsanitize=address
包含在LDFLAGS
和CFLAGS
中(注意:此项目不存在 CXX 标志)。
但是,尽管如此,一旦我进入 MATLAB 并尝试调用 MEX 文件,我就会得到:
Invalid MEX-file '(path to mex file)': undefined symbol: __asan_option_detect_stack_use_after_return.
当人们正确弄乱地址清理器中的链接时,这种特定错误真的很常见。但是,实际上在我正在编译的每个文件中,它都是链接的。每一个.o,每一个.mexa64。
我怀疑这是因为 MATLAB 本身没有能力做到这一点,但我不确定。其他 MEX 开发人员的一些指导会很棒。
我为任何需要这个的人使用的完整步骤:
1:安装libasan(对我来说是"yum install libasan",但它可能会有所不同)
2:将-fsanitize=address
添加到为我的项目构建 MEX 文件和目标文件的生成文件的 LDFLAG 和 CFLAG。
3:清理并制作以确保它包含库(我用 g++ 构建,显然 clang 默认为 libasan 的静态版本,这在运行可执行文件实际上不是使用 libasan 编译的情况下不起作用)
4:在终端中,执行以下操作:
export LD_PRELOAD=/lib64/libasan.so.5
(这个位置虽然有所不同。我发现了如何使用这篇文章找到它:从 gcc/clang 获取 libasan 的位置)
然后做:
export ASAN_OPTIONS=halt_on_error=false
5:最后,调用MATLAB:
matlab -nojvm -nodesktop -nosplash
6:然后(这可能是特定于我的项目)我 CD 进入 MATLAB 项目所在的目录,addpath(genpath('.'))
添加其所有文件,最后调用实际的 MATLAB 脚本来完成这项工作。
结果是绿色和红色错误,例如:
地址0x(某个地址)位于线程 T(线程编号)的堆栈中 摘要:地址消毒器:memcpy-param-overlap (libasan.so.5+(一些数字)) 或 错误:地址清理器:内存参数重叠:内存范围 [范围] 和 [范围] 重叠
净化库(MEX 文件是共享库)希望libasan.so
链接到主可执行文件(在这种情况下为 MATLAB)或在启动时LD_PRELOAD
编辑。由于您无法重建 MATLAB,因此第二种方法是您唯一的机会。
它可能无法顺利运行,因为 Asan 可能会在 MATLAB 启动代码中发现内存问题并在它到达您的 MEX 文件之前中止。您可以使用export ASAN_OPTIONS=halt_on_error=false
忽略这些错误(它们仍会被报告,但至少执行将继续)。
作为旁注,您的问题类似于有关在未净化的解释器中运行经过净化的二进制插件的其他问题(例如,请参阅Python的类似问题,尽管该问题以Clang为中心)。
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在C应用程序中运行C++(带有STL)函数
- 运行程序时出现问题
- 控制允许动态运行c++的并发操作数
- MEX 文件可以使用 -fsanitize=address 运行吗?