gdb красиво печатает с прямым вызовом функции

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

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

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

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

Интересно, какой самый эффективный способ сделать это.


person takbal    schedule 20.12.2011    source источник


Ответы (2)


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

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

  • для этого вам нужен «живой» процесс (другими словами, ваш красивый принтер не будет работать, когда вы отлаживаете дамп ядра)
  • если подчиненный каким-то образом поврежден, вызов функций в нем, вероятно, еще больше испортит его.
  • если подчиненный принтер является многопоточным, а красивый принтер вызывает функцию, которая может потребовать блокировки (например, malloc), то вы, скорее всего, вызовете взаимоблокировку красивого принтера, и не будет никакого способа восстановиться после такого тупик.
person Employed Russian    schedule 20.12.2011
comment
Кто-нибудь может собрать пример, пожалуйста? - person takbal; 10.01.2012

Это не скрипты на 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
person Kamath    schedule 22.12.2011
comment
Спасибо, но мне нужно использовать красивое средство печати из-за его интеграции с Eclipse. - person takbal; 10.01.2012