linux C(hello world)程序调试
程序的调试(先得安装gdb工具,以root身份执行命令:sudo apt-get install gdb)
程序的调试是一个很重要的环节,windows IDE下那些强大的调试功能,Linux以什么来对比呢,当然,在我看来,无所不能的linux一样可以胜任调试工作,有过之而无不及,那就是安装开发工具后,另一个集成于linux中的工具,gdb。
它是一款由GNU组织开发并发布的UNIX/Linux下的程序调试工具,虽然它没有图形化的友好界面,但是它功能异常强大,足以和其他一些商业化的IDE环境相媲美。
这时要说的是,调试的对像是可执行文件,而不是以".c"结尾的源代码文件,也就是说,源码文件,需要经过gcc编译之后生成哥执行文件才能用gdb调试。
下面就来介绍它的使用,像上面一样,我们参照一个源程序:
[bruce@server1 programs]$ vim smallest.c
//find the minimal between 2 INT Number
#include <stdio.h>
int min(int x, int y);
int main()
{
int num1,num2,min_num;
printf("Please Input the first Number:\n");
scanf("%d",&num1);
printf("Please Input the second Number:\n");
scanf("%d",&num2);
min_num=min(num1,num2);
printf("The minimal one is %d\n", min_num);
}
int min(int a, int b)
{
if(a<b)
return a;
else
return b;
}
~
程序已经写在了上面,下面我们就来看一下如何产生带有调试信息的编译文件,这里我们要使用gcc的-g参数,用于在编译文件中加入一些调试信息。
[bruce@server1 programs]$ gcc -g smallest.c -o smallest
[bruce@server1 programs]$ ls
hello_world hello_world.c smallest smallest.c
从
上面我们可以看出,有一个smallest产生出来,如果你想验证加上参数g后的变化,那么你可以不加g编译一次,然后比较其大小,你会发现,加上g后,
产生的编译文件体积也会增加,所以在我们做软件开发时,加入调试信息应该在初期设计时,后期时,就应用去掉这些调试信息,当然如果想保留软件自身的调试功
能,就要保留了。
言归正传。
使用gdb命令运行编译文件时,就可以看到如下信息,像其他的工具一样带有一些说明文字,包含一些版权、版本及其他说明,最后的(gdb)就是其环境提示符,类似于shell提示符,用于提醒用户,在此后面输入命令。
[bruce@server1 programs]$ gdb smallest
GNU gdb Fedora (6.8-27.el5)
Copyright (C) 2008 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 "i386-redhat-linux-gnu"...
(gdb)
下面来说一些常用的gdb调试命令
list 或是l 用于列出源程序
每打入一次list或是l将显示10行源代码,或是指定列出的行号来查看源程序 “list 行号”
使用此参数时,要确保源程序没有被移除或移动位置,否则无法查看。
break/b 设置断点,可指定断点行号,或是函数名等。
info break 显示断点信息
run 运行程序
print 查看程序运行时对应表达式的和变量的值
next 单步运行程序,但不进入函数调用
step 单步运行程序,且进行函数调用
continue 继续执行函数,直至函数结束或是下一个断点
下面以smallest.c程序来挨个讲解gdb这几个常用命令的用法
----- list/l, 如下示例
[bruce@server1 programs]$ gdb smallest
GNU gdb Fedora (6.8-27.el5)
Copyright (C) 2008 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 "i386-redhat-linux-gnu"...
(gdb) l
1 //find the minimal between 2 INT Number
2 #include <stdio.h>
3 int min(int x, int y);
4 int main()
5 {
6 int num1,num2,min_num;
7 printf("Please Input the first Number:\n");
8 scanf("%d",&num1);
9 printf("Please Input the second Number:\n");
10 scanf("%d",&num2);
(gdb) list 12
7 printf("Please Input the first Number:\n");
8 scanf("%d",&num1);
9 printf("Please Input the second Number:\n");
10 scanf("%d",&num2);
11 min_num=min(num1,num2);
12 printf("The minimal one is %d\n", min_num);
13 }
14
15 int min(int a, int b)
16 {
(gdb)
大家可以看到它list/l的功能了吧,非常的简单,适合于手工检查程序语法错误,多个逗号,少个分号的情况,也就可以从这看得到了,当然这种错误,gcc也会告诉你的。
-----break/b,设置数点,如下:
(gdb) b 12
Breakpoint 1 at 0x8048448: file smallest.c, line 12.
(gdb) break min
Breakpoint 2 at 0x804846a: file smallest.c, line 17.
(gdb)
然后我们再看下一个命令
-----info break/b 显示断点信息
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048448 in main at smallest.c:12
2 breakpoint keep y 0x0804846a in min at smallest.c:17
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048448 in main at smallest.c:12
2 breakpoint keep y 0x0804846a in min at smallest.c:17
(gdb)
我们从上面显示可以看出,info break打印出了,我们先前设置好的两个断点,一个是在main函数的第12行,另外一个是在min函数。
下面就可以来运行程序了
-----run/r, 运行程序。
可以打入一个r,也可以输全run来运行程序:
(gdb) r
Starting program: /home/bruce/programs/smallest
Please Input the first Number:
12
Please Input the second Number:
14
Breakpoint 2, min (a=12, b=14) at smallest.c:17
17 if(a<b)
(gdb)
可以看到,停在了我们行鐩设置的断点min函数处。
下面我们来分步执行函数,
-----step,单步执行
示例是接着上面的例子继续执行的
Breakpoint 2, min (a=12, b=14) at smallest.c:17
17 if(a<b)
(gdb) step
18 return a;
(gdb) step
21 }
(gdb) step
Breakpoint 1, main () at smallest.c:12
12 printf("The minimal one is %d\n", min_num);
(gdb) step
The minimal one is 12
13 }
(gdb)
可以看到,执行step时,是按照顺序一步一步执行的,并且在min函数的断点处进入了函数体执行,直至结束,当然我们也可以换成next来执行,只不过next不进入函数体内部,把函数当成一个执行步骤来执行。
以上就是几个常用的gdb内部命令了,有一个地方需要提一下的是,当我们在执行到断点时,为了方便测试,我们可以在这个地方为已定义的变量赋值,只需在gdb提示符下输入: set 变量名=值
然后打入continue继续执行就可以了。
这篇文章介绍了linux下编辑,编译和调试程序的基本方法,使用的是vim/vi、gcc以及gdb的组合来进行c程序设计,其中有更多的玄妙之处,期待着大家在使用的时候去发现,本文仅是介绍一下概况,供参考。
OK,关于linux C语言开发的开始部分,就到这里了!
linux C(hello world)程序调试的更多相关文章
- Linux Bash命令关于程序调试详解
转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...
- Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)
在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C+ ...
- Linux gcc和gdb程序调试用法 {转}
gcc一般调试格式: gcc -Wall -o test test.c // -wall 显示程序错误详细信息 gcc -v // 显示gcc的版本 gcc -o{1,2,3} t ...
- Linux上程序调试的基石(2)--GDB
3. GDB的实现 GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序.可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况.它的实现也是基于ptrace系统调用来完成的. ...
- 嵌入式linux应用程序调试方法
嵌入式linux应用程序调试方法 四 内存工具 五 C/C++代码覆盖.性能profiling工具 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来 ...
- Linux Shell 程序调试
Linux Shell 程序调试 Shell程序的调试是通过运行程序时加入相关调试选项或在脚本程序中加入相关语句,让shell程序在执行过程中显示出一些可供参考的“调试信息”.当然,用户也可以在she ...
- 20175215 2018-2019-2 第一周Linux虚拟机环境调试及java程序调试学习总结
一.Linux虚拟机的java环境调试 之前直接在终端中使用export直接配置java的运行环境,导致每次终端被重启的时候都要重新配置java的运行环境,直到看到老师的博客Intellj IDEA ...
- Xdebug开源PHP程序调试器
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. 本文为大家讲解的是在linux下xdebug的安装和配置方法,感兴趣的同学参考下 ...
- 程序调试手段之gdb, vxworks shell
调试一个程序主要用到的功能: 启动程序 设置函数断点 设置数据断点 单步执行 查看内存值 修改内存值 linux下的gdb,和vxworks下的shell 虽然使用方式和调试命令略有不同,但是都能满足 ...
随机推荐
- c++中实现委托
成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(clo ...
- MFC中GetPrivateProfileString相关函数
项目中用到了这个函数,所以了解了一下,参考了一些博客: http://blog.sina.com.cn/s/blog_a599b5960101tsbk.html http://blog.csdn.ne ...
- 2013年19个最棒的HTML5网站模板免费下载
上次我们整理了14个HTML5奉献给大家下载了,今天我再给大家整理了19个2013最新的HTML5模板供有需要的朋友下载使用,它们涉及不同的行业的模板需求,支持手机设备,十分精美! 1. Affini ...
- 使用JavaMail API发送邮件
发送邮件是很常用的功能,注册验证,找回密码,到货通知,欠费提醒等,都可以通过邮件来提醒. Java中发送邮件需要使用javax.mail.jar包,读者可以上网搜索或去官方下载,下载地址为: 下面贴上 ...
- Python:列表,元组
一.列表 和字符串一样,列表也是序列类型,因此可以通过下标或者切片操作访问一个或者多个元素.但是,不一样的,列表是容器类型,是可以进行修改.更新的,即当我们进行修改列表元素,加入元素等操作的时候,是对 ...
- Maven异常: No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK解决(能力工场小马哥)
问题描述: No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JD ...
- 轻松学习Linux之AWK使用初步
AWK最初是Unix平台上一种可以对文本进行逐行处理的编程语言,它来源于3个创作者的名字:Aho.(Peter)Weinberg和(Brain)Kernighan. 现在广泛应用于Linux,他与se ...
- Netbeans Platform 工程,免安装JDK
使用Netbeans 6.8 创建了一个Netbeans Platform 工程,以Zip形式发布后, 按照以下操作,可 以在客户端免安装JDK: 1. 从已安装JDK的计算机中,提取JDK:eg. ...
- git 和 svn的区别(转)
英文原文:5 Fundamental differences between GIT & SVN,编译:外刊IT评论 如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机 ...
- A - Oulipo
A - Oulipo Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...