一、
什么是
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、第一个示例
- //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、第二个示例,多个文件
- //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_
- //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;
}
- //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)