码农需要开花大量时间调试和维护项目代码。代码调试是每个码农的最基础技能之一。大多数人都喜欢IDE给你带来的便利的可视化调试体验,少数人则喜欢GDB式命令行的高效调试,那么有没有什么方法能把两者结合起来呢?
在本文中,虫虫要给大家介绍一个这样的工具gdbgui,是gdb的一个Web可视化扩展,可以让我们通过Web在线可视化的调试。
GDB是GNU项目推出的强大开发调试利器,支持跨平台操,跨语言的软件调试。GDB和GCC、Emacs构成了GUN编程的宇宙最强组合。目前GDB可用于调试诸如C,C++,Golang,Rust等编译语言,和Mac,Windows,Linux和BSD等几乎所有的操作系统。GDB可以帮助我们:
发生错误时捕获程序变量和上下文的概况;
如果由于崩溃或异常终止而引起coredump,可以找到什么表达式引起的;
在程序运行时暂停问题的程序部分;
在调试时测试和尝试程序用来缩小或修复问题。
GDB常用的功能可总结如下:
尽管GDB很强大也很高效,但是需要在命令行下使用,对不熟悉命令行的人有些事不是很方便。
gdbgui是另一个基于gdb构建的调试工具。主要区别在于gdbgui向开发人员提供Web展示前端,因此可以在浏览器中实现断点添加,堆栈查看跟踪以及更改上下文和参数值等操作。
gdbgui体系结构
ddbgui库利用了WebSockets的优势。每当前端调试工具启动时,都会建立WebSocket连接,用于浏览器与后端之间的通信通道。在每个已建立的WebSocket之后,后端都会启动一个新的托管gdb子进程以解析输出,同时生成一个单独的子进程以不断检查其他子进程的输出。最后,它使用相同的WebSocket将输出传输到客户端。
安装
gdbgui的运行依赖于Python3,所以首先得有一个Python3环境,然后可以用pipx安装。
首先,安装pipx
python3-mpipinstall--userpipx
在用户路径添加新的路径
python3-muserpathappend~/.local/bin
最后,安装gdbgui
pipxinstallgdbgui
使用gdbgui进行调试
使用gdbgui调试一个简单的C++程序,熟悉其功能。进入到源代码目录:
cdexamples/c
make
运行这些命令后,调试器会在浏览器中弹出打开。
这样会在本地浏览器打开,也可以通过执行gdbgui启动一个gdbgui实例,默认是监听.0.0.1的本地端口。可以通过--port指定监听端口,通过-r指定监听0.0.0.0这样就可以远程用IP:port访问了(注意安全)。
gdbgui调试界面详解
gdbgui的web界面有很多部件,包括顶部LoadBinary条,右上角的调试控制器工具条、设置按钮和信息菜单;
页面中间是调试内容页分左中右三块,分别为文件树,代码区和右边的调试信息窗口。
页面的底部是信息输出和最下面的DGB命令工具。
顶部工具栏
执行文件加载:gdbgui的web界面有很多选项。在页面顶部,看到一个名为LoadBinary的部分,可用于加载程序二进制文件(具有gdbgui运行所在的相对路径),可以给它传递参数。请注意,这儿仅接受可执行文件。
调试控制器:
在页面的右侧,是gdbgui的控制器部分,控制器将允许开发人员控制调试的一些流程:比如从头开始重新启动程序,跳到下一个断点,步进(循环单步模式),退出函数或退出到一个功能调用。所有控件也支持键盘快捷键。
系统设置
可以通过单击页面右上方的齿轮图标来浏览调试器的设置部分。设置项的信息都很明确,不过需要懂英文。
Addbreakpointtomainafterloadingexecutable,加载可执行文件后给main函数添加断点。
Maximumnumberofsourcefilelinestodisplay:源文件显示最大行数,设置数字。
Prettyprintdynamicvariables(requiresrestart,美化动态变量显示
Refreshall