通过Python API从gdb调试MATLAB mex
我知道使用gdb在Linux上调试MATLAB mex文件的过程,如下所述: 此过程涉及通过命令行启动MATLAB,并使用通过Python API从gdb调试MATLAB mex,matlab,debugging,gdb,mex,gdb-python,Matlab,Debugging,Gdb,Mex,Gdb Python,我知道使用gdb在Linux上调试MATLAB mex文件的过程,如下所述: 此过程涉及通过命令行启动MATLAB,并使用 matlab -Dgdb 然后从gdb控制台用MATLAB运行 (gdb) r -nojvm 一旦在gdb中,以及在运行mex时要中断的一些其他步骤 但是,我想通过Python的gdb API对我的gdb调试进行一些更高级的包装 在Python中包装gdbapi的过程通常是从以下内容开始的,以调试名为foo的程序 import gdb gdb.execute('fil
matlab -Dgdb
然后从gdb控制台用MATLAB运行
(gdb) r -nojvm
一旦在gdb中,以及在运行mex时要中断的一些其他步骤
但是,我想通过Python的gdb API对我的gdb调试进行一些更高级的包装
在Python中包装gdbapi的过程通常是从以下内容开始的,以调试名为foo的程序
import gdb
gdb.execute('file foo')
gdb.execute('run')
我不确定是否可以将相同的概念应用于调试MATLAB。我相信这是可能的,因为像gdbgui这样的gdb前端是用Python构建的,可以用
matlab -Dgdbgui
但是我不知道如何将类似于我自己的Python包装器的东西应用于gdb?正如我在上面的评论中提到的,我没有意识到/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,在每个步骤之前和之后,通过打印每个指令中的寄存器来完成的。事实证明/usr/bin/matlab只是一个外壳脚本,它包装了matlab二进制文件的执行。这解释了使用-Dgdb调用MATLAB进行调试的奇怪方式。我将调试shell脚本,以找到通过调试器调用MATLAB的实际语法,而调试器(理论上)反过来会使它易于通过Python中的gdb API包装器进行扩展