GDB 使用简单介绍
2016-05-21 19:47
295 查看
[TOC]
一般来说,GDB主要帮忙你完成下面四个方面的功能:
启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
当程序被停住时,可以检查此时你的程序中所发生的事。
动态的改变你程序的执行环境。
然后,通过以下命令编译文本
使用参数 -g 表示将源代码信息编译到可执行文件中,生成的可执行文件为
0.
1.
通过
2.
3.
4.
5.
6.
7.
查询变量或函数
8.
9.
与
10.
set
11.
12.
13.
14.
15.
跳出当前函数,并打印函数返回时的堆栈地址和返回值及参数值等信息
16.
调用程序中可见的函数
17.
disable
18.
enable
19.
在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值
20.
undisplay
21.
设置一个监视点,一旦被监视的“表达式”的值改变,gdb给出提示
21.
终止被调试程序
23.
退出gdb
GDB概述
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具一般来说,GDB主要帮忙你完成下面四个方面的功能:
启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
当程序被停住时,可以检查此时你的程序中所发生的事。
动态的改变你程序的执行环境。
一个简单的小程序
#include <stdio.h> #define N 100 int fun(int x) { if (x < 0) return 0; return x + fun(x - 1); } int add(int a, int b) { return a + b; } void test_fun() { int x = 0; for (int i = 0; i < 10; ++i) { x = i; } for (int j = 0; j < 10; ++j) { x = j; } } int globalval = 10; int main() { int n = 100; int a = 1; int b = 2; char str[100] = "hello, world"; int c = add(a, b); for (int i = 0; i < n; ++i) { a = i; } c = -1; int d = add(a, b); test_fun(); printf("c = %d d = %d\n", c, d); int ary ; int x; scanf("%d", &x); int ans = fun(x); printf("%d\n", ans); printf("%s\n", str); return 0; }
然后,通过以下命令编译文本
gcc -g a.cc
使用参数 -g 表示将源代码信息编译到可执行文件中,生成的可执行文件为
a.out,当然,也可以用
-o指定
GDB 常用命令
在命令行中键入gdb进入调试模式
0. h
h file # 查看file命令的帮助信息
help命令的缩写,查看命令帮助
1. file
file a.out
通过
file命令载入被调试的程序
2. r
r a.out # 运行被调试程序
run命令的缩写,运行程序
3. l
l # 列出程序的源代码,默认为10行 l 20 # 列出以第20行为中心的前后10行的代码 l fun # 显示fun函数的源代码
list的缩写,查看源代码
4. b
b 22 # 在22行设置断点 b fun # 在函数fun入口设置断点 b add if a > b # 如果a > b, 在add函数设置断点
break的缩写,设置断点
5. i
i b # info breakpoints的缩写,显示断点情况 i locals # info locals显示当前运行程序的变量值 i line # info line 显示当前执行到第几行 i display # info display 查看所有的display i watch # info watch 查看所有的watch i thread # info thread 查看当前进程的线程
info的缩写,显示相关信息
6. p
p a # 打印a的值 p str # 打印字符串的值
7. whatis
whatis ary # 查询ary数组 结果为 type = int [100] whatis str # 查询字符串数组 结果为 type = char [100]
查询变量或函数
8. n
n # 继续执行下一行
next的缩写
9. s
s # 执行下一行
与
n不同的是,碰到函数,
s会进入函数,而
n会跳过函数,继续执行下一行
10. set
set $i = 0 set ary[$i++] # 设置变量i为0,然后这样就可以一路回车,查看ary数组的情况 set variable x = 10 # 设置调试程序中的变量为10
set
11. bt
bt # 查看程序运行栈的相关信息
backtrace的缩写, 查看程序栈的相关信息
12. d
d # 删除所有的断点 d 2 # 删除编号为2的断点 d watch 3 # 删除编号为2的watch d display 2 # 删除编号为2的display
delete的缩写,删除断点
13. c
c
continue的缩写,跳到下一个断点处
14. u
u # 跳出当前的循环 u 20 # 跳到程序的第20行
until的缩写,用来跳出循环
15. finish
finish # 跳出当前函数
跳出当前函数,并打印函数返回时的堆栈地址和返回值及参数值等信息
16. call
call fun(10) # 调用程序中fun(10)函数
调用程序中可见的函数
17. disable
disable 2 # 暂停第二个断点
disable
18. enable
enable 2 # 开启第二个断点
enable
19. display
display a # 每次单步调试都会显示a的值
在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值
20. undisplay
undisplay 2 # 取消编号为2的display
undisplay
21. watch
watch a # 假设a的值被改变,gdb将会给出提示 watch a + b < 1 # a + b < 1 的时候,gdb会给提示
设置一个监视点,一旦被监视的“表达式”的值改变,gdb给出提示
21. kill
终止被调试程序23. q
退出gdb
相关文章推荐
- dp(第一次尝试)
- 关于java中转意字符\\\\的用法探究
- Spring之Referenced file contains error问题的解决
- Html(二)
- 求阶层的优化
- POJ-2421-Constructing Roads(最小生成树 普利姆)
- HDU 5690 查找循环节 数学公式快速幂+乘法逆元(除法取模)
- MySQL数据库解压缩版(免安装版或zip版)无法输入中文,以及与Navicat中文显示一致的问题
- codeforces 670D1 Magic Powder - 1
- 九度OJ 1001:A+B for Matrices
- 在Android开发中使用MVP模式
- 中继器、集线器、网桥、交换机各个组件作用(转))
- 快速排序的分析与实现
- JS学习15(HTML5脚本编程)
- PAT 1015 德才论
- java抽象类练习
- asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- 解除百度云浏览器端对下载大文件的限制
- 坐标转换-终结者--OpenCoord提供下载了
- 2016年上半年软考网络工程师考试下午试题参考答案第一时间发布