[ASM C/C++] GDB 常用命令
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
GDB是一个符号式命令调试器。所谓“符号式(Symbolic)”,意思是在执行程序的时候可以使用变量名和函数名,就好像它们是在源代码中名称一样。为了显示和翻译这些符号,调试器需要与它们相关的信息,以及哪条机器指令对应哪行源代码的信息。这类信息会以符号表的形式出现。当用GCC编译和链接程序时,使用-g选项就会产生符号表。
$ gcc –g test.c
1. 启动GDB
$ Gdb [选项] [执行文件] [核心文件] [进程ID]
2. 命令行自变量
$ gdb myprog //启动程序
$ gdb myprog 1001 //启动进程
3. 命令行选项
--version , -v //输出版本和版权信息
-- quiet, --silent //开始一个交互式的调试过程
--help , -h //显示命令行语法
4. 传递自变量被调试程序
--args
$ gdb –args myprog –d “$HOME” //myprog 是被调试程序,$HOME是myprog的命令行自变量,--args必须是GDB最后出现的选项。
5. 选择文件
-symbols filename
-s filename //加载一个独立的符号表文件
-exec flilename -e filename //指定要被调试的可执行文件
-se filename //指定有符号表的可执行文件
-core filename -c filename -c number -pid number -p number //指定调试内核或进程
6. 先择用户界面
-tty device
-t device //使用 device 做为被调试程序的输入输出
-windows
-w //使用内置的GUI
-nowindows
-nw //在控制台下执行
-tui //使用文本式用户界面TUI
7. 执行命令脚本
-command command_file -x command_file //开始执行命令文件
-batch //执行所有命令后结束,无错状态为0,不为0有错
8. 命令补充
GDB调试器可以帮你节省很多输入工作,可以补充命令名称、变量名称、文件名称、或函数名称。只要输入前几个字符,然后按Tab 链即可。
9. 显示命令的帮助说明
-help ,-h
10. 状态信息
被调试程序的状态信息
Info
Info address
Info all
Info args
Info breakpoints
调试器的状态信息
Show annotats
Show archdebu
Show architecture
Show args
Show logging
11. 在调试器中执行一个程序
File filename
Set args [arguments]
Show args
Run [arguments]
Kill //调试过程发现错误可以用kill终止调试,然后编辑和重新编译程序,如果没有关闭调试器,再次运行时所以设置都会保留。
12. 显示源代码
List filename:line_number //显示源代码,以此行代码为中心
List from ,[to] //显示from 到to的代码行
List function_name //把指定函数的第一行代码当作中间行来显示源代码
List //从上次list停止的地,继续显示
Set listsize number //设置list命令默认的输出行数
Show listsize //显示list命令默认的输出行数
13. 使用断点
设置和显示断点
Break [filename:] line_number //在源代码或文件的某一行设定断点
TBreak line_number //设置临时断点
删除、禁用和忽略断点
Delete [bp_number | range]
D [bp_number | range]
Disable [bp_number | range] //临时禁用某个断点
Enable [bp_number | range]
Ignore bp_number iterations //忽略bp_number断点iterations次
条件式中断
Break [position] if expression
中断后继续执行
Continue [passes] 、c [passes] //继续执行到下一断点
Step [lines] 、s [lines] //单行执行
Next [lines]、n [lines] //单行执行,不进入子函数
Finish //执行完当前函数,控制权交给调用者
14. 分析堆栈
显示调用轨迹
backtrace(bt) //显示调用轨迹
显示和改变目前的堆栈帧
Frame [编号]
显示自变量和局部变量
Info frame //显示目前堆栈帧的相关信息
Info locals //列出函数的局部变量,以及当前值
Info args //列出对应函数调用的自变量值
15. 显示数据
显示表达式的值
P [/format] [expression]
输出格式
D 十进制记数,这是整数表达式的默认格式
U 十进制记数,无符号整数类型
X 十六进制记数法
O 八进制记数法
T 二进制记数法
C 字符,和十进制记数法的字符码一起显示
显示内存区域
X [/nfu] [address] //显示从指定地址开始的内存区域的内容
/nfu
N //十进制数,指定要显示多少个内存单位。
F //格式修饰符,可以是print命令所支持的格式之一,或才是以下两个:
s : 将指定的地址的数据当成“空字符结尾的字符串”显示出来。
I:以汇编语言的形式显示机器指令
U //定义所显示的每个内存单位的空间大小。
b: 一个字节
h: 两个字节(半个字)
w:四个字节(一个字)
g:八个字节(一个巨大字)
16. 观测点:观察变量
Watch expression //当表达式的值改变时调试器停止程序执行
Rwatch expression // 当程序读取“和此表达式相关”的任何对象进,调试器停止程序执行
Awatch expression //当程序读取或修改“和此表达式相关”的任何对象进,调试器停止程序执行
17. 在GDB内分析核心文件
核心文件(core file)也被称为core dump,是一个包含“进程所使用内存映像”的文件。当一个程序不正常地终止时,Unix系统通常会将核心文件写到工作目录下。通过命令行将核心文件的名称传给GDB,就可以研究进程结束时的状态。“分析内核文件”的做法和一般调试的做法类似,由于程序已经停止在某个点,所以不能使用run、step、next、continue等命令让它继续执行。
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
GDB是一个符号式命令调试器。所谓“符号式(Symbolic)”,意思是在执行程序的时候可以使用变量名和函数名,就好像它们是在源代码中名称一样。为了显示和翻译这些符号,调试器需要与它们相关的信息,以及哪条机器指令对应哪行源代码的信息。这类信息会以符号表的形式出现。当用GCC编译和链接程序时,使用-g选项就会产生符号表。
$ gcc –g test.c
1. 启动GDB
$ Gdb [选项] [执行文件] [核心文件] [进程ID]
2. 命令行自变量
$ gdb myprog //启动程序
$ gdb myprog 1001 //启动进程
3. 命令行选项
--version , -v //输出版本和版权信息
-- quiet, --silent //开始一个交互式的调试过程
--help , -h //显示命令行语法
4. 传递自变量被调试程序
--args
$ gdb –args myprog –d “$HOME” //myprog 是被调试程序,$HOME是myprog的命令行自变量,--args必须是GDB最后出现的选项。
5. 选择文件
-symbols filename
-s filename //加载一个独立的符号表文件
-exec flilename -e filename //指定要被调试的可执行文件
-se filename //指定有符号表的可执行文件
-core filename -c filename -c number -pid number -p number //指定调试内核或进程
6. 先择用户界面
-tty device
-t device //使用 device 做为被调试程序的输入输出
-windows
-w //使用内置的GUI
-nowindows
-nw //在控制台下执行
-tui //使用文本式用户界面TUI
7. 执行命令脚本
-command command_file -x command_file //开始执行命令文件
-batch //执行所有命令后结束,无错状态为0,不为0有错
8. 命令补充
GDB调试器可以帮你节省很多输入工作,可以补充命令名称、变量名称、文件名称、或函数名称。只要输入前几个字符,然后按Tab 链即可。
9. 显示命令的帮助说明
-help ,-h
10. 状态信息
被调试程序的状态信息
Info
Info address
Info all
Info args
Info breakpoints
调试器的状态信息
Show annotats
Show archdebu
Show architecture
Show args
Show logging
11. 在调试器中执行一个程序
File filename
Set args [arguments]
Show args
Run [arguments]
Kill //调试过程发现错误可以用kill终止调试,然后编辑和重新编译程序,如果没有关闭调试器,再次运行时所以设置都会保留。
12. 显示源代码
List filename:line_number //显示源代码,以此行代码为中心
List from ,[to] //显示from 到to的代码行
List function_name //把指定函数的第一行代码当作中间行来显示源代码
List //从上次list停止的地,继续显示
Set listsize number //设置list命令默认的输出行数
Show listsize //显示list命令默认的输出行数
13. 使用断点
设置和显示断点
Break [filename:] line_number //在源代码或文件的某一行设定断点
TBreak line_number //设置临时断点
删除、禁用和忽略断点
Delete [bp_number | range]
D [bp_number | range]
Disable [bp_number | range] //临时禁用某个断点
Enable [bp_number | range]
Ignore bp_number iterations //忽略bp_number断点iterations次
条件式中断
Break [position] if expression
中断后继续执行
Continue [passes] 、c [passes] //继续执行到下一断点
Step [lines] 、s [lines] //单行执行
Next [lines]、n [lines] //单行执行,不进入子函数
Finish //执行完当前函数,控制权交给调用者
14. 分析堆栈
显示调用轨迹
backtrace(bt) //显示调用轨迹
显示和改变目前的堆栈帧
Frame [编号]
显示自变量和局部变量
Info frame //显示目前堆栈帧的相关信息
Info locals //列出函数的局部变量,以及当前值
Info args //列出对应函数调用的自变量值
15. 显示数据
显示表达式的值
P [/format] [expression]
输出格式
D 十进制记数,这是整数表达式的默认格式
U 十进制记数,无符号整数类型
X 十六进制记数法
O 八进制记数法
T 二进制记数法
C 字符,和十进制记数法的字符码一起显示
显示内存区域
X [/nfu] [address] //显示从指定地址开始的内存区域的内容
/nfu
N //十进制数,指定要显示多少个内存单位。
F //格式修饰符,可以是print命令所支持的格式之一,或才是以下两个:
s : 将指定的地址的数据当成“空字符结尾的字符串”显示出来。
I:以汇编语言的形式显示机器指令
U //定义所显示的每个内存单位的空间大小。
b: 一个字节
h: 两个字节(半个字)
w:四个字节(一个字)
g:八个字节(一个巨大字)
16. 观测点:观察变量
Watch expression //当表达式的值改变时调试器停止程序执行
Rwatch expression // 当程序读取“和此表达式相关”的任何对象进,调试器停止程序执行
Awatch expression //当程序读取或修改“和此表达式相关”的任何对象进,调试器停止程序执行
17. 在GDB内分析核心文件
核心文件(core file)也被称为core dump,是一个包含“进程所使用内存映像”的文件。当一个程序不正常地终止时,Unix系统通常会将核心文件写到工作目录下。通过命令行将核心文件的名称传给GDB,就可以研究进程结束时的状态。“分析内核文件”的做法和一般调试的做法类似,由于程序已经停止在某个点,所以不能使用run、step、next、continue等命令让它继续执行。
参考:《C in a Nutshell》