2

我使用了 https://opensource.apple.com/source/lldb/lldb-69/utils/emacs/gud.elhttps://github.com/ptrv/emacs.d/blob/master/site-lisp/ gud-lldb.el ,以及 LLVM 3.9.1 中的 emacs 24.3 和 lldb。它可以在断点处停止,并在单独的 emacs 窗口中将光标显示在正确的源文件上。但是 lldb 中的 'up'/'down' 命令仅在 lldb emacs 窗口中显示新的源代码。没有显示新源代码的新 emacs 窗口。

's'/'fin' 可以在不同的窗口中显示正确的代码。

这是预期的吗?

4

2 回答 2

2

在 emacs 25.3.1 中,我对https://github.com/ptrv/emacs.d/blob/master/site-lisp/gud-lldb.el的运气更好。它还具有不尝试修补 gud.el 的优点。我是一个更加独立的解决方案。上下移动堆栈帧时,它也无法移动光标,但通过此更改它可以工作:

*** gud-lldb.el.orig    2017-12-11 17:22:08.000000000 -0700
--- gud-lldb.el 2017-11-18 11:52:55.000000000 -0700
***************
*** 64,73 ****
              ;; * thread #1: tid = 0x2e03, 0x0000000100000de8 a.out`c + 7 at main.c:39, stop reason = breakpoint 1.1, queue = com.apple.main-thread
              (string-match " at \\([^:\n]*\\):\\([0-9]*\\), stop reason = .*\n"
                            gud-marker-acc start)
!             ;; (lldb) frame select -r 1
!             ;; frame #1: 0x0000000100000e09 a.out`main + 25 at main.c:44
!             (string-match "^[ ]*frame.* at \\([^:\n]*\\):\\([0-9]*\\)\n"
!                            gud-marker-acc start))
        ;(message "gud-marker-acc matches our pattern....")
        (setq gud-last-frame
              (cons (match-string 1 gud-marker-acc)
--- 70,79 ----
                      ;; * thread #1: tid = 0x2e03, 0x0000000100000de8 a.out`c + 7 at main.c:39, stop reason = breakpoint 1.1, queue = com.apple.main-thread
              (string-match " at \\([^:\n]*\\):\\([0-9]*\\), stop reason = .*\n"
                            gud-marker-acc start)
!       ;; cherry
!       ;; (lldb) frame #1: 0x000000010013e29a sta`sta::PathEnumFaninVisitor::visitFromToPath(sta::Pin const*, sta::Vertex*, sta::TransRiseFall const*, sta::Tag*, sta::PathVertex*, sta::Edge*, sta::TimingArc*, float, sta::Vertex*, sta::TransRiseFall const*, sta::Tag*, float&, sta::MinMax const*, sta::PathAnalysisPt const*) + 986 at /Users/foobar/File.cc:348
!       (string-match "^.*frame.* at \\([^:\n]*\\):\\([0-9]*\\)\n"
!             gud-marker-acc start))
        ;(message "gud-marker-acc matches our pattern....")
        (setq gud-last-frame
              (cons (match-string 1 gud-marker-acc)
于 2017-11-18T18:55:35.447 回答
1

jjcherry56,你的改变有效。而且,既然你找到了它,我将之前的答案从 -1 投票为 0。

所以,我查看了那个增量,最后明确地做了一个小改动。

特别是,我改变了模式的一部分:

string-match "^[ ]*frame

string-match "^.*frame

它奏效了!

诚然,gud-lldb.el 中的“之前”模式(来自 jjcherry56 的 delta),^[ ]*frame)比 ^frame 更接近(在原始修改的 gud.el 中,它根本不起作用,并且该文件覆盖了其他语言调试器)。

因此,修改后的模式现在从行首到帧都采用任何内容,而不仅仅是零个或多个空白。更接近,如果不是,实际上是“那里”(甚至没有考虑多个“框架”实例的边界条件就行了,以及其他深度测试:-)。

jjcherry56,我怀疑某人最初的否决是因为将提问者称为“nube”,并且没有具体的解释摘要(当然不是我,而且可能是过度的,特别是考虑到您的更改已经优点,但我可以理解反应)。

由于您所说的原因,gud-lldb.el 肯定更好,您的修复现在允许我(和其他人(您也是,Joe C))继续寻求(继续能够)调试在 Mac 上明智地使用 emacs/gud。

PS我已经尝试了一切来使用gdb(我羡慕所有为它工作的人),没有运气,所以这是一个保护程序。嘿,我实际上可以在深度处设置一个断点,然后 Mx lldb 停在那里,并给我缓冲区中的箭头(它会弹出)!

于 2017-12-23T19:18:44.733 回答