Передача переменных C ++ в python через GDB - PullRequest
0 голосов
/ 16 апреля 2020

Я занимаюсь разработкой / отладкой кода на языке c ++, в котором широко используются векторы STL c ++ и блиц-массивы cpp (векторы / массивы являются многомерными, вплоть до 4D / 5D-массивов). В настоящее время я использую cout / print для записи выходных данных входных данных / выходы функций, но это становится очень утомительным. Чтобы иметь возможность печатать векторы / массивы во время отладки, можете ли вы предложить какие-либо варианты. Я подумал о паре опций

(а) написать шаблонные функции на с ++ для печати и использования функции "вызова" GDB. но не в состоянии использовать функциональность "вызова" GDB для шаблонных функций c ++, но работает для обычных функций. (б) Можно ли передать переменные c ++ в python интерфейс GDB и распечатать их? какие-нибудь примеры для того же самого?

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

Заранее большое спасибо!

1 Ответ

1 голос
/ 16 апреля 2020

Написание кода на C ++ для печати массива и вызова его из GDB, безусловно, вариант, но он может быть ненадежным, потому что функция печати, которую вы пишете, может быть недоступна (компоновщик мог удалить ее, потому что она не использовалась в вашем код c ++, например). Кроме того, помните, что шаблоны - это просто «рецепты», и вам действительно нужно использовать их для того, чтобы компилятор генерировал из него класс / функцию.

Можно ли передавать переменные c ++ в * 1055? * интерфейс GDB и распечатать их? какие-нибудь примеры для того же самого?

Простой ответ на это - "да". Вы можете использовать функцию parse_and_eval в модуле gdb при использовании API python GDB. Что-то вроде

py print(gdb.parse_and_eval('your_variable'))

будет выводить значение переменной с именем your_variable с использованием python API gdb. Но это будет то же самое, что и p your_variable в обычном приглашении GDB без использования python API. Настоящая мощь приходит, когда вы используете python API GDB для написания pretty-printers для типов, которые вы хотите отлаживать.

Pretty-принтер - это, в основном, какой-то код, который вы или кто-то другой еще написал, чтобы сказать GDB, как правильно напечатать какой-нибудь тип. С симпатичным принтером для типа просто p your_variable в приглашении GDB печатает переменную в хорошем виде, заданном вашим симпатичным принтером.

Я не смог найти симпатичный принтер для блиц с быстрым Google поиск, и я не использовал блиц раньше. Тем не менее, я использовал другую библиотеку для векторов и матриц в науке c, называемую броненосец , и поэтому столкнулся с похожими проблемами. Поэтому я написал несколько симпатичных принтеров для броненосца здесь , которые могут помочь вам, если вы решите написать симпатичные принтеры для блиц.

В качестве иллюстрации ниже вы можете увидеть, как arma::mat (матрица чисел двойного типа) типа Armadillo печатается в GDB без симпатичного принтера (переменная m1, представляющая собой матрицу чисел двойного размера 6x3)

armadillo matrix without pretty printer

Обратите внимание, что мы даже не можем видеть матричные элементы . Они хранятся в непрерывной области памяти, указанной атрибутом mem объекта arma::mat.

Теперь та же матрица с симпатичным принтером доступна здесь .

armadillo matrix with pretty printer

Это значительно облегчает отладку кода.


Примечание. Вы также можете писать симпатичные принтеры на языке guile, но держу пари python - гораздо более распространенный выбор.

...