Linux下C语言的调试 - gdb
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提供了设置断点, 单步跟踪等的图形界面, 使调试起来直观易用. 但Linux用户可能要生闷气了 O:-) : 难道我们Linux程序员就只能使用原始的调试方法, 在代码中加入printf信息吗?难道Linux下就没有好的C语言调试工具吗?
当然不是了. GNU早就组织开发了一套C语言编译器(Gcc)和调试工具(Gdb). Gdb虽然没有图形化的友好界面, 但是它强大的功能也足以与微软的VC工具相媲美, 给Linux程序员带来了福音. 下面通过一个简单的例子, 演示一下Gdb的使用流程:
示例文件 demo.c 的源代码如下:
#include <stdio.h>
int sum(int, int);
int
main()
{
int result;
int a = 1, b = 2;
result = sum(a, b);
printf("%d + %d = %d\n", a, b, result);
return 0;
}
int
sum(int a, int b)
{
return a + b;
}
编译源文件, 生成可执行文件
$ gcc -g -Wall -o demo demo.c
虽然这段程序没有错误, 但调试完全正确的程序可以更加了解Gdb的使用流程. 接下来就启动Gdb进行调试.
注意:
- Gdb进行调试的是可执行文件, 而不是”.c”源文件, 因此, 需要先通过Gcc编译生成可执行文件才能用Gdb进行调试.
- 一定要加上选项”-g”, 这样编译出的可执行代码中才包含调试信息, 否则Gdb无法载入该可执行文件.
- 不能使用 -O2选项对可执行文件进行优化, 因为优化之后可执行文件里的符号表信息将被删除, 这样Gdb就无法找到使可执行文件与源文件之间的关联了, 也就不能调试了.
(1) 启动Gdb
$ gdb demo GNU gdb (GDB) 7.0-debian Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/wangsheng/tmp/demo/gdb/demo...done.
可以看出, 在Gdb的启动画面中指出了Gdb的版本号, 使用的库文件等头信息, 接下来就进入了由”(gdb)”开头的命令行界面了.
(2) 查看源文件
在Gdb中键入”l”(list的缩写)可以查看所载入的文件, 如下所示:
(gdb) l
1 #include
2
3 int sum(int, int);
4
5 int
6 main()
7 {
8 int result;
9 int a = 1, b = 2;
10 result = sum(a, b);
(gdb) l
11 printf("%d + %d = %d\n", a, b, result);
12 return 0;
13 }
14
15 int
16 sum(int a, int b)
17 {
18 return a + b;
19 }
(gdb) l
Line number 20 out of range; demo.c has 19 lines.
可以看出, Gdb列出的源代码中明确地给出了对应的行号, 这样就可以大大地方便代码的定位.
(3) 设置断点
设置断点是调试程序中一个非常重要的手段, 它可以使程序到一定位置暂停运行. 因此,可以在该位置方便地查看变量的值, 堆栈情况等, 从而找出代码的症结所在.
在Gdb中设置断点非常简单, 只需在”b”后加入对应的行号即可(这是最常用的方式). 如下所示:
(gdb) b 9 Breakpoint 2 at 0x4004f4: file demo.c, line 9.
注意: 该断点的作用是当程序运行到第 9 行时暂停(第 8 行执行完毕, 第 9 行未执行)
(4) 查看断点信息
(gdb) info b Num Type Disp Enb Address What 2 breakpoint keep y 0x00000000004004f4 in main at demo.c:9
(5) 运行代码
接下来就可运行代码了, Gdb默认从首行开始运行代码, 可键入”r”(run的缩写)即可. 若想从程序中指定的行开始运行, 可在r后面加上行号.
(gdb) r Starting program: /home/wangsheng/tmp/demo/gdb/demo Breakpoint 2, main () at demo.c:9 9 int a = 1, b = 2;
可以看到程序运行到断点处就停止了.
(6) 查看变量值
键入p(print的缩写)+变量名即可查看该变量在此时的值
(gdb) p a $1 = 1 (gdb) p b $2 = 2 (gdb) p result $3 = 32767
注意: 这里之所以result是一个莫名其妙的值, 是因为声明result是没有初始化, 其值是不固定的。
(7) 单步执行
单步运行可以使用n(next的缩写)或者s(step的缩写), 它们之间的区别在于: 若有函数调用的时候, s会进入该函数而n不会. 因此, s就类似于VC等工具中的”step in”, n就类似于VC等工具中的”step over”.
如果使用n命令显示如下:
(gdb) n 10 result = sum(a, b);
下面使用 s 命令,跟踪进入 sum 函数:
(gdb) s sum (a=1, b=2) at demo.c:18 18 return a + b;
可以看出执行 s 命令时进入了sum函数内部, 如果用 n 命令则跳过函数的调用部分
(8) 恢复程序运行
在查看变量值以及堆栈之后, 就可以使用命令c(continue)恢复程序的正常运行了. 这时, 它会把剩余还未执行的程序执行完, 并显示剩余程序的执行结果.
(gdb) c Continuing. 1 + 2 = 3 Program exited normally.
可以看出, 程序在运行完后退出, 之后程序处于”停止状态”.
说明: 在Gdb中, 程序的运行状态有”运行”,”暂停”和”停止”3种. 其中”暂停”状态是程序遇到了断点或者观察点, 程序暂时停止运行, 而此时函数的地址, 函数参数, 函数内的局部变量都会被压入”栈(Stack)中. 故在这种状态下可以查看函数的变量值等各种属性. 但在函数处于”停止”状态之后, “栈”就会自动撤销, 它也就无法查看各种信息了
关于Gdb的更多命令, 你可以在启用Gdb后, 输入help命令查看.
Linux下C语言的调试 - gdb的更多相关文章
- Linux下C语言的调试--转
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- Linux下C语言的调试
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- [转] linux下的c/c++调试器gdb
PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...
- linux下的c/c++调试器gdb
Reference: http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLi ...
- linux 下C语言学习路线
UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- Unix和Linux下C语言学习指南
转自:http://www.linuxdiyf.com/viewarticle.php?id=174074 Unix和Linux下C语言学习指南 引言 尽管 C 语言问世已近 30 年,但它的魅力仍未 ...
- Linux下C语言编程基础学习记录
VIM的基本使用 LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...
随机推荐
- Android样式(style)和主题(theme)
样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字体颜色.字号.背景色等许多属性. 样式是在与指定布局的 XML 不同的 XML 资源中进行定义. Andro ...
- Android 多窗口详解
多窗口支持 Android N 添加了对同时显示多个应用窗口的支持. 在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示. 在电视设备上,应用可以使用"画中 ...
- Linux 高性能服务器编程——TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一 ...
- Oracle EBS各个模块日志收集的方法
MSCA(Mobile Supply Chain Application)日志的收集 Reference Note:338291.1 - Howto Enable WMS / MSCA Logging ...
- windows平台下 c/c++进行http通信的教训
由于需要使用c++开发一个桌面应用软件,需要用到http请求进行通讯,也是本人第一次进行网络相关的开发工作,遇到了不少坑. 由于是在windows下开发和使用的应用软件,自然而然想到了调用Window ...
- Android动态换肤(三、安装主题apk方式)
相比之前免安装的方式,这种方法需要用户下载并安装皮肤apk,程序写起来比免安装的要简单很多,像很多系统主题就是通过这种方式实现的. 这种方式的思路是,从所有已安装的应用程序中遍历出皮肤程序(根据特定包 ...
- 自定义AlertDialog(仿微信)
安卓自定义AlertDialog,原理很简单: AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).create(); di ...
- 算法之路(二)呈现O(logN)型的三个算法
典型时间复杂度 我们知道算法的执行效率,可以从它的时间复杂度来推算出一二.而典型的时间复杂度有哪些类型呢? 由上图,可以看出,除了常数时间复杂度外,logN型的算法效率是最高的.今天就介绍三种非常ea ...
- 1085. Perfect Sequence (25) -二分查找
题目如下: Given a sequence of positive integers and another positive integer p. The sequence is said to ...
- Handler,MessageQueue Loop 和Message的原理解析
先介绍和handler一起工作的几个组件 Handler的方法介绍 代码示例 package liu.peng.weather; import java.util.Timer; import java ...