Чтение вывода отладчика в Komodo IDE для Tcl Languare

Я пытаюсь понять ошибки и исключения в Tcl. Я написал небольшой код следующим образом

proc Div3 {a b} {
    return [Div2 $a $b]
}

proc Div2 {a b} {
    return [Div $a $b]
}

proc Div {a b} {
   if {$b == 0} {
      error "Error generated by error" "Info String for error" 401
   } else {
      return [expr $a/$b]
   }
}

if {[catch {puts "Result = [Div3 10 0]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:\n$errorInfo\n"
}

когда я запускаю это с помощью tclsh.exe, вывод отладчика отображается следующим образом:

% tclsh error-file-1.tcl
ErrorMsg: Error generated by error
ErrorCode: 401
ErrorInfo:
Info String for error
    (procedure "Div" line 1)
    invoked from within
"Div $a $b"
    (procedure "Div2" line 2)
    invoked from within
"Div2 $a $b"
    (procedure "Div3" line 2)
    invoked from within
"Div3 10 0"

Однако, когда я запускаю то же самое, используя tclsh.exe через Komodo IDE, я получаю вывод отладчика следующим образом

ErrorMsg: Error generated by error
ErrorCode: 401
ErrorInfo:
Info String for error
    invoked from within
"DbgNub_uplevelCmd 1 $cmd"
    invoked from within
"Div $a $b"
    invoked from within
"DbgNub_uplevelCmd 1 $cmd"
    invoked from within
"Div2 $a $b"
    invoked from within
"DbgNub_uplevelCmd 1 $cmd"
    invoked from within
"Div3 10 0"
    invoked from within
"DbgNub_uplevelCmd 1 $cmd"
    invoked from within
"DbgNub_Do 0 {1 17 {249 27}} {puts "Result = [DbgNub_Do 1 {1 17 {265 9}} {Div3 10 0}]"}"

Я могу понять вывод отладчика из tclsh.exe, но не могу интерпретировать вывод отладчика из Komodo IDE.

особенно, я не могу понять DbgNub_Do 0 {1 17 {249 27}} {puts "Result = [DbgNub_Do 1 {1 17 {265 9}} {Div3 10 0}]"} какие числа указаны в списках (т.е. {1 17 {249 27}}) и DbgNub_uplevelCmd 1 $cmd и DbgNub_Do

заранее спасибо


person The_Learner    schedule 23.03.2020    source источник
comment
Я не знаю, что такое Komodo, но его отладчик, вероятно, заменяет стандартную команду proc своей собственной, чтобы добавить отладочную информацию, поэтому вы видите трассировку стека, которая включает ее. Кстати, запуск через tclsh напрямую не использует отладчик.   -  person Shawn    schedule 23.03.2020
comment
@Шон, есть ли способ отладки с использованием точек останова из tclsh.exe   -  person The_Learner    schedule 23.03.2020
comment
Используете отладочную библиотеку? Поиск в Google «tcl debugger» выдает несколько, в том числе этот Komodo. Я не думаю, что есть стандартный, который поставляется с tcl, в отличие от некоторых языков.   -  person Shawn    schedule 23.03.2020


Ответы (1)


Все команды DbgNub_, упомянутые в трассировке стека, являются дополнительными инструментами отладки Komodo (скрыть их в трассировке стека теоретически возможно, но неаккуратно, а инструментарий очевидно, на самом деле этого не делает). Как правило, вы, вероятно, игнорируете эти команды, поскольку их не будет при развертывании.

Если мы проигнорируем биты DbgNub_uplevelCmd, мы получим:

Info String for error
    invoked from within
"Div $a $b"
    invoked from within
"Div2 $a $b"
    invoked from within
"Div3 10 0"
    invoked from within
"DbgNub_Do 0 {1 17 {249 27}} {puts "Result = [DbgNub_Do 1 {1 17 {265 9}} {Div3 10 0}]"}"

Это узнаваемо похоже на стандартную трассировку, за исключением отсутствия информации о номере строки (и DbgNub_Do, которая, очевидно, непосредственно инструментирует код внутри catch).


Как правило, статус результата Tcl состоит из:

  1. код результата. Это TCL_OK (= 0) при успешном выполнении фрагмента кода, TCL_ERROR (= 1) при возникновении исключения и несколько других значений для других вещей (TCL_RETURN, TCL_BREAK и TCL_CONTINUE). Эти имена определены на уровне C.
  2. Результирующее значение, которое сохраняется в интерпретаторе. В старых версиях Tcl это была простая строка, но уже более 20 лет это типизированное значение с подсчетом ссылок. (У Tcl есть система типов. Он просто сильно отличается от любого другого языка тем, что строки являются супертипом всех других типов.)
  3. A result dictionary that contains additional information. Standard entries (it's possible to define your own too) in this are:
    1. The error information, a.k.a stack trace that gets written to the errorInfo global to support old code. Only really meaningful for errors.
    2. Код ошибки, машиночитаемый дескриптор исключения, который записывается в глобальную переменную errorCode для поддержки старого кода. Опять же, только действительно значимые для ошибок.
    3. Строка ошибки. Бит, который используется для генерации числа в сообщении (procedure "Div" line 1) и так далее.
    4. Уровень, который используется return для выполнения многоуровневых возвратов.

Есть некоторые другие фрагменты, которые срабатывают только в нескольких случаях (например, когда предложение try в finally выдает исключение, когда тело исключения выбрасывает, грубый случай во многих языках).

person Donal Fellows    schedule 23.03.2020
comment
Что касается того, что делают команды DbgNub_, то это просто не документировано публично. Инструменты отладки в целом работают на довольно низком уровне. - person Donal Fellows; 23.03.2020