百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

使用gdbgui在浏览器中远程多语言调试

bigegpt 2024-08-20 11:10 2 浏览

码农需要开花大量时间调试和维护项目代码。代码调试是每个码农的最基础技能之一。大多数人都喜欢IDE给你带来的便利的可视化调试体验,少数人则喜欢GDB式命令行的高效调试,那么有没有什么方法能把两者结合起来呢?

在本文中,虫虫要给大家介绍一个这样的工具gdbgui,是gdb的一个Web可视化扩展,可以让我们通过Web在线可视化的调试。

概述

GDB是GNU项目推出的强大开发调试利器,支持跨平台操,跨语言的软件调试。GDB和GCC、Emacs构成了GUN编程的宇宙最强组合。目前GDB可用于调试诸如C,C++,Golang,Rust等编译语言,和Mac,Windows,Linux和BSD等几乎所有的操作系统。GDB可以帮助我们:

发生错误时捕获程序变量和上下文的概况;

如果由于崩溃或异常终止而引起core dump,可以找到什么表达式引起的;

在程序运行时暂停问题的程序部分;

在调试时测试和尝试程序用来缩小或修复问题。

GDB常用的功能可总结如下:


尽管GDB很强大也很高效,但是需要在命令行下使用,对不熟悉命令行的人有些事不是很方便。

gdbgui是另一个基于gdb构建的调试工具。主要区别在于gdbgui向开发人员提供Web展示前端,因此可以在浏览器中实现断点添加,堆栈查看跟踪以及更改上下文和参数值等操作。

gdbgui体系结构

ddbgui库利用了WebSockets的优势。每当前端调试工具启动时,都会建立WebSocket连接,用于浏览器与后端之间的通信通道。在每个已建立的WebSocket之后,后端都会启动一个新的托管gdb子进程以解析输出,同时生成一个单独的子进程以不断检查其他子进程的输出。最后,它使用相同的WebSocket将输出传输到客户端。

安装

gdbgui的运行依赖于Python 3,所以首先得有一个Python 3环境,然后可以用pipx安装 。

首先,安装pipx

python3 -m pip install --user pipx

在用户路径添加新的路径

python3 -m userpath append ~/.local/bin

最后,安装gdbgui

pipx install gdbgui

使用gdbgui进行调试

使用gdbgui调试一个简单的C++程序,熟悉其功能。进入到源代码目录:

cd examples/c

make

运行这些命令后,调试器会在浏览器中弹出打开。

这样会在本地浏览器打开,也可以通过执行gdbgui启动一个gdbgui实例,默认是监听127.0.0.1的本地5000端口。可以通过--port指定监听端口,通过-r指定监听0.0.0.0 这样就可以远程用IP:port访问了(注意安全)。

gdbgui调试界面详解

gdbgui的web界面有很多部件,包括顶部Load Binary条,右上角的调试控制器工具条、设置按钮和信息菜单;

页面中间是调试内容页分左中右三块,分别为文件树,代码区和右边的调试信息窗口。

页面的底部是信息输出和最下面的DGB命令工具。

顶部工具栏

执行文件加载:gdbgui的web界面有很多选项。在页面顶部,看到一个名为Load Binary的部分,可用于加载程序二进制文件(具有gdbgui运行所在的相对路径),可以给它传递参数。请注意,这儿仅接受可执行文件。

调试控制器:

在页面的右侧,是gdbgui的控制器部分,控制器将允许开发人员控制调试的一些流程:比如从头开始重新启动程序跳到下一个断点步进(循环单步模式)退出函数退出到一个功能调用。所有控件也支持键盘快捷键。


系统设置

可以通过单击页面右上方的齿轮图标来浏览调试器的设置部分。设置项的信息都很明确,不过需要懂英文。

"Add breakpoint to main after loading executable",加载可执行文件后给main函数添加断点。

"Maximum number of source file lines to display":源文件显示最大行数,设置数字。

"Pretty print dynamic variables (requires restart",美化动态变量显示

"Refresh all components when a command is sent from the console",向终端发送命令时刷新组件,可以在每个命令之后刷新所有视觉视图(例如输入n下一行执行内容)。

"Print all sent commands in console, including those sent automatically by gdbgui",在控制台中打印所有命令的这个复选项,选中后选就可以在信息输出框显示运行的所有命令,还会显示gdbgui调试时候在后台运行的所有命令。在大多数情况下,最好取消选中此选项,因为它会使终端控制台输出比较杂乱不好读取。

"Add syntax highlighting to source files",对源文件语法高亮。

还可以设置调试器的主题(比如码农们喜欢的深色模式monokai)。


调试内容页

加载可执行文件时,会在页面中间看到带有已应用断点的源代码。此外,还有一个下拉部分,其中显示了用于编译可执行文件的所有源文件的列表。

一般无需通过下拉菜单中指定源文件,但是对于一些语言比如Rust和Golang需要从文件树指定mail函数所在文件。

在最右侧面板是最重要调试信息面板。

调用堆栈和局部变量:显示了在某个断点上的位置(文件和指令地址,这是指向断点的代码中的指针)。还可以探索与被攻击的断点有关的局部变量。通过单击此处的语言环境,都可以看到详细的树状视图,该视图可以以可视格式显示变量之间的复杂关系。

下面接着是一个表达式部分,可以在程序的整个程序生命周期中持续观察某个值。对于预期在程序的不同序列中发生变化的变量,这将很有用。

查看变量Tree

调试器的一个很酷的功能是它将内存地址转换成超链接,因此可以单击这些内存变量。然后可以在下面的内存框中查看它所指的字符。

调试器还有一个独特的变量可视功能是可以根据时间监视图表上某些变量的值。

如果单击表达式部分中的图表图标,就可以显示带有X和Y线的图形。如果表达式的值在调试器的运行时中发生变化,则可以在图形上直观地看到此变化。

接着下边则是断点信息框,信号框和寄存器信息框

我们可以可以很清晰的查看设置的断点位置、断点对应的代码信息,寄存器信息也显示很详细。

信息输出框和gdb命令栏

页面底部是信息输出框和gdb命令输出部分。支持在此处输出gdb的命令行指令,熟悉gdb命令的同学也可以大显身手。

结论

本文虫虫给大家介绍了一个GDB的web插件gdbgui,通过该插件可以实现通过Web浏览器进行程序调试。同时支持远程进行调试,调试界面优美,功能强大,就算是有好用的IDE,该工具也值得大家去尝试一下。

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...