Linux环境下的GCC编译器与GDB调试工具介绍
假如现在我们有如下代码需要编译运行和调试。文件名为:test.c
#include <stdio.h>
int main()
{
int day, month, year, sum, leap;
printf("input year month day:\n");
scanf("%d%d%d",&year,&month,&day);
switch(month)
{
case 1: sum = 0; break;
case 2: sum = 31; break;
case 3: sum = 59; break;
case 4: sum = 90; break; //case 5: sum += 90; break;
//case 6: sum += 90; break;
//case 7: sum += 90; break;
//case 8: sum += 90; break;
}
sum += day;
if(year%400==0 || (year%4==0 && year%100!=0))
{
leap = 1; }
else{
leap = 0;
}
if(leap == 1 && month>2)
{
sum++;
}
printf("it is the &dth day!\n",sum);
return 0;
}
1、GCC编译器介绍
在使用GCC编译器时,需要给出一些列的调用参数,其基本的调用格式如下:
gcc [options] [filenames]
其中options就是GCC所需的参数,filenames便是要编译的文件名
options 的常用的参数有:
-C :只编译,不链接生成可执行文件。输入.c等源代码文件,输出.o为后缀的目标文件。通常用于编译不包含主程序的子程序文件。
-o output_filename:确定输出文件的名称为output_filename,并且这个名称不能与源文件同名。默认情况下为:a.out
-g :
产生符号调试工具所必须的符号信息。若想对源代码进行调试,就需要加入该选项
-O:对程序进行优化编译、链接。
-O2:比-O更好的优化编译、链接,但整个编译和链接过程会比较慢。
其中比较常用的编译代码的命令:(-Wall能够使得GCC产生尽可能多的警告信息)
gcc -Wall test.c -o test
运行代码的命令为:(test是上面生成的目标文件test)
./test
2、GDB调试工具介绍
1) 在使用GDB编译程序时必须要让GDB可以获得程序的信息,故而需要在编译时加入参数-g,编译命令如下:
gcc -g -o可执行文件名 源文件名
如:gcc -g -o test test.c
2) 在生成带有调试信息的可执行文件后,可使用如下命令加载可执行程序到GDB调试工具中
gdb 可执行文件
如:gdb test
当然也可以先输入gdb命令,然后在输入命令:
file 可执行文件名
如:file test
3)
在进入调试工具GDB后,可以使用break命令设置断点,如:
break line5 //运行到第五行停止
break function1 //运行到函数function1后停止
break line/function if xx
//符合if条件时,运行到指定位置
4) 在程序运行到第一个断点停止后,可以对接下来的代码进行单步跟踪,使用命令:
step
当然也可以使用continue命令继续运行程序,使得程序运行至下一个断点或运行完成。
5) 在逐步追踪的过程中,可以使用如下命令查看变量值:
print 变量名/表达式
print $ //表示输出当前序号的前一个序号的值
print $$ //表示输出当前序号向前第二个序号
假如当前序号为3,则print $
表示输出序号为2中的数据,print $$ 输出序号为1中的数据。
print还可用户给变量赋值和打印连续的空间
print var = 5 //给变量var赋值为5
print 开始表达式@连续空间大小
//如printarr[2]@5
6) display用户显示表达式的值。与print不同的是程序每步运行都会显示表达式的值。
若想使display暂时不能显示可以使用命令:
disable display
恢复display命令为:
enable display
直接删除display命令为:
delete display [显示数据的序号]
当设置的程序断点不再需要暂停运行时,可以使用delete和clear命令清除断点,二者的区别在于:
delete 断点编号
clear 断点所在行号
显示代码使用命令list:
list[+] :显示当前行后面的代码
list-:显示当前行前面的代码
list n: 显示程序第n行周围的代码
list function: 显示函数名为function的功能函数代码
list first, last: 显示第first行代码到last行代码
list , last:显示从当前行到last行之间的代码
list filename:n :显示文件filename的第n行代码
list filename:function:显示文件名为filename中的函数名为function的函数代码
set listsize count :设置list显示的行数为count
show listsize: 查看当前源代码的显示行数
参考文献:
明日科技,linux C 从入门到精通, 清华大学出版社, 2012.12
Linux环境下的GCC编译器与GDB调试工具介绍的更多相关文章
- Linux环境下使用gcc编译,gdb反汇编C语言程序
使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64 我把过程截图如下. 首先是hello world程序: 备注: ...
- Linux环境下GNU, GCC, G++编译器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012823258/article/details/36890125 一.GNU GNU是" ...
- Linux环境下GNU, GCC, G++编译器(转)
一,GNU GNU是“GNU 's Not Unix”的递归缩写, Stallman宣布GNU应当发音为Guh-NOO(革奴)以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new ...
- 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案
基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...
- linux环境下学习使用pro*c/c++工具
1.proc是oracle用来预编译嵌入SQL语句的c程序. 2.如何使用proc工具 在Linux环境下,首先确保gcc编译器正常使用,安装oracle数据库或者客户端,一般就会默认安装pro*c/ ...
- Linux环境下段错误的产生原因及调试方法小结(转)
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...
- Linux环境下段错误的产生原因及调试方法小结
转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...
- 【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结
本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...
- 多线程编程之Linux环境下的多线程(一)
一.Linux环境下的线程 相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型.Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程 ...
随机推荐
- DP CF 319 div1B
http://codeforces.com/contest/319/problem/B 题目大意: 有删除操作,每次都删除数组右边比自己小的.且紧挨着自己的数字.问最小需要删除几次. 思路: 我们定义 ...
- git 使用系列(一)—— git stash 的使用
1. git 放弃本地修改 git checkout . #本地所有修改的.没有的提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面.可用git stash p ...
- ural1097 Square Country 2
Square Country 2 Time limit: 1.0 secondMemory limit: 64 MB The Square Parliament of the Square count ...
- (转)MATLAB入门教程
MATLAB入门教程 1.MATLAB的基本知识 1-1.基本运算与函数 在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可.例如: ...
- 集合-字典(Lookup/SortedDictionary)
Lookup<TKey, TElement>非常类似于Dictionary<TKey, TValue>,但是把键映射在一个值集上. 必须调用ToLookup方法创建Lookup ...
- WebDriver(Selenium2) 处理可能存在的JS弹出框
http://uniquepig.iteye.com/blog/1703103 在自动化测试过程中,有些情况下我们会遇到一些潜在的Javascript弹出框.(即某些条件下才会出现,不是固定出现),然 ...
- STM32开发指南-跑马灯实验
简单对I/O口的控制,主要通过对寄存器的读写控制.主要通过I/O的寄存器来控制:1. 控制I/O的方向2. 控制I/O的输出电平或上下来电阻3. 存储I/O口当前的输入状态(高低电平) 对使用LED灯 ...
- 找礼物(find)
找礼物(find) 题目描述 新年到了,你的好友和你(共K个人)的周围满是礼物,你让你的好友先拿,但是每个人只能拿当前离自己最近的礼物[当然如果有并列的多个礼物离你的距离相等(精确到小数点后四位,所有 ...
- [Big Data]hadoop分布式系统在Linux系统安装
待完善 Hadoop2.6.0部署与应用 一. 环境准备 硬件:3台虚拟机 内存:至少512MB 硬盘:至少20G 操作系统:rhel6.4 64位 最小化安装 主机名 IP(局域网) 描述 ...
- 安卓 Android题目大全
安卓001个人事务管理系统(单端) 安卓002手机订餐系统 安卓003无线点菜 安卓004酒店房间预定系统 安卓005个人相册管理系统(单端) 安卓006计算器(单端) 安卓007英语学习(单端) ...