您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: