我有从Matlab调用的自定义C绑定,有时会遇到分段错误。如何在源代码中识别出相应的语句正在产生SEGFAULT?
我的C函数在源文件Pairing.c中称为Pairing。
Stack Trace (from fault):
[ 0] 0x00007fff6bc76d00 Pairing.mexa64+00015616
[ 1] 0x00007fff6bc74330 Pairing.mexa64+00004912 mexFunction+00001862
[ 2] 0x00007fffe2b4f213 MATLAB/R2020a/bin/glnxa64/libmex.so+00582163
nm -a Pairing.mexa64 | grep ' N '
的结果是
0000000000000000 N .debug_abbrev
0000000000000000 N .debug_aranges
0000000000000000 N .debug_info
0000000000000000 N .debug_line
0000000000000000 N .debug_str
我解决它的方法是按照以下步骤操作
1)使用objdump -d Pairing.mexa64 > Pairing_obj
。
2)将00015616转换为hex = 0x3d00。
3)查找相关语句并识别生成的程序集。
4)意识到这是第一次取消引用某个变量。
我仍在寻找可以更轻松地完成此操作的方法。
这是我的把戏(每次都有效,请在终端窗口中运行)>
matlab -nojvm -nosplash -r 'my_script' -D"valgrind --error-limit=no --tool=memcheck -v --log-file=valgrind.log"
最好在Linux或Mac上运行,但是您也可以在Windows中使用cygwin64 / msys2进行此操作。使用前需要安装
valgrind
-一旦将日志转储到valgrind.log中,请使用文本编辑器将其打开,然后您可以查看valgrind捕获的所有内存错误。
对于CUDA代码,您也可以用cuda-memcheck替换valgrind命令和参数,执行类似的操作,但对于GPU。
使测试脚本my_script.m
非常简单,例如,加载.mat文件,然后立即调用mex函数以避免冗长的开销。