GDB调试的一些简单用法

最近进入了一个C语言的项目组,之前从没有做过C语言的项目,虽然大学时学了一些,但感觉很多东西还是不懂。比如GDB调试的方法,大学里就从来没学过。

从其它成员,以及网上学了一些,GDB调试的一些简单用法基本上学会了。为了让自己以后不至于忘记。记录下来。

编译

要使用GDB,在用GCC编译时,要加上-g的参数。不然是没法在GDB里看到代码。
另外要注意的是,用-g的参数编译,它并不是把源代码编译到可执行文件(或者类库)里,而只是把源代码的目录写入可执行文件的信息里,所以编译好之后,不要移动源代码。

进入调试

程序一般有两种运行方式,一种是常驻运行的,还有一种是直接运行的。

对于直接运行的程序,可以用 gdb 可执行文件来启动gdb,然后用run(可简写成r)来运行程序。对于需要参数的运行程序,可以在 --args加上运行命令来执行。如:

gdb a.exe
gdb --args a.exe test

(gdb) run
(gdb) r

对于常驻运行的程序,可以先运行程序,然后用gdb命令启动gdb。之后再用attach(可简写成at) pid来进入调试。如:

gdb

(gdb) attach 1111
(gdb) at 1111

查看代码

gdb里,可以用list(可简写成l)来查看代码。
其后可以接行数,或者函数名,或者文件名:行数。如果不加参数,则显示当前行前后的代码。如果之前执行了list命令,则继续显示。如:

(gdb) list
(gdb) l

(gdb) list 105
(gdb) l 105

(gdb) list testFunc
(gdb) l testFunc

(gdb) list testFunc.c:25
(gdb) l testFunc.c:25

设置断点

gdb里,可以用break(可简写成b)来设置断点。
其后可以接行数,或者函数名,或者文件名:行数。如:

(gdb) break 105
(gdb) b 105

(gdb) break testFunc
(gdb) b testFunc

(gdb) break testFunc.c:25
(gdb) b testFunc.c:25

查看断点

gdb里,可以用info break(可简写成i b)来查看断点。当然info(可简写成i)命令也可以查看其它的信息,因为比较多,可以自己去看看gdb的文档。如:

(gdb) info break
(gdb) info b
(gdb) i break
(gdb) i b

删除断点

gdb里,可以用delete(可简写成d)来删除断点。它的参数是执行查看断点命令的结果里的数字索引。如:

(gdb) delete 1
(gdb) d 1

禁用和启用断点

gdb里,可以用disable(可简写成dis)来禁用断点;用enable(可简写成en)来启用断点。如

(gdb) disable 1
(gdb) dis 1

(gdb) enable 1
(gdb) en 1

输出和修改变量值

gdb里,可以用print(可简写成p)来输出变量值。同时,它也是修改变量值的命令。
在输出结构(struct)时,为了显示更加好看,可以先执行set print pretty on。
在输出比较长的字符串时,gdb默认只输出前面一部分,可以先执行set print elements 2048,其中的2048可以改得更大一些也行。
如:

(gdb) print iTest
(gdb) p iTest

(gdb) print tTest.value
(gdb) p tTest.value

(gdb) print *pTest
(gdb) p *pTest

(gdb) print ptTest->value
(gdb) p ptTest->value

(gdb) p iTest = 1
(gdb) p memset(pTest, 0x30, 10)

监视变量

gdb里,可以用watch来监视变量。在执行停下时,如果其值前后有变化,会输出前后值。然后可以用info watch来查看监视,如:

(gdb) watch idx
(gdb) i watch

跟踪变量

gdb里,可以用display来跟踪变量。在执行停下时,会输出变量值。如:

(gdb) display idx

执行下一步(不进入函数)

gdb里,可以用next(可简写成n)来执行下一步(不进入函数),其后也可以接数字做为参数,表示执行next几次。如:

(gdb) next
(gdb) n

(gdb) next 3
(gdb) n 3

执行下一步(进入函数)

gdb里,可以用step(可简写成s)来执行下一步(进入函数),其后也可以接数字做为参数,表示执行step几次。如:

(gdb) step
(gdb) s

(gdb) step 3
(gdb) s 3

继续执行

gdb里,可以用continue(可简写成c)来继续执行,直至到下一个断点或者程序结束。如:

(gdb) continue
(gdb) c

执行到当前函数结束

gdb里,可以用finish(可简写成f)来执行到当前函数结束,并输出返回值。如:

(gdb) finish
(gdb) f

中断当前函数

gdb里,可以用return来直接中断当前函数,并返回return的参数做为函数的返回值。如:

(gdb) return 20
(gdb) return

查看当前行

有时程序会出现异常,gdb会自动断点到出现异常的位置。这时可以用backtrace(可简写成bt)来查看当前行。如:

(gdb) backtrace
(gdb) bt

转载请注明:宇托的狗窝 » GDB调试的一些简单用法

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址