菜鸟科技网

Debug常用命令有哪些?

Debugging是软件开发过程中不可或缺的环节,熟练掌握调试命令能够显著提高问题定位和解决的效率,不同编程语言和开发环境提供了丰富的调试命令,以下将详细介绍一些通用的调试命令及其使用场景,并结合具体工具进行说明。

Debug常用命令有哪些?-图1
(图片来源网络,侵删)

在命令行调试工具中,GDB(GNU Debugger)是Linux环境下最常用的调试工具之一,启动GDB时,使用gdb <程序名>即可加载待调试的程序,核心命令包括run(或r),用于开始执行程序,若需传入参数,可在run后直接添加,如run arg1 arg2,当程序遇到断点暂停时,next(或n)用于逐行执行,但不进入函数内部;step(或s)则会进入函数内部逐行执行,适合需要分析函数逻辑的场景。continue(或c)用于继续执行程序,直到遇到下一个断点或程序结束,查看变量值是调试的关键,print(或p)命令可以输出变量或表达式的当前值,例如print i将显示变量i的值,而print *ptr则用于解引用指针,若需监控变量变化,display命令会在每次暂停时自动显示指定变量的值,如display array[0],而undisplay可取消自动显示。

断点管理是调试的核心功能。break(或b)用于设置断点,支持多种形式:break mainmain函数入口处设置断点,break 10在第10行设置断点,break func if i==5则设置条件断点,仅当i等于5时触发。info breakpoints(或info b)可查看所有断点及其编号,delete breakpoints <编号>用于删除指定断点,clear则清除当前行的断点,对于程序崩溃的场景,catch命令可以捕获特定事件,如catch throw捕获异常,catch syscall捕获系统调用。

调用栈分析有助于理解函数调用关系。backtrace(或bt)显示当前调用栈的层级,从最内层函数到主函数依次列出,backtrace full还会显示局部变量的值。frame <编号>(或f <编号>)切换到指定层级的栈帧,updown命令则用于在调用栈中上下移动,方便在不同函数作用域中调试内存问题,内存检查方面,x/10x $esp以十六进制格式查看栈顶10个字的内存,info registers(或info reg)显示寄存器当前值,info locals查看当前栈帧的局部变量。

在Python调试中,pdb模块是内置的调试工具,通过python -m pdb script.py启动调试,n(next)、s(step)、c(continue)与GDB类似。l(list)显示当前代码行,p <变量>打印变量,q(quit)退出调试。break <行号>设置断点,condition <断点编号> <条件>设置条件断点,对于多线程调试,thread <编号>切换线程,where(或bt)显示当前线程的调用栈。

Debug常用命令有哪些?-图2
(图片来源网络,侵删)

Java开发者常用jdb命令行工具或IDE内置调试器。run启动程序,stop in <类名.方法名>设置断点,cont继续执行,locals查看局部变量,dump <对象>打印对象信息。thread <线程ID>切换线程,up/down切换调用栈,Visual Studio Code中,F5启动调试,F9设置/取消断点,F10(Step Over)、F11(Step Into)、Shift+F11(Step Out)对应逐行执行命令,监视窗口可实时查看变量变化。

以下表格总结了常用调试命令及其功能:

命令类别 命令缩写 完整命令 功能说明
程序控制 r run 启动程序执行,可附带参数
n next 逐行执行,不进入函数内部
s step 逐行执行,进入函数内部
c continue 继续执行,直到下一个断点或程序结束
变量与内存 p print 打印变量或表达式的值
display display 自动显示指定变量的值(每次暂停时)
x examine 检查内存内容,如x/10x $esp查看栈内存
断点管理 b break 设置断点,支持行号、函数名、条件
info b info breakpoints 查看所有断点信息
del delete 删除指定断点
调用栈 bt backtrace 显示当前调用栈
f frame 切换到指定栈帧
up/down up/down 在调用栈中上下移动
Python (pdb) l list 显示当前代码行
n/s/c next/step/continue 同GDB
Java (jdb) stop in stop in 在方法入口设置断点
locals locals 查看当前局部变量

相关问答FAQs:

Q1: 如何在调试时查看动态变化的数组内容?
A1: 在GDB中,可使用print array@length查看数组的全部元素,例如print myarray@10显示长度为10的数组myarray,对于动态数组,可先通过print sizeof(array)/sizeof(array[0])获取长度,再结合display命令实时监控,Python中可直接使用p array打印整个列表,或通过p array[index]逐个元素查看。

Debug常用命令有哪些?-图3
(图片来源网络,侵删)

Q2: 调试时遇到多线程竞争问题,如何定位线程间的变量冲突?
A2: 在GDB中,使用info threads查看所有线程及其ID,通过thread <ID>切换到目标线程,结合break <变量> if <条件>设置线程相关的条件断点,Java的jdb中,可用threads列出线程,thread <ID>切换后使用locals检查变量,IDE如IntelliJ IDEA支持线程断点(右键断点勾选“Thread”),仅当特定线程到达断点时暂停,便于分析线程同步问题。

分享:
扫描分享到社交APP
上一篇
下一篇