10

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

我在编写脚本方面很糟糕。所以,我想要一些起点来开始为 GDB 开发前端。据我用谷歌搜索,这个链接http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_211.html对于这个活动的初学者来说不是很容易理解吗?

希望我能在 C/C++ 开发方面获得帮助。

4

4 回答 4

14

为了编写 GDB 前端,您确实想使用GDB/MI协议,但可能要阅读最新副本而不是您链接到的旧副本。

示例 GDB/MI 会话

(来自 GDB 手册的此部分的轻微编辑版本)

使用 MI 命令解释器启动 GDB

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

文件 /bin/真

-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项目(示例程序公共接口)——好消息是它是创建可重用 C 库的尝试。坏消息是它没有得到很好的维护,例如,我认为它缺少 GDB不间断模式和catchpoint命令支持,您的用例可能需要这些功能。
  • python-gdb-mi -- 如果你知道 Python,那么可读性很强
  • QtCreator 中的C++ GDB/MI 客户端代码——虽然它是作为抽象层的一部分编写的,以支持多个调试器引擎,但也非常易读。

您可能还想浏览这个GDB 前端列表。

于 2013-05-27T12:26:38.523 回答
2

由于您已经指出了 gdb/mi 接口,因此现有的解决方案可能会让您了解如何满足您的需求。这是现有接口的列表。看看他们的方法以及他们如何解决不同的问题。

另一种可能有用的方法是自动化会话。并不是要阻止您编写 gdb gui,但这样的自动化可能是一个很好的开始,可以让您了解所需的步骤,也可以作为一个开始。也许生成一个会话脚本并用它启动 gdb。gdb -x 加载命令文件。

这里有一个关于自动化的链接: 自动化 GDB 调试会话的最佳方法是什么?

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

于 2013-05-27T12:27:34.087 回答
1

虽然编写新的 GUI 工具会给你更多的知识,但我建议你使用 ecipe 并根据需要进行修改。它可以节省您的大量时间并且更加灵活。

于 2013-05-27T12:08:48.610 回答
1

编写一个 gdb 包装器来实现你的目标是很多工作的方式。

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

还看一下 gdb 跟踪点:http: //sourceware.org/gdb/onlinedocs/gdb/Tracepoints.html

于 2013-05-27T12:26:26.320 回答