编译生成执行文件:( _*Linux*_ <javascript:;> 下) hchen/test> cc -g tst.c -o tst
使用 *GDB* 调试:
hchen/test> *gdb* tst <---------- 启动 *GDB* GNU *gdb* 5.1.1 Copyright 2002 Free Software Foundation, Inc. *GDB* is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for *GDB*. Type "show warranty" for details. This *GDB* was configured as "i386-suse-linux"... (*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 行处。 Breakpoint 1 at 0x8048496: file tst.c, line 16. (*gdb*) break func <-------------------- 设置断点,在函数 func() 入口处。 Breakpoint 2 at 0x8048456: file tst.c, line 5. (*gdb*) info break <-------------------- 查看断点信息。 Num Type 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 命令简写 Starting program: /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*) p i $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 () at tst.c:24 #2 0x400409ed in __libc_start_main () from /lib/libc.so.6 (*gdb*) finish <--------------------- 退出函数。 Run till exit from #0 func (n=250) at tst.c:5 0x080484e4 in main () at tst.c:24 24 printf("result[1-250] = %d /n", func(250) ); Value returned is $6 = 31375 (*gdb*) c <--------------------- 继续运行。 Continuing. result[1-250] = 31375 <---------- 程序输出。
Program exited with code 027. <-------- 程序退出,调试结束。 (*gdb*) q <--------------------- 退出 *gdb* 。 hchen/test>
/home/hchen> *gdb* GNU *gdb* 5.1.1 Copyright 2002 Free Software Foundation, Inc. *GDB* is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for *GDB*. Type "show warranty" for details. This *GDB* was configured as "i386-suse-linux". (*gdb*) help List of classes of commands:
aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data files -- Specifying and examining files internals -- Maintenance commands obscure -- Obscure features running -- Running the program stack -- Examining the stack status -- Status inquiries support -- Support facilities tracepoints -- Tracing of program execution without stopping the program user-defined -- User-defined commands
Type "help" followed by a class name for a list of commands in that class. Type "help" followed by command name for full documentation. Command name abbreviations are allowed if unambiguous. (*gdb*)
*gdb* 的命令很多, *gdb* 把之分成许多个种类。 help 命令只是例出 *gdb* 的 命令种类,如果要看种类中的命令,可以使用 help <class> 命令,如: help breakpoints ,查看设置断点的所有命令。也可以直接 help <command> 来查看命 令的帮助。
*gdb* 中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了, 当然,命令的前几个字符应该要标志着一个唯一的命令,在 Linux 下,你可以敲 击两次 TAB 键来补齐命令的全称,如果有重复的,那么 *gdb* 会把其例出来。
示例一:在进入函数 func 时,设置一个断点。可以敲入 break func ,或是直接 就是 b func (*gdb*) b func Breakpoint 1 at 0x8048458: file hello.c, line 10.
示例二:敲入 b 按两次 TAB 键,你会看到所有 b 打头的命令: (*gdb*) b backtrace break bt (*gdb*)