GDB调试笔记

命令描述

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值