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分析是非常有用的。
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分析是非常有用的。