#c #c #tcl #tcl-api
#c #c #tcl #tcl-api
Вопрос:
Я хотел бы знать, возможно ли создать tcl scripts debugger, используя Tcl Library API и / или Tcl внутренние интерфейсы (я имею в виду, содержат ли они достаточно данных для этого). Я заметил, что существующие tcl-отладчики используют tcl-скрипты и работают с этим дополнительным уровнем. Моя идея заключалась в том, чтобы использовать Tcl_CreateObjTrace
для отслеживания каждой оцениваемой команды и использовать ее как точку для повторного вызова callstack, locals и т. Д. Проблема в том, что кажется, что не вся информация доступна из API во время оценки. Например, я хотел бы знать, какая строка в данный момент оценивается, но Interp
имеет такую информацию только для верхних оценок ( iPtr->cmdFramePtr->line
пуста для тел процедур). Кто-нибудь пробовал такой подход? Имеет ли это какой-либо смысл? Может быть, мне следует изучить хэшированные записи в Interp
? Любые подсказки и мнения будут оценены (лучше всего для Tcl 8.5).
Комментарии:
1. для отладки памяти
2. @Yann Я не хочу отлаживать интерпретатор Tcl. Я хочу отлаживать сценарии Tcl, такие как TclPro или Komodo (на основе TclPro).
3. Почему вы считаете перегрузку
proc
и использованиеtrace
для сборки отладчика неприемлемыми?4. Обратите внимание, что большинство tcl-отладчиков, хотя они и «настраивают» tcl-скрипты, перегружая proc (и, возможно, set) и отслеживая все, на самом деле не требуют каких-либо изменений в скриптах. «Instrunment» здесь означает нечто совершенно иное, чем на других языках.
5. @slebetman Я не говорил, что это неприемлемо. Это просто необычно (существуют ли другие языки сценариев, отлаженные таким образом?). Мне любопытно, смогу ли я достичь того же самого без инструментирования, и, вероятно, неинструментированный способ будет быстрее и даст больше функциональности, например, вам не нужно будет выбирать, какой скрипт использовать.
Ответ №1:
Лучшим выбором для ненавязчивой системы отладки может быть попытка использовать трассировку шага выполнения (вызываемую для каждой команды, вызываемой во время выполнения команды, к которой присоединена трассировка), info frame
чтобы фактически получить информацию. Вот простая версия, прикрепленная к source
, чтобы вы могли просматривать весь сценарий:
proc traceinfo args {
puts [dict get [info frame -2] cmd]
}
trace add execution source enterstep traceinfo
source yourscript.tcl
Будьте готовы к большому количеству выходных данных. Словарь вне info frame
может содержать всевозможные соответствующие записи, такие как информация о том, какой номер строки команды и что такое исходный файл; cmd
запись является незамещенным источником для вызываемой команды (если вам нужна замененная версия, см. Соответствующие аргументы для обратного вызова трассировки traceinfo
выше).
Комментарии:
1. К сожалению
info frame
, дает только информацию об относительной строке внутри конкретногоproc
, в скрипте нет информации об абсолютной позиции кадра. Более того, я немного покопался в ядре Tcl, и кажется, чтоproc
во время оценки вообще нет информации о позиции, поэтому инструментарий кажется единственным способом сделать полностью функциональный инструмент отладки: (