2011-12-20 4 views
5

Я пытаюсь использовать красивые возможности печати GDB, чтобы показать собственный класс матрицы C++.gdb довольно печать с прямыми вызовами функций

Класс довольно стандартный, вы можете найти где угодно. Это шаблон, параметризованный типом, и к нему можно получить доступ с помощью записи типа C, такой как mat [i] [j]. Это сначала неявно возвращает другой класс «Slice», представляющий строку или столбец, который может снова получить доступ к оператору [] для извлечения данных. Сам класс использует простой массив C для хранения, но он реализует некоторые трюки на нем, такие как опция предварительного выделения большей матрицы, включение ненулевых запусков с использованием шага и т. Д. Класс не имеет встроенной печати интерфейс, и я не могу его модифицировать или легко связывать с моим собственным кодом.

Пользовательские функции затрудняют воспроизведение прямого кода доступа к данным в Python. Но это необходимо? В общем: почему печать должна воспроизводить логику доступа к данным? Не могу ли я просто использовать вызовы C++ и использовать операторы [] для печати i, j-го элемента? Тот факт, что класс Slice является временным в GDB во время такого запроса, еще больше усложняет это.

Я также довольно новичок в написании сценариев python и GDB. Я попытался взломать примеры для замены доступа к данным с помощью вызовов gdb.execute, но я понятия не имею, как получить доступ к имени объекта из функции to_string, поэтому я могу использовать что-то вроде gdb.execute (??? + '[] + str (i) + ']', False, True).

Интересно, что является самым эффективным способом этого.

ответ

5

Могу ли я использовать вызовы C++ и использовать операторы [] для печати i-го элемента?

Вы можете позвонить из довольно-принтера в нижнем (отлаживаются) процесс с использованием gdb.parse_and_eval (docs), но имеют ряд недостатков:

  • вам нужен «живой» процесс, чтобы сделать это (другими словами, ваш симпатичный принтер не будет работать, когда вы отлаживаете дамп ядра)
  • , если нижний поврежден в некотором роде, вызывающие функции в нем, скорее всего, испортят его еще больше
  • , если нижний - с резьбой и красивым принцем ter вызывает функцию, которая может потребовать блокировки (например, malloc), тогда вы, скорее всего, заставите симпатичный принтер затормозить, и не будет никакого способа восстановить из такого тупика.
+2

Любой может бросить вместе пример, пожалуйста? – takbal

1

Это не скрипты python, а простые command sequences для расширения GDB. Я определяю новую команду под названием print_matrix.

(gdb) define print_matrix 
Type commands for definition of "print_matrix". 
End with a line saying just "end". 
>set $s_arr = $arg0 
>set $i=0 
>while($i < $arg1) 
>p (int [][$arg2]) *($s_arr + $i) 
>set $i = $i + 1 
>end 
>end 
(gdb) print_matrix arr 10 10 
$90 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}} 
$91 = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} 
$92 = {{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}} 
$93 = {{3, 4, 5, 6, 7, 8, 9, 10, 11, 12}} 
$94 = {{4, 5, 6, 7, 8, 9, 10, 11, 12, 13}} 
$95 = {{5, 6, 7, 8, 9, 10, 11, 12, 13, 14}} 
$96 = {{6, 7, 8, 9, 10, 11, 12, 13, 14, 15}} 
$97 = {{7, 8, 9, 10, 11, 12, 13, 14, 15, 16}} 
$98 = {{8, 9, 10, 11, 12, 13, 14, 15, 16, 17}} 
$99 = {{9, 10, 11, 12, 13, 14, 15, 16, 17, 18}} 
(gdb) 

Вы также можете сохранить эти команды в качестве сценария и использовать опция -x

gdb -x <commands file name> binary.out 
+0

Спасибо, но мне нужно использовать красивую печать, потому что она интегрирована с Eclipse. – takbal

Смежные вопросы