关键还是得心里有点谱,知道该在哪儿断点。有时候也可能 print 更合适,一设断点反而把复现条件给破坏了。
很好,但是不知道函数还是不行啊
我到现在都不知道edebug那个条件断点怎么设。还有以前死都不知道怎么取消instrument,后来才知道只要正常eval-defun
一遍就成了
当时写parinfer的时候调试要疯,这些方法都不是太好用。。。
edebug 有什么经验分享吗?这玩意儿实在不好用。
edebug很好用了,只要不是调各种hook。
找个buffer往里面写日志可能是最通用的办法了。
确实,很多时候都是在写message调试
哈哈 我也是, 原来我跟了哪个老师 就变成什么样了 。。。
我以为只有我一个。。。
好像还有个二分调试法,但是就不知道怎么操作了
请教一下,单步调试的时候可能会进入其他插件引入的函数,除了 emacs -q 外,有什么其他方法避免么。
你说的单步调试是指什么?edebug?
就是帖子里的 debug-on-entry
https://www.gnu.org/software/emacs/manual/html_node/elisp/Debugger-Commands.html
debug-on-entry只会在你指定的函数上进入debugger啊,“可能会进入其他插件引入的函数”是什么意思?
比如我在 debug 如下函数时,(message "test1")
之后是 (message date)
,但是如果不 emacs -q 的话就会进入下图那个 jit-lock-after-change 的函数中,然后是 pangu-spacing 这个插件,之后单步很久才到 (message date)
这一行
d 很久才到下面这个图(如果 c 的话不小心会 c 错导致重新开始,所以我一般都是 d)
d 一步到下面这个图,但是报错信息比 emacs -q 的少而如果 emacs -q 后调试后,则不会出现上述状况,直接就 message date 了:
d 一步就到下面
继续 d 一步就到出错位置了,但是这里的出错信息比上面那个能够更清楚的看到是 message date 这里出错了。
Code
(require 'parse-time)
(defun parse-date-string (date-string)
"Parse a date string, such as 2016-12-01"
(let ((date-re (nth 0 parse-time-iso8601-regexp)))
(when (string-match date-re date-string)
(let ((year (match-string 1 date-string))
(month (match-string 2 date-string))
(day (match-string 3 date-string)))
(list day month year)))))
(defun parse-time-from-file-name ()
(let* (
(file-name (file-name-nondirectory buffer-file-name))
(date (parse-date-string (substring file-name 0 10)))
)
(message "test1")
(message date)
(message "test2")
date
)
)
(parse-time-from-file-name)
;;; 命名为 2016-10-29-xxx.el,这个函数就是取这个 date 的
c
的话应该直接到下一个message
,你怕c
错我也没啥好办法……如果不想要你提的那些函数,可以把inhibit-modification-hooks
设成nil
试试。
懒猫,问下,怎么打印当前edebug所停留位置的值?最好是完整打印到一个temp buffer(尤其是显示特别长的结果的值)。
我知道 按 r
能打印结果,结果的print长度可以通过 eldoc-print-level
和 eldoc-print-length
设置。我在 edebug-inline-result 里面已经设置了这个,但是还是想要能够打印到一个temp buffer。
谢谢,不过 inhibit-modification-hooks
的值在 debug 前和 debug 中都已经是 nil 了。
那你可以试试关闭font-lock-mode,可能还需要关闭jit-lock-mode。
谢谢,应该大概就是这个 font-lock-mode 造成的原因了。
上图 (message date) 就是出错的地方,但是继续 d 之后会进入到 evil 引入的函数(关于 evil 是我猜的)
因为这是我第一次 debug ,所以就是想请教一下如何避免这些其他 mode 引入函数问题(或者说我举例的那种问题不是普遍存在的?)。
emacs -q 无疑是最好的方法,但是 -q 之后操作很不方便。还是说可以像 redguardtoo 那样写一个 -q 后加载一些方便操作的插件。
(我觉得现在的讨论有点偏离主题了,帖子本意是传授方法,而我们的讨论似乎又集中于某个具体问题,把回复的帖子移到另一个主题里更合适,不知道你怎么看)