Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 在Emacs Lisp调试器中继续和退出之间的差异_Debugging_Emacs_Elisp - Fatal编程技术网

Debugging 在Emacs Lisp调试器中继续和退出之间的差异

Debugging 在Emacs Lisp调试器中继续和退出之间的差异,debugging,emacs,elisp,Debugging,Emacs,Elisp,当我在该表达式上按C-M-x时,Emacs在(/10)处失败时调用调试器。当我按c键继续而不是按q键退出时,调试器仍然不执行(print 22)或(/2 0)而退出。这里唯一的区别是c与消息一起退出 (progn (print 11) (/ 1 0) (print 22) (/ 2 0) (print 33)) 什么是c和q有很大区别的示例代码?我什么时候应该键入c而不是q?差异可以显示在任何不停止执行的代码中,即不包含错误(例如,当被调试调用时)。差异可以显示在任何不停止

当我在该表达式上按C-M-x时,Emacs在(/10)处失败时调用调试器。当我按c键继续而不是按q键退出时,调试器仍然不执行(print 22)或(/2 0)而退出。这里唯一的区别是c与消息一起退出

(progn
  (print 11)
  (/ 1 0)
  (print 22)
  (/ 2 0)
  (print 33))

什么是c和q有很大区别的示例代码?我什么时候应该键入c而不是q?

差异可以显示在任何不停止执行的代码中,即不包含错误(例如,当被
调试
调用时)。

差异可以显示在任何不停止执行的代码中,也就是说,不包含错误(例如,当被
debug
调用时)。

起初,我觉得这是一个非常明显的问题, 但是在尝试构建一个示例之后,我实际上不得不查看
信息
。
因此,让我总结一下我为自己澄清的内容:

edebug中的c与gdb中的c不同。 这一个只是在每个断点处停止一秒钟,最终退出。 我现在不知道它对任何人都有什么用处。 等价的是g:这个将持续到下一个断点 停在那里

下面是一个代码示例:

progn: Arithmetic error
edebug
it:

  • 将此代码粘贴到
    *scratch*
  • foo
    和C-u C-M-x中移动点(调用
    edebug defun
  • 将点移动到
    setq y
    中的
    y
    ,并将M-x edebug设置断点
  • 将点移动到
    (foo)
    和C-j中的结束栏
  • 您现在进入了
    edebug
    。在这里,您可以使用快捷方式b执行步骤3 而不是M-x
  • 你会发现继续进行SPC是乏味的,因为它会 每次移动循环的每个语句
  • 但是如果你按g键,你会跳过整个循环,结果是 在你应该感兴趣的声明中

  • 起初,我觉得这是一个非常明显的问题, 但是在尝试构建一个示例之后,我实际上不得不查看
    信息
    。
    因此,让我总结一下我为自己澄清的内容:

    edebug中的c与gdb中的c不同。 这一个只是在每个断点处停止一秒钟,最终退出。 我现在不知道它对任何人都有什么用处。 等价的是g:这个将持续到下一个断点 停在那里

    下面是一个代码示例:

    progn: Arithmetic error
    
    edebug
    it:

  • 将此代码粘贴到
    *scratch*
  • foo
    和C-u C-M-x中移动点(调用
    edebug defun
  • 将点移动到
    setq y
    中的
    y
    ,并将M-x edebug设置断点
  • 将点移动到
    (foo)
    和C-j中的结束栏
  • 您现在进入了
    edebug
    。在这里,您可以使用快捷方式b执行步骤3 而不是M-x
  • 你会发现继续进行SPC是乏味的,因为它会 每次移动循环的每个语句
  • 但是如果你按g键,你会跳过整个循环,结果是 在你应该感兴趣的声明中

  • 当您使用
    debug on signal
    时,最容易看到差异。使用此设置,当发出错误信号时,调试器将被调用,即使该错误由封闭的
    条件案例处理。在这种情况下,
    c
    将继续正常执行(即发出错误信号,这反过来会导致处理程序代码运行,然后处理程序代码可能会继续正常执行)。

    使用
    信号调试时,最容易看出差异。使用此设置,当发出错误信号时,调试器将被调用,即使该错误由封闭的
    条件案例处理。在这种情况下,
    c
    将继续正常执行(即发出错误信号,这反过来会导致处理程序代码运行,然后可能继续正常执行)。

    另一个区别是递归编辑。例如,我可以调用queryreplace,然后输入recursive edit,然后键入
    (/10)
    ,并对其求值以进入调试器。现在,如果我按q,我们就回到了顶层,不再运行queryreplace。但如果我改按c,我仍然在递归编辑中

    更新另一个区别。在调试器中,
    c
    被绑定到
    debugger continue
    ,它是
    exit recursive edit
    并且
    q
    被绑定到
    顶级
    。这意味着已知的
    退出递归编辑
    顶级
    之间的任何差异都适用。看看有什么不同

    下面是根据中的一个示例改编的示例,用于测试差异

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

    另一个区别是递归编辑。例如,我可以调用queryreplace,然后输入recursive edit,然后键入
    (/10)
    ,并对其求值以进入调试器。现在,如果我按q,我们就回到了顶层,不再运行queryreplace。但如果我改按c,我仍然在递归编辑中

    更新另一个区别。在调试器中,
    c
    被绑定到
    debugger continue
    ,它是
    exit recursive edit
    并且
    q
    被绑定到
    顶级
    。这意味着已知的
    退出递归编辑
    顶级
    之间的任何差异都适用。看看有什么不同

    下面是根据中的一个示例改编的示例,用于测试差异

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

    Jisang Yoo:另请参见
    C-u M-x apropos变量RET debug on-RET
    C-u M-x apropos命令RET debug on-RET
    n.b.以问题中的代码为基础的人工演示:
    (程序(打印11)(调试)(打印22)(调试)(打印33))
    Jisang-yo:另见
    C-u M-x apropos变量RET-debug on-RET
    C-u M-x apropos comman