将堆栈跟踪与MATLAB .mexa64文件中的源代码相关

问题描述 投票:0回答:2

我有从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
matlab segmentation-fault gdb mex disassembly
2个回答
0
投票

我解决它的方法是按照以下步骤操作

1)使用objdump -d Pairing.mexa64 > Pairing_obj

2)将00015616转换为hex = 0x3d00。

3)查找相关语句并识别生成的程序集。

4)意识到这是第一次取消引用某个变量。

我仍在寻找可以更轻松地完成此操作的方法。


0
投票

这是我的把戏(每次都有效,请在终端窗口中运行)>

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函数以避免冗长的开销。

© www.soinside.com 2019 - 2024. All rights reserved.