gdb简介
gdb是 GNU 开发的一个Unix/Linux下强大的程序调试工具。
使用 gdb 进行程序调试之前,gcc编译选项加上 -g 选项来讲调试信息加到可执行文件里
一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你自定义的要求随心所欲的运行程序。
2、可以让调试程序在你所指定的位置的断点处停止。
3、当程序停止时,可以检查此时你的程序里所发生的事情。
最后,动态的改变你程序的执行环境。
使用GDB
一般来说GDB主要调试的是C/C++程序。要调试C/C++程序,首先在编译时,我们需要把调试信息加到可执行文件里。使用编译器(cc/gcc/g++)的-g参数可以做到这一点,如:
$ cc –g hello.c –o hello
$ g++ -g hello.cpp –o hello
如果没有-g,你将看不见程序的函数名,变量名,所代替的全是运行的内存地址。当你用-g把调试信息假如之后,并成功编译目标代码以后,可以用GDB调试它。
一.运行
| run(简记为 r) | 其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。 |
|---|---|
| continue (简写c ) | 继续执行,到下一个断点处(或运行结束) |
| next(简写 n) | 单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数里去运行,而 next 则直接调用函数,不会进入到函数体内。 |
| step(简写s) | 单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的 |
| until | 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。 |
| until+行号 | 运行至某行,不仅仅用来跳出循环 |
| finish | 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。 |
| call函数(参数) | 调用程序里可见的函数,并传递“参数”,如:call gdb_test(55) |
| quit(简记为 q) | 退出gdb |
二.设置断点
| break n (简写b n) | 在第n行处设置断点,可以直接对某个cpp设置断点 b xxx.cpp:36, 36行设置断点 |
|---|---|
| b fn1 if a>b | 条件断点设置 |
| break func(break缩写为b) | 在函数func()的入口处设置断点,如:break cb_button |
| delete 断点号n | 删除第n个断点 |
| disable 断点号n | 暂停第n个断点 |
| enable 断点号n | 开启第n个断点 |
| clear 行号n | 清除第n行的断点 |
| info b (info breakpoints) | 显示当前程序的断点设置情况 |
| delete breakpoints | 清除所有断点 |
三.查看源代码
| list (简记为 l ) | 其作用就是列出程序的源代码,默认每次显示10行。 |
|---|---|
| list 行号 | 将显示当前文件以“行号”为核心的前后10行代码,如:list 12 |
| list 函数名 | 将显示“函数名”所在函数的源代码,如:list main |
| list | 不带参数,将接着上一次 list 命令的,输出下边的内容。 |
四.打印表达式
| print 表达式(简记为 p) | 其“表达式”可以为任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。 |
|---|---|
| print a | 将显示整数 a 的值 |
| print ++a | 将把 a 里的值加1,并显示出来 |
| print name | 将显示字符串 name 的值 |
| print gdb_test(22) | 将以整数22作为参数调用 gdb_test() 函数 |
| print gdb_test(a) | 将以变量 a 作为参数调用 gdb_test() 函数 |
| display 表达式 | 在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a |
| watch 表达式 | 设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a |
| whatis | 查询变量或函数 |
| info function | 查询函数 |
| 扩展info locals | 显示当前堆栈页的所有变量 |
五.查询运行信息
| where/bt | 当前运行的堆栈列表; |
|---|---|
| bt backtrace | 显示当前调用堆栈 |
| up/down | 改变堆栈显示的深度 |
| set args 参数 | 指定运行时的参数 |
| show args | 查看设置好的参数 |
| info program | 来查看程序的是否在运行,进程号,被暂停的原因 |