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常用命令总结
八、示例
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;
}
# 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_
[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;
}
[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;
}
# 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
什么是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 (程序运行至结束)
相关文章推荐
- Linux socket 初步
- linux lsof详解
- linux 文件权限
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死