Tcl скрипты неинструментирующего отладчика с использованием библиотеки Tcl и / или внутренних компонентов Tcl?

#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 во время оценки вообще нет информации о позиции, поэтому инструментарий кажется единственным способом сделать полностью функциональный инструмент отладки: (