GDB学习笔记

最近在恶补CMU 15-213 CSAPP,课程的质量是非常高的,但是其中有不少内容在西电的《计算机组成原理》、《微机原理与接口技术》等课程学过了,于是就只能“略读”一下。但是这门课的LAB质量也是很高的,于是便尝试了一下。体验了一下LAB1:bomb和LAB2:attack后,发现难度真的很大,基本上都是看着网上的答案来做的。

因为汇编语言在本科就学过了(而且实验基本上也是看网上做的),所以这篇博客主要记录一下在做实验的过程中学到最有用的东西:GDB(到现在才学GDB感觉好像有点晚了)。

启动

1
2
gdb # start gdb
gdb <file> # indicate excutable file

运行

1
2
3
4
5
6
7
quit # exit gdb
run # run program
run [arg1] [arg2] # run with arguments
kill # stop program
quit # exit gdb
ctrl-d # exit gdb
ctrl-c # halts the current gdb command

添加断点

1
2
3
4
5
6
7
break func # set the breakpoint at the entry of func
break *<address> # set the breakpoint at address
delete 1 # delete breakpoint 1
disable 1 # disable breakpoint 1
enable 1 # enable breakponit 1
delete # delete all breakpoints
clear func # delete breakpoints at the entry of func

执行

1
2
3
4
5
6
7
8
9
stepi # execute one instruction
stepi 4 # execute four instructions
nexti # execute one instruction but don't step into function
step # execute one C statement
next # execute one C statement but don't step into function
continue # resume execution until the next breakpoint
until 3 # continue executing until breakpoint 3
finish # execute until current function returns
call func(1,2) # call func with param 1, 2 and return value

查看代码

1
2
3
disas # disassemble current function
disas func # disassemble func
disas <address> # disasseble function around address

查看数据

print命令

1
print [format] <expession>

打印数据,其中format可以是:

  • \d 按十进制格式显示
  • \x 按十六进制格式显示
  • \a 按十六进制格式显示
  • \u按十六进制格式显示无符号整型
  • \o 按八进制格式显示
  • \t 按二进制格式显示
  • \c 按字符格式显示
  • \f 按浮点数格式显示

<expression>可以是寄存器、变量、表达式、地址,还可以使用指针的强制类型转换来改变数据的长度,可以说在C中支持的表达式(包括解引用*和取地址符&)在这里都可以支持。

x命令

1
x/nwd <address>

功能比较强大的x命令,n表示要输出的个数,使用数字来表达;w表示一个数据的长度,bhwg分别表示单字节、双字节、四字节、八字节,d就是输出格式,参考上文的format。

display命令

1
display/fmt <expression>

每当到达断点时,显示表达式的值,可以使用info display和来查看表达式的信息,使用undisplay numdelete display numdisable display num来关闭第num个表达式的打印,如字面意思,前两个是删除,最后一个是暂时禁用,可以用enable display num来重新启用。

watch命令

1
watch <expression>

这个命令和上述几个命令也很像,但是行为不同。watch命令会在指定的表达式发生改变时中断程序的运行。

rwatch命令

当表达式被读取的时候中断程序。

awatch命令

每次读写表达式的值都会中断程序。

修改数据

1
set var key=value

将某个变量key的值设置为value,当然也可以用print命令来修改,也支持寄存器的值,只要把key改成如$edx即可。

1
print key=value

执行信息

1
2
3
4
5
6
7
8
backtrace # print the current address and stack backtrace
info program # print the current status of the program
info funcions # print functions in program
info stack # print backtrace of stack
info frame # print infomation about the current stack frame
info registers # print resgiters and their contents
info breakpoints # print status of user-settable breakpoints
help # get help about gdb

GDB学习笔记
http://zhouhf.top/2024/10/13/gdb-note/
作者
周洪锋
发布于
2024年10月13日
许可协议