GDB красивая печать с прямыми вызовами функций - PullRequest
5 голосов
/ 20 декабря 2011

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

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

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

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

Интересно, как наиболее эффективно это сделать?

Ответы [ 2 ]

5 голосов
/ 20 декабря 2011

Разве я не могу просто использовать вызовы C ++ и использовать операторы [], чтобы напечатать элемент i, j-й?

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

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

Это не сценарии Python, а простые последовательности команд для расширения 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
...