Linux下的gdb的常用调试命令

Linux下有一个强大的调试工具gdb,gdb可以调试C、C++、D、Go、python、pascal、assemble(ANSI 汇编标准)等等编程语言。课件gdb调试工具的强大。在此总结了gdb调试C语言常用的一些命令。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
一,现在来说第一个功能:以以下一个源程序代码为例:
源代码为:tst.c

 #include  
  int func(int n) 
   { 
   int sum=0,i;
    for(i=0; i

[…Desktop] $ touch tst.c
[…Desktop] $ vim tst.c
编译生成文件
[…Desktop] $ cc -g tst.c -o tst
使用GDB调试
[…Desktop]$ 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模式:
(gdb)l ---------->list的简写,意思为从第一行开始列出源码
1 #include
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i 7{
8 sum+=i;
9 }
10 return sum;
(6)(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;
二,下面为第二个功能的实现
我们用break命令来设置断点。正面有几点设置断点的方法:
1,break 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
2, break 在指定行号停住。
3, break +offset
break -offset
在当前行号的前面或后面的offset行停住。offiset为自然数。
4, break filename:linenum 在源文件filename的linenum行处停住。
5,break filename:function 在源文件filename的function函数的入口处停住。
6,break *address 在程序运行的内存地址处停住。
7,break break命令没有参数时,表示在下一条指令处停住。
以下为几个举例:
(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 <---------- 在断点处停住。
long result = 0;
(gdb) n ---------->单条语句的执行,next的简写
for(i=1; i<=100; i++)
(gdb) n
result += i;
(gdb) n
for(i=1; i<=100; i++)
(gdb) n
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
for(i=1; i<=n; i++)
(gdb) p i <--------------------- 打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
sum+=i;
(gdb) n
6for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
sum+=i;
(gdb) p i
$3 = 2
(gdb) n
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。
三,下面是几个相关于GDB语言环境的命令:
show language 查看当前的语言环境。
info frame 查看当前函数的程序语言。
info source 查看当前文件的程序语言。
如果GDB没有检测出当前的程序语言,那么你也可以手动设置当前的程序语言。使用set language命令即可做到。
以上只是感性得认识gdb,简单系统得了解到的gdb。

你可能感兴趣的:(linux)