2013-09-09 3 views
0
(progn 
    (print 11) 
    (/ 1 0) 
    (print 22) 
    (/ 2 0) 
    (print 33)) 

При нажатии C-M-X на этом выражении, то Emacs вызывает отладчик, когда он терпит неудачу в точке (1/0). Когда я нажимаю c для продолжения вместо q для выхода, отладчик все равно выйдет без выполнения (печать 22) или (/ 2 0). Единственная разница состоит в том, что с выходами с сообщениемразница между продолжить и выйти в Emacs Lisp отладчик

progn: Arithmetic error 

Что представляет собой пример кода, где с и ц сделать большую разницу, и когда я тип C, а не д?

+0

Разница? Между «continue» и «quit» действительно нет * сходства *. Либо вы возобновляете выполнение, либо прерываете его. Будет ли конечный результат существенно отличаться, очень сильно зависит от * причины *, с которой вы в отладчике начинаете, и, возможно, с типом обработки ошибок в настоящее время. В вашем примере продолжение выполнения очень быстро приводит к выполнению, заканчивающемуся сообщением об ошибке, но это все равно не то же самое, что вручную отменить выполнение из отладчика. – phils

ответ

2

Разница может быть показана в любом коде, который не останавливает выполнение, то есть не содержит ошибки (например, при вызове debug).

+0

Jisang Yoo: см. Также 'C-u M-x apropos-variable RET debug-on-RET' и' C-u M-x apropos-command RET debug-on-RET' – phils

+1

n.b. Для надуманной демонстрации на основе кода в вопросе: '(progn (print 11) (debug) (print 22) (debug) (печать 33))' – phils

0

Сначала мне показалось, что это очень очевидный вопрос: , но, пытаясь построить пример, мне действительно нужно было посмотреть в info. Итак, позвольте мне подвести итог, что я уточнил для себя:

с в edebug не то же самое, как с в gdb. Этот момент останавливается в течение одной секунды на каждой точке останова и в итоге уходит. Я не вижу в данный момент, как это может быть полезно кому угодно. Эквивалент вместо этого g: этот будет продолжаться до следующей точки останова и остановится там.

Вот пример кода:

(defun foo() 
    (setq x (loop for i from 1 to 100 
      collecting (* i i))) 
    (setq y (nth 5 x)) 
    (incf y)) 

(foo) 

Для edebug это:

  1. Вставьте этот код в *scratch*
  2. точки Перемещение внутри foo и Cu CMx (звонки edebug-defun)
  3. Переместить точку на y в setq y и M-х
  4. Перемещение точки edebug-точка останова потасовка закрытия Paren в (foo) и C-J
  5. Вы сейчас в edebug. Здесь вы можете сделать шаг 3 с ярлыком б вместо Мх ...
  6. Вы найдете, что протекающие с SPC утомительно, так как он будет движение, хотя каждое утверждение цикла каждый раз, когда ,
  7. Но если нажать г вы будете пропускать мимо всего цикла, в конечном итоге в заявлении, что ты, мол, интересует.
2

Разница легче видеть, когда вы используете debug-on-signal. С помощью этого параметра отладчик вызывается, когда сигнализируется ошибка, даже если эта ошибка обрабатывается приложением condition-case.В такой ситуации c продолжит нормальное выполнение (т. Е. Сигнализирует об ошибке, которая, в свою очередь, вызывает запуск кода обработчика, который может продолжить выполнение нормально).

0

Другое отличие в отношении рекурсивного редактирования. Например, я могу вызвать query-replace, а затем ввести рекурсивное редактирование, а затем ввести (/ 1 0) и оценить его для ввода отладчика. Теперь, если я нажму q, мы вернемся к верхнему уровню и больше не будем запускать запрос-замену. Но если я нажимаю c, я все еще внутри рекурсивного редактирования.

Обновление Другая разница. В то время как в отладчике c связан с debugger-continue, который является оберткой вокруг exit-recursive-edit и q связан с top-level. Это означает, что любая разница, известная о exit-recursive-edit, применима к top-level. См. Recursive Edit - Emacs Manual.

Ниже приведен пример, приведенный в примере Recursive Editing - Emacs Lisp Manual для проверки отличий.

(defun simple-rec() 
    (forward-word 1) 
    (message "111") 
    (debug) 
    (message "222") 
    (forward-word 1))