0

我知道使用 gdb 在 Linux 上调试 MATLAB mex 文件的过程,如下所述:https ://www.mathworks.com/help/matlab/matlab_external/debugging-on-linux-platforms.html

此过程涉及通过命令行启动 MATLAB

 matlab -Dgdb

然后从 gdb 控制台运行 MATLAB

(gdb) r -nojvm

一次在 gdb 中,以及在运行 mex 时中断的其他一些步骤。

但是,我想通过 Python 的 gdb API 对我的 gdb 调试进行更高级的封装。

这个在 Python 中包装 gdb API 的过程通常从以下内容开始,以调试名为 foo 的程序

import gdb
gdb.execute('file foo')
gdb.execute('run')

我不确定是否可以将相同的概念应用于调试 MATLAB。我确信它是可能的,因为像 gdbgui 这样的 gdb 前端是用 Python 构建的,可以用

matlab -Dgdbgui

但我不确定如何为 gdb 调整类似于我自己的 Python 包装器的东西?

4

1 回答 1

0

正如我在上面的评论中提到的,我没有意识到 /usr/bin/matlab 只是一个 shell 脚本,它接受 -Dgdb 之类的输入参数并设置环境,并使用实际 MATLAB 二进制文件的路径运行 gdb。

我的解决方案是将这个 shell 脚本复制并编辑到 /usr/bin/matlab_gdbWrap 并注释掉实际执行 MATLAB 二进制文件的行:

#eval exec "$debugger \"$exec_path\" $arglist"

并将其替换为适当的 gdb 命令以使用 gdb API 运行 Python 脚本:

eval exec "gdb -x /home/myhome/path/to/gdbWrap.py"

在 gdbWrap.py 我这样设置我的代码流:

import gdb
import code

# start MATLAB in gdb
gdb.execute('file /usr/local/MATLAB/R2016b/bin/glnxa64/MATLAB')

 # run MATLAB with -nojvm flag from gdb
gdb.execute('r -nojvm')

# in MATLAB console, run 'dbmex on', and the mex routine, which then breaks out back to gdb, which is in turn controlled by this Python script...

# use Python code module to break out to interactive mode, to begin development of my gdb API wrapper
code.interact(local=locals())

所有这些的实用性似乎难以捉摸,但我正在使用它在我的 mex 中的某些点中断,打印下一个汇编指令的程序集并将其保存到 Python 字符串变量中

gdb.execute('x/i $pc', to_string=True)

拆分该字符串以获取以下指令中使用的特定寄存器,并打印寄存器值,然后执行步骤,然后再次打印寄存器值。所有这些都是希望在非常低的级别上调试 mex,通过在每个步骤之前和之后打印每条指令的寄存器。

于 2018-06-20T20:46:27.863 回答