linux之gdb(上)


一、 什么是 gdb
     什么是 gdb gdb GNUdebugger 的缩写,是编程调试工具。

二、gdb功能
1、 启动程序,可以按照用户自定义的要求随心所欲的运行程序。
2、 可让被调试的程序在用户所指定的调试的断点处停住 ( 断点可以是条件表达式 )
3、 当程序停住时,可以检查此时程序中所发生的事。
4、 动态改变量程序的执行环境。

三、运行程序
1、 run(r) 运行程序
2、 runarg1 arg2 …

四、查看源码
1、 list(l)- 查看最近 10 行源码
2、 listfun - 查看 fun 函数源码
3、listfile:fun - 查看file文件中的fun函数源码
4、list file:10 - 查看file文件中的第10行的源码

五、设置断点
1、 break(b)  行号
2、 breakfun
3、 breakfile: 行号
4、 breakfile:fun
5、 breakif <condition> - 条件成立时程序停住。
6、 infobreak( i b) - 查看断点
7、 watchexpr - 当变 expr的 值发生改变,程序停住。
8、 delete(d) n - 删除第n个断点

六、单步调试
1、 continue(c)-  运行至下一个断点
2、step(s)-   单步跟踪,进入函数,类似于VC中的stepin
3、next(n)-  单步跟踪,不进入函数,类似于VC中的stepout
4、 finish- 运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
5、 until- 当厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

七、gdb常用命令总结

run(r)

运行

list(l)

列出源代码

break(b)

设置断点

info break(i b)

查看断点信息

continue(c)

继续程序运行,直到下一个断点

watch

设置观察点

step(s)

单步跟踪,类似于VC中的step in

next(n)

单步跟踪,类似于VC中的step out

finish

运行程序,直到当前函数返回

until(u)

退出循环

print(p)

查看运行时的变量以及表达式


八、示例
1、第一个示例
  1. //main.c  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. long func(int n);  
  5. int main(int argc, char *argv[])  
  6. {  
  7.      printf("Entering main ...\n");  
  8.      int i;  
  9.      for (i=0; i<argc; ++i)  
  10.      {  
  11.           printf("%s ", argv[i]);  
  12.      }  
  13.      printf("\n");  
  14.      long result = 0;  
  15.      for (i=1; i<=100; ++i)  
  16.      {  
  17.           result += i;  
  18.      }  
  19.      printf("result[1-100] = %ld\n", result);  
  20.      printf("result[1-10] = %ld\n", func(10));  
  21.      printf("Exiting main ...\n");  
  22.      return 0;  
  23. }  
  24. long func(int n)  
  25. {  
  26.      long sum = 0;  
  27.      int i;  
  28.      for (i=1; i<=n; ++i)  
  29.      {  
  30.           sum += i;  
  31.      }  
  32.      return sum;  
  33. }  
//main.c
#include <stdio.h>
#include <stdlib.h>
long func(int n);
int main(int argc, char *argv[])
{
     printf("Entering main ...\n");
     int i;
     for (i=0; i<argc; ++i)
     {
          printf("%s ", argv[i]);
     }
     printf("\n");
     long result = 0;
     for (i=1; i<=100; ++i)
     {
          result += i;
     }
     printf("result[1-100] = %ld\n", result);
     printf("result[1-10] = %ld\n", func(10));
     printf("Exiting main ...\n");
     return 0;
}
long func(int n)
{
     long sum = 0;
     int i;
     for (i=1; i<=n; ++i)
     {
          sum += i;
     }
     return sum;
}

#  gcc -Wall -g main.c -o main
#  gdb main
#  list或者l  (查看所有源代码)
#  break 10 (第10行设置断点)
#  info break  (查看断点)
#  b func  (在函数func设置断点,即在long sum = 0;设置)
#  i b  (查看断点)
#  r (运行程序,则程序运行到第一个断点
或者也可以输入参数#  r a b c (运行程序,则程序运行到第一个断点,这里abc是传给argv,因此程序会打印出程序的文件/home/xin/test/main  a  b  c的信息
#  s  (单步运行)
#  “Enter”  (执行上一个命令)
#  p  (查看 i 变量的值)
#  s  (继续单步运行)
#  p  (查看 i 变量的值的变化)
#  until  (跳出循环,程序即跑到for循环的下一条命令:printf("result[1-100] = %ld\n", result);
#  l 15(查看第15行的源代码
#  p result(查看 result 变量的值:5050
#  s  (继续单步运行)
#  c  (继续程序运行,直到下一个断点:long sum = 0;
#  s  (继续单步跟踪)
#  s  (继续单步跟踪)
#  finish  (退出当前函数)
#  s  (继续单步跟踪:printf("result[1-100] = %ld\n", result);
#  c  (继续程序运行,程序退出
Program exited normally
#  q  (也可以按q退出gdb调试


2、第二个示例,多个文件
  1. //search.h  
  2. #ifndef _SEARCH_H_  
  3. #define _SERACH_H_  
  4. int seq_search(int list[], int start, int n, int key);  
  5. #endif // _SERACH_H_   
//search.h
#ifndef _SEARCH_H_
#define _SERACH_H_
int seq_search(int list[], int start, int n, int key);
#endif // _SERACH_H_ 
  1. //search.c  
  2. #include "search.h"  
  3. int seq_search(int list[], int start, int n, int key)  
  4. {  
  5.      int i;  
  6.      for (i=start; i<n; ++i)  
  7.      {  
  8.           if (list[i] == key)  
  9.                return i;  
  10.      }  
  11.      return -1;  
  12. }   
//search.c
#include "search.h"
int seq_search(int list[], int start, int n, int key)
{
     int i;
     for (i=start; i<n; ++i)
     {
          if (list[i] == key)
               return i;
     }
     return -1;
} 
  1. //main.c  
  2. #include <stdio.h>  
  3. #include "search.h"  
  4. int main(int argc, char *argv[])  
  5. {  
  6.      printf("Entering main ...\n");  
  7.      int i;  
  8.      for (i=0; i<argc; i++)  
  9.      {  
  10.           printf("%s ",argv[i]);  
  11.      }  
  12.      printf("\n");  
  13.      int a[10] = {1, 3, 8, 9, 8, 3, 8, 6, 9, 2};  
  14.      int key = 8;  
  15.      int pos;  
  16.      int count = 0;  
  17.    
  18.      pos = 0;  
  19.      while ((pos=seq_search(a, pos, 10, key)) != -1)  
  20.      {  
  21.           count++;  
  22.           pos++;  
  23.      }  
  24.      printf("%d occurs %d times in the list\n", key, count);  
  25.      printf("Exiting main ...\n");  
  26.      return 0;  
  27. }   
//main.c
#include <stdio.h>
#include "search.h"
int main(int argc, char *argv[])
{
     printf("Entering main ...\n");
     int i;
     for (i=0; i<argc; i++)
     {
          printf("%s ",argv[i]);
     }
     printf("\n");
     int a[10] = {1, 3, 8, 9, 8, 3, 8, 6, 9, 2};
     int key = 8;
     int pos;
     int count = 0;
 
     pos = 0;
     while ((pos=seq_search(a, pos, 10, key)) != -1)
     {
          count++;
          pos++;
     }
     printf("%d occurs %d times in the list\n", key, count);
     printf("Exiting main ...\n");
     return 0;
} 



#  gcc -Wall -g main.c search.c -o main
#  gdb main
#  l search.c:10  (查看search.c的源代码)
#  l search.c:seq_search
#  b search.c:6   (在search.c源代码中设置断点)
#  l main
#  break if i=50
#  p i(可以打印出发现i=50)
#  watch i (当变量i的值发生改变的时候,程序停住)
#  c  (i发生改变,程序停住)
#  c  (i发生改变,程序停住)
#  d 2 (删除断点)
#   step(s) ( 单步跟踪,进入seq_search函数,类似于 VC 中的 step in)
#   next(n) ( 单步跟踪,不进入seq_search函数,类似于 VC 中的 step out)
#  c  (程序运行至结束)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值