Linux GDB Debug
http://blog.jobbole.com/107925/
gdb 调试入门,大牛写的高质量指南
http://blog.jobbole.com/107759/
gdb是the GNU Debugger的简称。它是一款UNIX平台的调试器(debugger),可用于为C, C++, Objective-C, Java, Fortran等程序debug。
在gdb中,你可以通过设置断点(break point)来控制程序运行的进度,并查看断点时的变量和函数调用状况,从而发现可能的问题。在许多IDE中,gdb拥有图形化界面。
这里主要介绍gdb的命令行使用,并以C程序为例。测试使用的计算机是Mac OS系统。
启动gdb
下面的有两个C文件。(并没有bug。我们使用gdb来查看程序运行的细节)
程序的一个为test.c,其中有主程序main()。mean.c程序中定义了mean()函数,并在main()中调用。
test.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#define ARRAYSIZE 4
float mean(float, float);
int main()
{
int i;
float a=4.5;
float b=5.5;
float rlt=0.0;
float array_a[ARRAYSIZE]={1.0, 2.0, 3.0, 4.0};
float array_b[ARRAYSIZE]={4.0, 3.0, 2.0, 1.0};
float array_rlt[ARRAYSIZE];
for(i = 0; i < ARRAYSIZE - 1; i++) {
array_rlt[i] = mean(array_a[i], array_b[i]);
}
rlt = mean(a, b);
return 0;
}
|
mean.c
1
2
3
4
|
float mean(float a, float b)
{
return (a + b)/2.0;
}
|
使用gcc同时编译上面两个程序。为了使用gdb对进行调试,必须使用-g选项(在编译时生成debugging信息):
$gcc -g -o test test.c mean.c
生成main可执行文件。
(如有必要,使用:
$chmod +x test
来增加用户的执行权限。)
进入gdb,准备调试程序:
$gdb test
进入gdb的互动命令行。
显示程序
我们可以直接显示某一行的程序,比如查看第9行程序:
(gdb) list 9
将显示以第9行为中心,总共10行的程序。我们实际上编译了两个文件,在没有说明的情况下,默认为主程序文件test.c:
1
2
3
4
5
6
7
8
9
|
int main()
{
int i;
float a=4.5;
float b=5.5;
float rlt=0.0;
float array_a[ARRAYSIZE]={1.0, 2.0, 3.0, 4.0};
float array_b[ARRAYSIZE]={4.0, 3.0, 2.0, 1.0};
|
如果要查看mean.c中的内容,需要说明文件名:
(gdb) list mean.c:1
可以具体说明所要列出的程序行的范围:
(gdb) list 5, 15
即显示5-15行的程序。
显示某个函数,比如:
(gdb) list mean
设置断点
我们可以运行程序:
(gdb) run
程序正常结束。
运行程序并没有什么有趣的地方。gdb的主要功能在于能让程序在中途暂停。
断点(break point)是程序执行中的一个位置。在gdb中,当程序运行到该位置时,程序会暂停,我们可以查看此时的程序状况,比如变量的值。
我们可以在程序的某一行设置断点,比如:
(gdb) break 16
将在test.c的第16行设置断点。
你可以查看自己设置的断点:
(gdb) info break
每个断点有一个识别序号。我们可以根据序号删除某个断点:
(gdb) delete 1
也可以删除所有断点:
(gdb) delete breakpoints
查看断点
设置断点,并使用run运行程序,程序将运行到16行时暂停。gdb显示:
1
2
|
Breakpoint 1, main () at test.c:16
16 for(i = 0; i < ARRAYSIZE - 1; i++) {
|
查看断点所在行:
(gdb) list
查看断点处的某个变量值:
(gdb) print a
(gdb) print array_a
查看所有的局部变量:
(gdb) info local
查看此时的栈状态 (反映了函数调用,见Linux从程序到进程):
(gdb) info stack
可以更改变量的值。
(gdb) set var a=0.0
(gdb) set var array_a={0.0, 0.0, 1.0, 1.0}
当程序继续运行时,将使用更改后的值。
如果我们将断点设置在:
(gdb) break mean.c:2
此时栈中有两个a,一个属于main(),一个属于mean()。我们可以用function::variable的方式区分:
(gdb) print mean::a
运行控制
让程序从断点开始,再多运行一行:
(gdb) step
也可以使用下面命令,从断点恢复运行,直到下一个断点:
(gdb) continue
使用run重新开始运行。
帮助
你可以通过gdb的帮助学到更多:
(gdb) help
或者更具体的命令:
(gdb) help info
退出
使用下面命令退出gdb:
(gdb) quit
debug
下面是一个有bug的C程序,demo.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <stdio.h>
struct node {
int element;
};
typedef struct node *PNode;
int main()
{
int i;
PNode np=NULL;
for (i=0; i<10; i++) {
printf("Hello World!");
}
printf("%d \n", np->element);
}
|
程序可以成功编译,但运行将返回:
Segmentation fault
可以使用gdb来查找问题。
Updata:
经水土精灵提醒: gdb命令可以只输入首字母的缩写,比如c代表continue,b代表break,q代表quit。
Linux GDB Debug的更多相关文章
- Linux GDB常用命令一栏
Linux GDB 常用命令如下: 1.启动和退出gdb (1)启动:gdb ***:显示一段版权说明: (*** 表示可执行程序名) (2)退出:quit.有的时候输入quit后会出现相关提示:类似 ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
- linux 将debug信息重定向到LCD(屏幕)
/*********************************************************************** * linux 将debug信息重定向到LCD(屏幕) ...
- linux gdb
linux gdb linux 测试代码 #include <stdio.h> #include <stdlib.h> static char buf[255]; static ...
- Linux GDB Debugging
Catalog . GDB Introduction . GDB基本命令 1. GDB Introduction GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师 ...
- Linux GDB调试全面解析
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断 ...
- linux下debug工具
在linux下开发难免会遇到bug,但是由于没有图形IDE,导致debug也变得困难,其实只要掌握一些常用的debug工具,一些错误就能很快解决,本文就介绍一些常用的工具用以调试: log 输出log ...
- Linux gdb调试器用法全面解析
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断 ...
- Linux GDB程序调试工具使用简单介绍
GDB概述 GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做软件,你会发现GDB这个调试 ...
随机推荐
- 系统图片uri的问题
调用系统图库会出现两种uri的问题,一个是在文件管理器中的图库中,获取到的地址为:content://media/external/images/media/972 这种格式 另外一种的是系统文件管 ...
- Redis 安装 启动 连接 配置 重启
Linux下安装 ]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz ]# .tar.gz ]# cd redis- ]# ma ...
- CSS select样式列表-------美化列表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c#之财务系统数据库
财务收费系统补充数据库表 1. 学生表(F_Student) 名称 代码 数据类型 强制性的 ID s_ID int TRUE 学生姓名 Stu_name varchar (50) TRUE 身份证 ...
- 20150624_Andriod _web_service_匹配
using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...
- 【Unix环境编程】select、poll、epoll机制的联系与区别
在linux设计并发网络程序,主要有如下几种模型:Apache模型(Process Per Connection, PPC).TPC(Thread Per Connection)模型,select机制 ...
- 【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置
> 参考的优秀文章 Module ngx_http_proxy_module > 设置等待被代理服务器的最大响应时间 使用Nginx做反向代理时,因被代理服务器因业务确实复杂,需时较久,往 ...
- Python存取XML方法简介
<?xml version="1.0" encoding="utf-8"?> <Schools> <School Name=&qu ...
- UE4编程之C++创建一个FPS工程(一)创建模式&角色&处理输入
转自:http://blog.csdn.net/u011707076/article/details/44180951 从今天开始,我们一起来学习一下,如何使用C++将一个不带有任何初学者内容的空模板 ...
- lncRNA研究
------------------------------- Long noncoding RNAs are rarely translated in two human cell lines. ( ...