【问题标题】:Correlate stack trace with source code in MATLAB .mexa64 file将堆栈跟踪与 MATLAB .mexa64 文件中的源代码相关联
【发布时间】: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


【解决方案1】:

这是我的窍门(每次都有效),在终端窗口中运行它

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

【讨论】:

    【解决方案2】:

    我解决它的方法是按照这些步骤操作

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2011-06-07
      • 2020-10-25
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多