1.gdb的简单使用
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。GDB主要完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
2.一个调试示例
——————源程序:tst.c
1#include<stdio.h>
2
3 intfunc(int n)
4 {
5 intsum=0,i;
6 for(i=0; i<n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
11 }
12
13
14main()
15 {
16 int i;
17 long result= 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
21 }
22
23 printf("result[1-100] = %d \\n", result );
24 printf("result[1-250] = %d \\n", func(250) );
25 }
编译生成执行文件:(Linux下)
$test>cc -g tst.c -o tst
使用GDB调试:hchen/test>gdb tst <---------- 启动GDB
(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
1 #include <stdio.h>
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i<n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
(gdb) <--------------------直接回车表示,重复上一次命令
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
(gdb)break 16 <--------------------设置断点,在源程序第16行处。
Breakpoint1 at 0x8048496: file tst.c, line 16.
(gdb)break func <--------------------设置断点,在函数func()入口处。
Breakpoint2 at 0x8048456: file tst.c, line 5.
(gdb)info break <--------------------查看断点信息。
NumType Disp Enb Address What
1 breakpoint keep y 0x08048496 in main at tst.c:16
2 breakpoint keep y 0x08048456 in func at tst.c:5
(gdb)r <---------------------运行程序,run命令简写
Startingprogram: /home/hchen/test/tst Breakpoint 1, main () at tst.c:17 <----------在断点处停住。
17 long result = 0;
(gdb)n <---------------------单条语句执行,next命令简写。
18 for(i=1; i<=100; i++)
(gdb)n
20 result += i;
(gdb)n
18 for(i=1; i<=100; i++)
(gdb)n
20 result += i;
(gdb)c <---------------------继续运行程序,continue命令简写。
Continuing.
result[1-100]= 5050 <----------程序输出。Breakpoint 2,func (n=250) at tst.c:5
5 int sum=0,i;
(gdb)n
6 for(i=1; i<=n; i++)
(gdb)p i <---------------------打印变量i的值,print命令简写。
$1= 134513808
(gdb)n
8 sum+=i;
(gdb)n
6 for(i=1; i<=n; i++)
(gdb)p sum
$2 = 1
(gdb)n
8 sum+=i;
(gdb) pi
$3 = 2
(gdb)n
6 for(i=1; i<=n; i++)
(gdb)p sum
$4 = 3
(gdb)bt <---------------------查看函数堆栈。
#0 func (n=250) at tst.c:5
#1 0x080484e4 in main () attst.c:24
#2 0x400409ed in __libc_start_main () from/lib/libc.so.6
(gdb)finish <---------------------退出函数。
Runtill exit from #0 func (n=250) at tst.c:5
0x080484e4in main () at tst.c:24
24 printf("result[1-250] = %d \n", func(250) );
Valuereturned is $6 = 31375
(gdb)c <---------------------继续运行。
Continuing.
result[1-250]= 31375 <----------程序输出。Program exitedwith code 027. <--------程序退出,调试结束。
(gdb)q <---------------------退出gdb。
hchen/test>
http://wenku.baidu.com/view/06901fc65fbfc77da269b185.html?from=related
http://wenku.baidu.com/view/9afdcb305a8102d276a22f9b.html
http://wenku.baidu.com/view/c27253c65fbfc77da269b19b.html