linux C(hello world)程序调试

简介: 程序的调试(先得安装gdb工具,以root身份执行命令:sudo apt-get install gdb) 程序的调试是一个很重要的环节,windows IDE下那些强大的调试功能,Linux以什么来对比呢,当然,在我看来,无所不能的linux一样可以胜任调试工作,有过之而无不及,那就是安装开发工具后,另一个集成于linux中的工具,gdb。

程序的调试(先得安装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语言开发的开始部分,就到这里了!

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
1月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
101 6
|
2月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
216 2
|
2月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
51 2
|
14天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
24 5
|
2月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
51 10
|
2月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
2月前
|
Ubuntu Linux
内核实验(四):Qemu调试Linux内核,实现NFS挂载
本文介绍了在Qemu虚拟机中配置NFS挂载的过程,包括服务端的NFS服务器安装、配置和启动,客户端的DHCP脚本添加和开机脚本修改,以及在Qemu中挂载NFS、测试连通性和解决挂载失败的方法。
60 0
内核实验(四):Qemu调试Linux内核,实现NFS挂载
|
2月前
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
2月前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。
|
2月前
|
存储 安全 Linux
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?