Вызов подпрограмм определяемых пользователем
Одной из важных особенностей отладчика GDB является его способность вызывать в процессе отладки подпрограммы, определяемые пользователем.
Это можно выполнить путем простого ввода команды вызова подпрограммы, которая имеет следующий вид:
call subprogram-name (parameters) |
Ключевое слово call может быть опущено в случае, когда имя подпрограммы subprogram-name
не совпадает с какой-либо предопределенной командой GDB.
В результате выполнения этой команды осуществляется вызов указанной подпрограммы и передача ей списка параметров, которые заданы в команде.
В качестве параметров могут быть указаны выражения и они могут содержать переменные отлаживаемой программы.
Подпрограмма должна быть определена в программе на уровне библиотеки, поскольку GDB вызывает подпрограмму в окружении, которое устанавливается для выполнения отлаживаемой программы (это также подразумевает, что подпрограмма обладает возможностью доступа и даже может модифицировать значения переменных внутри программы).
Важность данного средства заключается в том, что оно позволяет использовать в программе различные отладочные подпрограммы, которые приспособлены к каким-либо специфическим структурам данных отлаживаемой программы.
Подобные подпрограммы отладки могут быть написаны с целью получения высокоуровневого отображения внутреннего состояния какого-либо абстрактного типа данных, что намного удобнее чем использование распечатки содержимого памяти (иначе - дамп памяти), которая заната структурой данных, на физическом уровне.
Следует учитывать, что стандартная команда отладчика GDB print
имеет представление только о физическом расположении типов в памяти, а не об их смысловом значении и абстрактном представлении.
Отладочные подпрограммы могут предусматривать отображение информации с учетом требуемого семантического уровня и, таким образом, их использование при отладке программы может быть очень полезно.
Например, при непосредственной отладке GNAT, ключевым моментом является наличие доступа к содержимому узлов семантического дерева, которое содержит внутреннее представление программы.
Однако, узлы семантического дерева представляются в виде целочисленных значений, которые являются индексами в таблицу узлов.
Использование встроенной команды print, для узлов семантического дерева, обеспечит простое отображение целочисленных значений, что не обладает желаемой информативностью.
Таким образом, намного удобнее использовать подпрограмму PN
(описана в файле treepr.adb дистрибутива исходных текстов GNAT), которая принимает на входе узел семантического дерева и отображает его высокоуровневое представление, включающее синтаксическую категорию данного узла, его место в исходном тексте, целочисленные значения, соответствующие родительскому узлу и узлам потомкам, а также множество дополнительной семантической информации.
Для более детального изучения этого примера можно обратиться к телу этой процедуры в указанном файле.