您的位置:首页 > 其它

gdb常用命令

2006-11-21 10:33 281 查看
break (b)
break是用于设置断点的。其快捷键为b。
用法示例: break main
b main 以上两个都实现了在main()中设置断点。
b test1.c:21
b 21 以上两个都实现了在程序中的第21行设置断点。

假设有文件TestStrtok.c

1 #include <stdio.h>
2 #include <string.h>
3 int main ( int argc, char **argv)
4 {
5 char buf1[] = "aaa, ,a, ,,,bbb-c,,,ee|abc";
6 char * token = strtok( buf1, ",-|" );
7 int i = 0;
8 while( token != NULL )
9 {
10 printf( "%d/t", ++i );
11 printf( "%s/n ", token );
12 token = strtok( NULL, ",-|");
13 }
14 printf( "/r/n" );
15 return 0;
16 }



①编译:必须带有-g或-ggdb
gcc TestStrtok.c -o TestStrtok.out -ggdb

②进入gdb
gdb TestStrtok.out

③开始调试

(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3 int main ( int argc, char **argv)
4 {
5 char buf1[] = "aaa, ,a, ,,,bbb-c,,,ee|abc";
6 char * token = strtok( buf1, ",-|" );
7 int i = 0;
8 while( token != NULL )
9 {
10 printf( "%d/t", ++i );
(gdb)
11 printf( "%s/n ", token );
12 token = strtok( NULL, ",-|");
13 }
14 printf( "/r/n" );
15 return 0;
16 }
(gdb)
Line number 17 out of range; TestStrtok.c has 16 lines.
(gdb) b 6
Breakpoint 1 at 0x804843a: file TestStrtok.c, line 6.
(gdb)



condition
使用条件断点。请注意gdb是如何给断点分配序号的——它是断点1。要使用条件断点,首先要指出断点的号码,然后是表达式。只有表达式为真的时候,程序才能被中断。
用法示例:


(gdb) condition 1 svalues[counter]->checksum>700


(gdb) r


Starting program: /home/test_user/ehanxuan/test5


Enter a string, or leave blank when done: hi


Enter a string, or leave blank when done: hello


Enter a string, or leave blank when done: how are you?




Breakpoint 1, main () at test5.c:21


21 maxval=counter;


(gdb) print svalues[counter]->checksum


$1 = 1122


(gdb)



delete
删断点,后接断点编号。(断点信息可用 info breakpoints 或 i b 来查看)
用法示例:delete breakpoints 1
d b 1

watch
设置观察窗口。使用watch命令,可在特定条件为真时,中止程序的执行。
用法示例: watch counter>5

run (r)
运行程序到下一个断点。其快捷键为r。(《Linux 编程宝典》: 开始运行一个程序并调试。如果指定了参数,它们将作为程序的参数传递给程序。运行命令理解通配符和 I/O 重定向,但不包括管道。)
用法示例: run
r

continue
运行程序到下一个断点。(《Linux 编程宝典》: 计数值。让程序继续执行直到遇到其他引起中断的事件。当使用这个语法时,如果遇到断点时表达式为真,断点才会引起程序中止执行。
用法示例: continue

step (s)
单步执行(跟踪进入函数里)。其快捷键为s。
用法示例: step
s

next (n)
单步执行(不跟踪进入函数里)。其快捷键为n。
用法示例: next
n

Enter(即按回车键)
执行上一条指令。

print (p)
显示变量的值。其快捷键为p。
用法示例: print varName ——varName为变量名
p varName

display
在使用display的时候,每次在调试器中断程序,挂起指令时都要显示变量的值。
用法示例:


Enter an integer, or use -1 to exit: 100


12 if(input==-1)exit(0);


(gdb) display input


2: input = 100


(gdb) n


13 printmessage(counter, input);


2: input = 100


(gdb)


For number 3, you entered 100 (0 more than last time)




10 for(counter=0; counter<200; counter++)...{


2: input = 100


(gdb)


11 input=getinput();


2: input = 100


(gdb)

查看源代码
list <linenum> 显示程序第linenum行附近的源程序
list <function> 显示函数名为function的函数的源程序
list 显示当前行后面的源程序
list- 显示当前行前面的源程序

core dump分析
在分析core dump之前,必须首先确认你的账号是否允许这么做。使用下面的命令可使自己具有这样的权限: $ ulimit -c unlimited
然后就可以使用core文件了。
用法示例: $ gdb test core

bt: 堆栈命令,可查看堆栈历史记录。gdb会告诉程序员每个函数被执行的最后一行。
info: 堆栈命令,可查看堆栈历史记录。
frame 栈帧编号: 可激活栈帧编号所对应的内容。

虽然这种core dump分析的方法非常有用,但是却不是很可靠。如果在程序完全崩溃之前堆栈已经被破坏了,就根本不能从中获得有用信息。在这种情况下,可能必须要跟踪程序才能解决问题。然而在许多情况下,core dump分析是非常有用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: