GDB是什么
GNU symbolic debugger
GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等
GDB能做什么
- ★★1.程序启动时,可以按照我们自定义的要求运行程序,例如设置参数和环境变量
- 2.可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态(例如当前变量的值,函数的执行结果等),即支持断点调试。
- ★★3.程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误【未使用过】
基础用法
1、查看调用栈 (backtrace,缩写bt)
bt [-full][n] // 打印frame信息,打印栈帧信息的同时,打印出局部变量的值 thread apply all bt // 查看所有线程的堆栈
C/C++程序在执行时,每调用一个函数,都会生成一个栈帧(frame,缩写 f)。
- frame集中存放在一块大的内存中,一般称之为栈区。
- frame在函数调用时生成,在函数调用完成时销毁。
栈帧frame
① main() 主函数对应的frame,又称为初始帧或者最外层的帧。(类似洋葱)
② 每当程序中多调用一个函数,执行过程中就会生成一个新的frame,如果该函数是一个递归函数,则会生成多个frame.
③ 每个frame对应有地址作为它们的标识符,每个frame都是一块连续的内存,但不一定是frame的首地址。
④ gdb调试器给frame进行编号,当前正在运行函数对应的frame记为frame 0,调用它的函数记为 frame 1,以此类推。
f num // 设置 frame num 为当前frame up [num] // 设置当前帧+num为当前frame down [num] // 设置当前帧-num为当先frame info frame // 查看当前frame的信息 info args // 查看当前frame参数的值 info locals // 查看局部变量的值
参考:http://c.biancheng.net/view/8282.html
2、查看变量的值
print,缩写p
p result // 打印值 p result=10 // 修改值 print file::variable // 指定作用域为文件file print func::variable // 指定作用域为函数func
print fmt expr // fmt用于设置打印输出的格式,如十六进制、二进制等
// 打印设置 set print array on/off // 是否以便于阅读的格式输出数组中的元素,默认值为off. set print array-indexed on/off // 打印数组变量的同时打印下标,默认off. set print pretty on/off // 以便于阅读的格式打印某个结构体变量的值,默认值为off. set print address on/off // 查看某一指针变量的值时,是否同时打印其占用的内存地址,默认值为on.
set print repeats 0 打印的时候不重复
set print elements 0 打印长度不限制
set pagination off 打印不分页
display
display expr // 打印变量或表达式 display /fmt expr // fmt用于设置打印输出的格式,如十六进制、二进制等 info display // 查看display信息 undisplay linenum // 删除自动显示 enable/disable display linenum // 启用/禁用自动显示
delete display linenum // 删除自动显示
3、带参数的调试
// 法一 gdb -args ./test_entity_fuzzy config.cfg txt1 song_20w_add_6_4.dic txt1_result 1 // 法二 gdb ./test_entity_fuzzy set args config.cfg txt1 song_20w_add_6_4.dic txt1_result 1 b test_result
4、layout 调试
layout src
在线文档:
官方文档:ttps://sourceware.org/gdb/current/onlinedocs/gdb/index.html#SEC_Contents
100个调试技巧:https://wizardforcel.gitbooks.io/100-gdb-tips/content/show-version.html