19.2.1 Использование Edebug

Чтобы отладить программу на Lisp с помощью Edebug, вы должны сначала инструментировать код Lisp, который вы хотите отладить. Простой способ сделать это — сначала переместить курсор в определение функции или макроса, а затем выполнить C-u C-M-x (eval-defun с аргументом префикса). См. Инструментарий для Edebug, для альтернативных способов инструментации кода.

После того как функция инструментализирована, любой вызов этой функции активирует Edebug. В зависимости от выбранного вами режима выполнения Edebug, активация Edebug может остановить выполнение и позволить вам пошагово пройти по функции, или она может обновить отображение и продолжить выполнение, проверяя команды отладки. Режим выполнения по умолчанию — пошаговый, который останавливает выполнение. См. Режимы выполнения Edebug.

Внутри Edebug вы обычно просматриваете буфер Emacs, показывающий исходный код отлаживаемой вами программы на Lisp. Это называется буфером исходного кода, и он временно доступен только для чтения.

Стрелка в левой кайме указывает на строку, в которой выполняется функция. Курсор показывает, где внутри строки выполняется функция, но это перестает быть верным, если вы сами перемещаете курсор.

Если вы инструментализируете определение fac (показано ниже) и затем выполняете (fac 3), вот что вы обычно увидите. Курсор находится перед открывающей скобкой перед if.

(defun fac (n)
=>∗(if (< 0 n)
      (* n (fac (1- n)))
    1))

Места внутри функции, где Edebug может остановить выполнение, называются точками остановки. Они возникают как перед, так и после каждого подвыражения, которое является списком, а также после каждой ссылки на переменную. Здесь мы используем точки, чтобы показать точки остановки в функции fac:

(defun fac (n)
  .(if .(< 0 n.).
      .(* n. .(fac .(1- n.).).).
    1).)

Специальные команды Edebug доступны в буфере исходного кода в дополнение к командам режима Emacs Lisp. Например, вы можете ввести команду Edebug SPC, чтобы выполнить до следующей точки остановки. Если вы введете SPC один раз после входа в fac, вот отображение, которое вы увидите:

(defun fac (n)
=>(if ∗(< 0 n)
      (* n (fac (1- n)))
    1))

Когда Edebug останавливает выполнение после выражения, он отображает значение этого выражения в области эхо.

Другие часто используемые команды — b для установки точки остановки, g для выполнения до достижения точки остановки и q для выхода из Edebug и возврата к главному циклу команд. Нажмите ?, чтобы отобразить список всех команд Edebug.