我是Emacs新手,并希望尝试使用gdb-mi.el提供的gdb集成的新MI接口。根据我所读到的内容,现在这是执行M-x gdb时使用的默认设置,因此我希望一切都能正常运行。
我正在研究Ubuntu 10.04 LTS。
使用默认的gdb-mi.el,我似乎没有收到与打印到GUD界面的段错误(或调试程序停止的其他原因)相关的消息。使用最新的gdb-mi.el,我得到了消息,但是没有命令提示符来指示命令何时完成执行。
所以我的问题是是否有一个emacs新手可以使用的gdb-mi.el(和相关文件)的修订版来使事情可靠地运行。之前已经提出了类似的问题,例如gud-gdb emacs 24 not working和 Getting gdb to work with emacs 24。看起来有建议恢复旧的GDB接口(gdb-ui.el),但我真的希望让基于MI的接口工作。
问题的其余部分包含了我迄今为止所尝试的一些背景信息,希望它可以帮助其他新手在黑暗中磕磕绊绊。
我几乎没有使用过Emacs lisp的经验,所以我可能咬得比我能咀嚼的多,但如果有人愿意提供从哪里开始的建议,我会非常乐意破解。
为了让事情顺利进行,我一直在使用一个简单的小程序来引发分段错误,所以我有一些东西需要调试。
#include <cstdio>
#include <cstring>
void doCrash()
{
memset(0x0,1,1);
}
int main (int argc, const char ** argv)
{
printf("hello\n");
doCrash();
printf("bye\n");
}
我使用'g ++ -g main.cpp'编译了这个,所以我得到了gdb的调试信息。
然后我使用'Mx gdb'通过emacs启动gdb(并运行它:'gdb -i = mi a.out'),然后执行'Mx gdb-many-windows'以获得一个很好的多窗口布局。
使用默认的gdb-mi.el文件,当我运行程序时,没有消息指示发生了段错误。
(gdb) r
Starting program: /tmp/a.out
(gdb) c
Continuing.
(gdb)
有一个关于'Threads'缓冲区窗口中发生的事情的提示,但是在愤怒地调试大型程序时这没有用:
1 process 31800 stopped in main (argc=1,argv=0x7fffffffe3c8) of main.cpp:11
将gdb-mi.el升级到latest version from github(我事先知道它不太可能完美,因为它可能依赖于其他lisp模块),运行gdb后很快就会丢失提示,但是我做了获取有关segfaults等的消息:
(gdb) r <--- I still have a prompt here
Starting program: /tmp/a.out
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff732efd9 in memset () from /lib/libc.so.6
bt <--- No prompt anymore, but gdb commands work
bt
#0 0x00007ffff732efd9 in memset () from /lib/libc.so.6
#1 0x000000000040066c in doCrash () at main.cpp:6
#2 0x000000000040068c in main (argc=1, argv=0x7fffffffe3c8) at main.cpp:12
缺乏提示可能看起来不是什么大事,但显然不太理想,没有任何迹象表明gdb&amp; emacs已经完成处理,并准备好进行新的输入。