Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Python API从gdb调试MATLAB mex_Matlab_Debugging_Gdb_Mex_Gdb Python - Fatal编程技术网

通过Python API从gdb调试MATLAB mex

通过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

我知道使用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('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包装器进行扩展