您的位置:首页 > 运维架构 > Linux

linux之gdb(上)

2015-10-07 14:42 441 查看

一、什么是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、第一个示例

[cpp]
view plaincopyprint?

//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;  
}  

//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、第二个示例,多个文件

[cpp]
view plaincopyprint?

//search.h  
#ifndef _SEARCH_H_  
#define _SERACH_H_  
int seq_search(int list[], int start, int n, int key);  
#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_


[cpp]
view plaincopyprint?

//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;  
}   

//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;
}


[cpp]
view plaincopyprint?

//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;  
}   

//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  (程序运行至结束)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gdb linux