GDB调试笔记
2012-02-16 14:32
351 查看
命令描述
file : 装入想要调试的可执行文件.
eg: (gdb) file test // 打开test
kill : 终止正在调试的程序.
list : 列出产生执行文件的源代码的一部分.
eg: (gdb) l
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main(int argc, char **argv){
6 int ch;
7 char *str = "helloworld!/good morning:fine!";
8 char *pr = str;
9 char *pri_location = str;
10 for( ; ; pr++){
(gdb) l 12 // 后面加行号
(gdb) l main // 后面加函数名
break : 在代码里设置断点, 这将使程序执行到这里时被挂起.
eg: (gdb) b 10
Breakpoint 1 at 0x80484cb: file test_moveprint.c, line 10.
(gdb) break filename.c // 运行到文件 filename.c
(gdb) break filename.c:30 // 运行到文件 filename.c 的第 30 行
run : 执行当前被调试的程序
eg: (gdb) r
Starting program: /home/roo/code/20120216/test_moveprint
.....
next : 执行一行源代码但不进入函数内部.
step : 执行一行源代码而且进入函数内部.
cuntinue : 继续运行
display : 设置自动显示的变量,当程序执行或单步执行时,这些变量的值都自动显示
eg: (gdb) display *pr
(gdb) n
11 if((ch = *pr) == '\0')
2: *pr = 99 'c'
1: pr = 0x80485a4 "cword!/good morning:fine!"
whatis: 命令可以显示某个变量的类型
(gdb) whatis p
type = int *
ptype:比whatis的功能更强,他可以提供一个结构的定义
(gdb) ptype (overlay **)OL_all->overlay_index + 0
type = struct coor {
int x;
int y;
} **
print : 显示/更改变量值
eg: (gdb) print pr
(gdb) print pr
$4 = 0x80485a4 "oworld!/good morning:fine!"
(gdb) print (char *)0x80485a4 // 打印地址内容
$8 = 0x80485a4 "oworld!/good morning:fine!"
(gdb) print *pr
2: *pr = 111 'o'
1: pr = 0x80485a6 "ord!/good morning:fine!"
(gdb) p *(pr + 3)
$17 = 33 '!'
(gdb) print *pr
$5 = 111 'o'
(gdb) p *pr = 'c' // 更改
$10 = 99 'c'
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
(gdb) p i
$21 = 101
(gdb) p/a i // a 按十六进制格式显示变量。
$22 = 0x65
(gdb) p/c i // c 按字符格式显示变量。
$23 = 101 'e'
(gdb) p/f i // f 按浮点数格式显示变量。
$24 = 1.41531145e-43
(gdb) p/x i // x 按十六进制格式显示变量。
$25 = 0x65
(gdb) p/t i // t 按二进制格式显示变量。
$26 = 1100101
x/16bx address 单字节16进制打印address地址处的长度为16的空间的内存,16表示空间长度,不是16进制,x表示16进制,b表示byte单字节(链接出处)
watch : 使你能监视一个变量的值而不管它何时被改变.
eg: (gdb) watch pr
Hardware watchpoint 2: pr // 运行一次后会打印新值
info: 查看寄存器的值
eg: (gdb) info registers
eax 0x12 18
ecx 0xbffff388 -1073745016
edx 0x285360 2642784
ebx 0x283ff4 2637812
esp 0xbffff3a0 0xbffff3a0
ebp 0xbffff3c8 0xbffff3c8
esi 0x0 0
edi 0x0 0
.....
where: 查看调用链
(gdb) where
#0 main (argc=1, argv=0xbffff4a4) at all.c:33
up: 将调用栈上移一个函数调用
down: 将调用栈下移一个函数调用
make : 使你能不退出 gdb 就可以重新产生可执行文件.
shell : 使你能不离开 gdb 就执行 UNIX shell 命令.
quit : 终止 gdb
参考资料:http://fanqiang.chinaunix.net/program/other/2006-07-14/4834.shtml
file : 装入想要调试的可执行文件.
eg: (gdb) file test // 打开test
kill : 终止正在调试的程序.
list : 列出产生执行文件的源代码的一部分.
eg: (gdb) l
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main(int argc, char **argv){
6 int ch;
7 char *str = "helloworld!/good morning:fine!";
8 char *pr = str;
9 char *pri_location = str;
10 for( ; ; pr++){
(gdb) l 12 // 后面加行号
(gdb) l main // 后面加函数名
break : 在代码里设置断点, 这将使程序执行到这里时被挂起.
eg: (gdb) b 10
Breakpoint 1 at 0x80484cb: file test_moveprint.c, line 10.
(gdb) break filename.c // 运行到文件 filename.c
(gdb) break filename.c:30 // 运行到文件 filename.c 的第 30 行
run : 执行当前被调试的程序
eg: (gdb) r
Starting program: /home/roo/code/20120216/test_moveprint
.....
next : 执行一行源代码但不进入函数内部.
step : 执行一行源代码而且进入函数内部.
cuntinue : 继续运行
display : 设置自动显示的变量,当程序执行或单步执行时,这些变量的值都自动显示
eg: (gdb) display *pr
(gdb) n
11 if((ch = *pr) == '\0')
2: *pr = 99 'c'
1: pr = 0x80485a4 "cword!/good morning:fine!"
whatis: 命令可以显示某个变量的类型
(gdb) whatis p
type = int *
ptype:比whatis的功能更强,他可以提供一个结构的定义
(gdb) ptype (overlay **)OL_all->overlay_index + 0
type = struct coor {
int x;
int y;
} **
print : 显示/更改变量值
eg: (gdb) print pr
(gdb) print pr
$4 = 0x80485a4 "oworld!/good morning:fine!"
(gdb) print (char *)0x80485a4 // 打印地址内容
$8 = 0x80485a4 "oworld!/good morning:fine!"
(gdb) print *pr
2: *pr = 111 'o'
1: pr = 0x80485a6 "ord!/good morning:fine!"
(gdb) p *(pr + 3)
$17 = 33 '!'
(gdb) print *pr
$5 = 111 'o'
(gdb) p *pr = 'c' // 更改
$10 = 99 'c'
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
(gdb) p i
$21 = 101
(gdb) p/a i // a 按十六进制格式显示变量。
$22 = 0x65
(gdb) p/c i // c 按字符格式显示变量。
$23 = 101 'e'
(gdb) p/f i // f 按浮点数格式显示变量。
$24 = 1.41531145e-43
(gdb) p/x i // x 按十六进制格式显示变量。
$25 = 0x65
(gdb) p/t i // t 按二进制格式显示变量。
$26 = 1100101
x/16bx address 单字节16进制打印address地址处的长度为16的空间的内存,16表示空间长度,不是16进制,x表示16进制,b表示byte单字节(链接出处)
watch : 使你能监视一个变量的值而不管它何时被改变.
eg: (gdb) watch pr
Hardware watchpoint 2: pr // 运行一次后会打印新值
info: 查看寄存器的值
eg: (gdb) info registers
eax 0x12 18
ecx 0xbffff388 -1073745016
edx 0x285360 2642784
ebx 0x283ff4 2637812
esp 0xbffff3a0 0xbffff3a0
ebp 0xbffff3c8 0xbffff3c8
esi 0x0 0
edi 0x0 0
.....
where: 查看调用链
(gdb) where
#0 main (argc=1, argv=0xbffff4a4) at all.c:33
up: 将调用栈上移一个函数调用
down: 将调用栈下移一个函数调用
make : 使你能不退出 gdb 就可以重新产生可执行文件.
shell : 使你能不离开 gdb 就执行 UNIX shell 命令.
quit : 终止 gdb
参考资料:http://fanqiang.chinaunix.net/program/other/2006-07-14/4834.shtml
相关文章推荐
- GDB调试工具学习笔记
- linux应用编程笔记(1)gdb调试方法及如何找出dbg.c程序中的错误
- 用gdb调试程序笔记: 以段错误(Segmental fault)为例_哎呀呀!_百度空间
- Linux-Ubuntu下gdb调试笔记
- Ubuntu下使用gdb远程调试android native程序笔记
- 用gdb调试程序笔记: 以段错误(Segmental fault)为例
- gdb调试笔记
- Linux下C/C++语言的调试 gdb工具 笔记
- GDB程序调试笔记
- 【gdb调试笔记】
- linux调试程序利器 GDB学习笔记
- 用gdb调试程序笔记: 以段错误(Segmental fault)为例
- linux嵌入式学习(LS2-GDB程序调试之学习笔记)
- 【GDB调试学习笔记】GDB调试入门
- 【错误笔记】GDB调试
- [笔记]用gdb调试core dump
- 用gdb调试程序笔记: 以段错误(Segmental fault)为例
- 用GDB调试程序(笔记)
- 【GDB调试学习笔记】 Makefie上
- 【GDB调试学习笔记】Makefile多级目录生成可执行文件