【发布时间】:2023-03-24 11:47:01
【问题描述】:
我有从 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
【问题讨论】:
-
您是否尝试使用调试信息构建 MEX 文件?在编译命令中添加
-g。 -
是的,我有。这个堆栈跟踪是用
-g构建的。我也尝试过这里的建议:mathworks.com/help/matlab/matlab_external/…。但是gdb在符号表中没有找到Pairing。 -
您确定您正在运行使用
-g构建的 MEX 文件,而不是在您的 MATLAB 路径上其他地方的其他副本吗? GDB 应该能够找到您的函数...从 shell 尝试nm -a Pairing.mexa64,它应该列出 MEX 文件中的所有符号。任何前面有N的符号都是调试符号,导出的函数前面应该有一个T。 -
另外,请考虑用户 AddressSanitizer:stackoverflow.com/questions/56976550/… - 由于 MATLAB,它并不像所有其他调试选项一样用于 MEX 文件。但是当简单的
printf语句不够用时,我发现它是最好的调试方法。 -
我在问题中添加了命令的结果
标签: matlab segmentation-fault gdb mex disassembly