gdb常用命令总结

gdb常用命令总结

gdb常用命令总结记录使用gdb调试时常用的命令2024.04.051. cheat sheet显示类命令缩写命令说明infoi查看断点 / 线程等信息printp打印变量或寄存器值displaydisplay自动显示命令whatiswhatis查看变量类型ptypeptype查看变量类型listl显示源码disassembledis查看汇编代码backtracebt查看当前线程的调用堆栈helphelp帮助命令控制类型的命令缩写命令说明runr运行一个待调试的程序continuec让暂停的程序继续运行nextn运行到下一行steps单步执行,遇到函数会进入untilu运行到指定行停下来finishfi结束当前调用函数,回到上一层调用函数处returnreturn结束当前调用函数并返回指定值,到上一层函数调用处jumpj将当前程序执行流跳转到指定行或地址断点监视点缩写命令说明breakb添加断点tbreaktb添加临时断点deleted删除断点enableenable启用某个断点disabledisable禁用某个断点watchwatch监视某一个变量或内存地址的值是否发生变化名称缩写命令说明framef切换到当前调用线程的指定堆栈threadthread切换到指定线程set argsset args设置程序启动命令行参数show argsshow args查看设置的命令行参数1.1 常用调试方式直接调试目标程序:附加进程 id:gdb attach pid调试 core 文件:gdb filename corename调试目标程序

gdb ./hello_world

调试一个正在运行的程序

# 启动时直接attach到一个进程

gdb -p PID

# 在gdb环境中 attach一个进程

(gdb) attach PID

调试 core 文件:

gdb ./program_name corename

1.2 常用命令退出命令:q(quit)或者 Ctr + d

启动程序:r (run)

继续运行:c (continue)

查看调用栈:bt (backtrace)

进入调用栈:f (frame)堆栈编号

单步执行:n(next),遇到函数直接跳过,不进入函数内部

单步执行:s(step),会进入函数内部

退出当前函数:finish,继续执行完当前函数,正常退出

返回当前函数:return,从当前位置,从当前函数退出,剩下的代码不执行了,可以指定函数的返回值;

指定位置停下来:until,和 break 类似

查看某段代码的汇编指令:disassemble

帮助命令:help

1.3 断点1.3.1 设置断点程序运行到某一行

b test.cpp 100

程序运行到某一个函数

b namespace::func

其他文件设置

b a.cpp:441

其他文件的某一个函数

b a.cpp:func

设置条件断点

b if i = 8

1.3.2 查看断点info b

1.3.3 删除断点删除第几个断点

delete N

删除第几行的断点

clear N

1.3.4使能断点使能第 N 个断点

enable N

不使能第 N 个断点

disable N

1.4 监视点单个变量

watch i

指针变量,监视的是指针变量本身,

watch p

指针所指向的变量,监视指针所值的内容:

watch *p

数组,可以监视整个数组的内容

watch a

注意:当监视的变量变化时会自动停下来

当监视的变量脱离了作用域,也就失效了;

1.5 打印调用函数

p func()

调试过程中修改变量的值

print var=value

计算表达式并打印

print a+b+c

输出当前对象的各成员变量的值

print *this

查看变量类型

whatis var

查看变量类型,可以查看复合数据类型,会打印出该类型的成员变量

ptype val

1.5.1 打印字符串打印 std::string

打印内容

p str

p str.c_str()

打印长度

p str.length()

p str.size()

字符串太长

set print elements 0

1.5.2 打印 vector 和 map1.6 list 命令输出上一次list命令显示的代码后面的代码,如果是第一次执行list命令,则会显示当前正在执行代码位置附近的代码;

list

上一次 list 命令显示的代码前面的代码

list -

显示当前代码文件第 Linenumber 行附近的代码;

list Linenumber

显示 FileName 文件第 LineNo 行附近的代码

list FileName:Linenumber

显示当前文件的 FunctionName 函数附近的代码

list FunctionName

显示 FileName 文件的 FunctionName 函数附件的代码

list FileName:FunctionName

其中from和to是具体的代码位置,显示这之间的代码

list from,to

1.7 jump 命令中间跳过的代码是不会执行的;跳到的位置后如果没有断点,那么GDB会自动继续往后执行;跳转到第几行

jump line_number

跳转往下 10行

jump + 10

跳转到具体的内存地址

jump *0X12345678

1.8 display 命令基本用法

display expression

跟踪变量值: 如果您正在调试一个C程序,并且想观察变量foo的值随程序执行的变化,可以这样设置:

(gdb) display foo

显示内存地址内容: 若要跟踪特定内存地址(如0x12345678)的内容:

(gdb) display *0x12345678

跟踪表达式结果: 如果您关心的是某个计算结果或复杂表达式的值,比如变量a与b之和:

(gdb) display a + b

格式化输出: 可以使用/fmt选项来指定显示值的格式,类似于printf函数的格式化字符串。例如,以十六进制显示整数:

(gdb) display/x foo

或以浮点数的科学记数法显示:

(gdb) display/g foo

查看GDB文档或使用help format命令获取更多关于格式化选项的信息。

查看已设置的display项: 如果您设置了多个display命令,可以使用info display命令列出所有当前生效的自动显示项及其编号:

(gdb) info display

取消自动显示: 要取消之前设置的某个display项,使用undisplay命令并指定其编号:

(gdb) undisplay 1

上述命令将取消编号为1的display设置。

临时禁用所有自动显示: 如果想暂时关闭所有自动显示,而不取消它们的设置,可以使用disable display命令:

(gdb) disable display

后续可以通过enable display命令重新启用所有自动显示。

查看即将执行的汇编指令: 在调试汇编程序时,使用display/i $pc命令可以显示每次程序暂停时即将执行的汇编指令:

(gdb) display/i $pc

$pc是GDB的内部变量,代表当前程序计数器的值,即下一条要执行的指令地址。

2 调试分析 core 文件用 gdb 打开 core 文件查看堆栈信息进入某个栈:f N,f 是 frame 的缩写,N 是栈号,如0、1、2、3…进入栈之后,查看变量,printgdb ./program core

bt

where

f 3

3 多线程调试3.1 常用的命令查看所有线程信息

info thread

切换线程

thread thread_number

查看所有线程的栈信息

thread apply all bt

在特定线程编号上打断点

break location thread thread_number

通用的命令, 可以用 all,作用禹全部线程

thread apply thread_number1 thread_number2 ... command

3.2 模式all-stop mode,全停模式,当程序由于任何原因在 GDB 下停止时,不止当前的线程停止,所有的执行线程都停止。这样允许你检查程序的整体状态,包括线程切换,不用担心当下会有什么改变。non-stop mode,不停模式,调试器(如VS2008和老版本的GDB)往往只支持 all-stop 模式,但在某些场景中,我们可能需要调试个别的线程,并且不想在调试过程中影响其他线程的运行,这样可以把GDB的调式模式由 all-stop 改成 non-stop,7.0 版本的GDB引入了 non-stop 模式。在 non-stop 模式下 continue、next、step 命令只针对当前线程。record mode,记录模式;记录模式允许 GDB 记录程序的执行过程,包括线程的运行、变量的修改等,并将这些信息保存到记录文件中。这个功能可以帮助您分析程序的运行过程,并且可以在之后的时间点回放这些记录,从而帮助您定位问题或理解程序的执行流程。replay mode,回放模式;回放模式允许您回放之前记录的执行过程。在这个模式下,您可以重现程序之前的执行状态,以便更深入地分析和调试程序。这种模式在查找程序运行中的难以复现的问题时非常有用。non-stop 模式

gdb -exec-run-mode non-stop your_program

记录模式

gdb -record record_file_name your_program

回放模式

gdb -replay record_file_name

3.3 设置线程锁默认的调试模式:一个线程暂停运行,其他线程也随即暂停;一个线程启动运行,其他线程也随即启动

但在一些场景中,我们希望只让特定线程运行,其他线程都维持在暂停状态,即要防止线程切换。

set scheduler-locking on,锁定线程,只有当前或指定线程可以运行;专注于一个调试一个线程。set scheduler-locking off,在单步调试当前线程时,其他线程不受影响,继续并发执行。set scheduler-locking step,当单步执行某一线程时,其他线程不会执行,同时保证在调试过程中当前线程不会发生改变。但如果在该模式下执行 continue、until、finish 命令,则其他线程也会执行;show scheduler-locking,查看线程锁定状态;4 技巧和 shell 一样,有一些简便操作:

上下方向键可以查看最近的命令回车,执行上一次执行的命令,单步调试非常有用Reference:

https://zhuanlan.zhihu.com/p/297925056https://www.zhihu.com/question/65306462←上一页下一页→

相关推荐

滴滴车主司机端 365bet体育在线注册

滴滴车主司机端

📅 07-04 👁️ 7922
街霸4和街霸5哪个好玩 365bet体育在线注册

街霸4和街霸5哪个好玩

📅 10-04 👁️ 6868
Win11管理模板在哪里打开?如何设置? best365网页登录不上去

Win11管理模板在哪里打开?如何设置?

📅 09-27 👁️ 7123
转行适合做什么运营?这5个方向让你少走三年弯路 best365网页登录不上去

转行适合做什么运营?这5个方向让你少走三年弯路

📅 10-03 👁️ 7435