отлаживать MATLAB mex из gdb через Python API

Я знаю процесс отладки mex-файлов MATLAB в Linux с помощью gdb, как описано здесь: https://www.mathworks.com/help/matlab/matlab_external/debugging-on-linux-platforms.html

Этот процесс включает в себя запуск MATLAB через командную строку с

 matlab -Dgdb

затем из консоли gdb с запущенным MATLAB с

(gdb) r -nojvm

один раз в gdb и некоторые другие шаги, которые нужно сломать при запуске mex.

Тем не менее, я хочу сделать более продвинутую обертку отладки gdb через gdb API для Python.

Этот процесс включения gdb API в Python обычно начинается со следующего: отладка программы с именем foo

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

Я не уверен, что смогу применить ту же концепцию к отладке MATLAB. Я уверен, что это возможно, потому что интерфейс gdb, такой как gdbgui, построен на Python и может быть запущен с помощью

matlab -Dgdbgui

но я не уверен, как адаптировать что-то похожее на мою собственную оболочку Python для gdb?


person brneuro    schedule 20.06.2018    source источник
comment
Как оказалось, /usr/bin/matlab — это всего лишь сценарий оболочки, в котором выполняется выполнение бинарного файла MATLAB. Это объясняет странный способ вызова MATLAB с параметром -Dgdb для отладки. Я буду отлаживать сценарий оболочки, чтобы найти фактический синтаксис, с помощью которого MATLAB вызывается через отладчик, который (теоретически) должен, в свою очередь, упростить расширение через оболочку gdb API в Python.   -  person brneuro    schedule 20.06.2018


Ответы (1)


Как упоминалось в моем комментарии выше, я не осознавал, что /usr/bin/matlab - это просто сценарий оболочки, который принимает входные аргументы, такие как -Dgdb, настраивает среду и запускает gdb с путем к фактическому двоичному файлу MATLAB.

Мое решение состояло в том, чтобы скопировать и отредактировать этот сценарий оболочки в /usr/bin/matlab_gdbWrap и закомментировать строку, которая фактически выполняет двоичный файл MATLAB:

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

и замените его соответствующей командой gdb для запуска скрипта Python с API gdb:

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())

Полезность всего этого может показаться неуловимой, но я использую это, чтобы сломать в определенных точках мой мекс, распечатать сборку для следующей инструкции по сборке и сохранить ее в строковой переменной Python с помощью

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

разделите эту строку, чтобы получить определенные регистры, используемые в следующей инструкции, и распечатайте значения регистров, затем шаг, затем снова распечатайте значения регистров. Все это делается с надеждой на отладку мекса на очень низком уровне путем печати регистров из каждой инструкции до и после каждого шага.

person brneuro    schedule 20.06.2018