为GDB编写前端

时间:2013-05-27 10:42:15

标签: user-interface gdb frontend

我想编写一个基于GUI的调试器,它包含在GDB上。因为,我不希望程序在观察点或断点后停止。相反,它应该将文件名,行号,新值和填充等详细信息重定向到文件并继续执行。

我在编写脚本方面非常糟糕。所以,我想要一些起点开始为GDB开发前端。据我搜索,此链接 http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_211.html 对于此活动中的初学者来说不太明白?

希望我能获得有关C / C ++开发的帮助。

4 个答案:

答案 0 :(得分:13)

对于编写GDB前端,您确实希望使用 GDB / MI 协议,但可能会阅读this最新副本而不是您链接到的旧版本。< / p>

示例GDB / MI会话

(GDB手册中this section的轻微编辑版本)

使用MI命令解释程序启动GDB

$ gdb -q --interpreter=mi2
=thread-group-added,id="i1"
(gdb)

文件/ bin / true

-file-exec-and-symbols /bin/true
^done
(gdb) 

打破主要

-break-insert main
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x00000000004014c0",func="main",file="true.c",fullname="/usr/src/debug/coreutils-8.17/src/true.c",line="59",times="0",original-location="main"}
(gdb) 

运行和断点命中

-exec-run
=thread-group-started,id="i1",pid="2275"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb) 
=library-loaded,id="/lib64/ld-linux-x86-64.so.2",target-name="/lib64/ld-linux-x86-64.so.2",host-name="/lib64/ld-linux-x86-64.so.2",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/lib64/libc.so.6",target-name="/lib64/libc.so.6",host-name="/lib64/libc.so.6",symbols-loaded="0",thread-group="i1"
=breakpoint-modified,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x00000000004014c0",func="main",file="true.c",fullname="/usr/src/debug/coreutils-8.17/src/true.c",line="59",times="1",original-location="main"}
*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame={addr="0x00000000004014c0",func="main",args=[{name="argc",value="1"},{name="argv",value="0x7fffffffde98"}],file="true.c",fullname="/usr/src/debug/coreutils-8.17/src/true.c",line="59"},thread-id="1",stopped-threads="all",core="1"
(gdb) 

继续

-exec-continue
^running
*running,thread-id="1"
(gdb) 
=thread-exited,id="1",group-id="i1"
=thread-group-exited,id="i1",exit-code="0"
*stopped,reason="exited-normally"

退出GDB

(gdb) 
-gdb-exit
^exit

现有GDB / MI客户端

C,C ++,Java,Python中有几种GDB / MI客户端实现。我将列出一些我觉得易于阅读的内容:

  • 非活动libmigdb项目(sample programpublic interfaces) - 好消息是它是尝试创建可重用的C库。坏消息是它维护得不好,例如我认为它缺少GDB 不间断模式和 catchpoint 命令支持,以及您的用例可能需要的功能。
  • python-gdb-mi - 如果你了解Python,那么相当可读
  • C++ GDB/MI client code in QtCreator - 虽然它是作为支持多个调试器引擎的抽象层的一部分编写的,但也非常易读。

您可能还想浏览GDB前端的this list

答案 1 :(得分:2)

由于您已经指出了gdb / mi接口,现有的解决方案可能会让您了解如何满足您的需求。 Here is a list of existing interfaces.看看他们的方法以及他们如何解决不同的问题。

另一种可能有用的方法可能是自动会话。不要劝阻你写一个gdb gui,但是这样的自动化可能是一个良好的开端,可以感受到所需的步骤,也许还可以作为一个开始。也许生成一个会话脚本并用它启动gdb。 gdb -x加载命令文件。

此处有关于自动化的链接: What are the best ways to automate a GDB debugging session?

我希望它有所帮助。祝你好运!

答案 2 :(得分:1)

虽然编写新的GUI工具可以为您提供更多知识,但我建议您根据自己的需要进行操作并进行修改。它可以节省您的大量时间并且更加灵活。

答案 3 :(得分:1)

编写gdb包装器以实现您的目标是很多工作的方法。

了解如何在断点命中执行脚本:gdb scripting: execute commands at selected breakpoint

另请查看gdb跟踪点:http://sourceware.org/gdb/onlinedocs/gdb/Tracepoints.html