gcc与gdb使用
gcc 调试手段

gcc 调试手段
GCC提供了多种调试手段,帮助开发者定位和修复程序中的问题。
以下是一些常用的GCC调试手段:
1. 编译时加入调试信息:在编译源代码时,通过在GCC命令行中添加`-g`选项,可以生成带有调试信息的可执行文件。
这些调试信息包括源代码行号、局部变量和函数等信息,有助于在调试时更好地理解程序的执行状态。
2. 使用gdb进行调试:GCC编译的可执行文件可以使用GNU Debugger(gdb)进行调试。
通过gdb,可以设置断点、单步执行、查看变量值等操作,帮助定位问题。
在命令行中输入`gdb`命令,然后输入`run`命令即可启动程序进行调试。
3. 打印调试信息:在程序中添加打印语句是一种简单直接的调试方法。
通过打印关键变量的值、函数调用的结果等信息,可以帮助理解程序的执行流程和状态。
4. 内存检查工具:对于C/C++程序,可以使用诸如Valgrind这样的内存检查工具来检测内存泄漏、数组越界等问题。
这些工具可以帮助发现潜在的内存问题,提高程序的稳定性。
5. 日志记录:在程序中添加日志记录功能,将关键信息输出到日志文件中。
这种方法适用于跟踪程序的运行状态和异常情况,有助于定位问题。
6. 单元测试和集成测试:编写单元测试和集成测试用例,对程
序的各个模块进行测试。
通过测试用例的执行和结果分析,可以发现潜在的缺陷和问题。
这些是GCC提供的一些常用调试手段,根据具体情况选择适合的方法进行程序调试,有助于提高代码质量和开发效率。
实验二 GCC 及GDB的使用

实验二GCC 及GDB的使用一、实验目的和要求a)掌握VI编译环境。
b)掌握GCC编译命令。
c)掌握多个文件共同编译方法。
d)掌握GDB调试命令。
二、实验内容和原理(可参照课件第五章)a)在VI编辑器里编写简单的“hello,world,I am 13050141XX XXX”,利用GCC编译为可执行文件,执行,观察运行结果。
b)在VI编辑器里编写多个文件(至少两个,其中一个为主程序,一个为需要调用的子程序),为其书写头文件,共同编译为可执行文件,执行,观察运行结果。
学习书写MAKEFILE文件,编译,执行,观察结果。
c)编写循环结构的程序,利用GCC 编译(加参数-g)为可执行文件,利用GDB调试,学习GDB调试命令。
三、实验环境a)硬件:PC机b)软件:LINUX操作系统、虚拟机四、实验步骤vi hello.c i:C语言编程Esc :wq gcc hello.c gdb file a.out run a实验三交叉编译环境配置一、实验目的和要求熟悉 Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。
使用Linux 的armv4l-unknown-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。
二、实验内容a)配置网络,包括配置IP 地址、NFS 服务、防火墙。
b)安装交叉编译器c)配置超级终端,下载文件到目标机上。
三、实验设备及工具(包括软件调试工具)硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。
软件:REDHAT LINUX 9.0+超级终端+ARM-LINUX 开发环境四、实验步骤(所有的内容截图)1、虚拟机设置为桥接模式。
2、配置IP地址,设置为192.168.0.xxx参照实验指导书图1.4.1-1.4.3. 自己截图,说明3、关闭防火墙,参照实验指导书图1.4.4自己截图,说明4、打开桌面超级终端(HyperTerminal),配置COM1,115200波特率,8N1,实验箱插上电源线,网线与主机相连,串口线与主机串口1相连,开机,看bootloader程序VIVI是否自动加载,回车后进入命令提示符。
VisualStudioCode配置mingw-w64的GCCc++编译器(g++)和GD。。。

VisualStudioCode配置mingw-w64的GCCc++编译器(g++)和GD。
机器翻译Using GCC with MinGW使⽤ GCC 和 MinGWIn this tutorial, you configure Visual Studio Code to use the GCC C++ compiler (g++) and GDB debugger from to create programs that run on Windows.在本教程中,您将 Visual Studio Code 配置为使⽤来⾃ mingw-w64的 GCC c + + 编译器(g + +)和 GDB 调试器来创建在 Windows 上运⾏的程序。
After configuring VS Code, you will compile and debug a simple Hello World program in VS Code. This tutorial does not teach you about GCC, GDB, Mingw-w64, or the C++ language. For those subjects, there are many good resources available on the Web.在配置了 VS 代码之后,您将⽤ VS 代码编译和调试⼀个简单的 Hello World 程序。
本教程不教授 GCC、 GDB、 mingw-w64或 c + + 语⾔。
对于这些主题,⽹上有许多很好的资源。
If you have any problems, feel free to file an issue for this tutorial in the .如果您有任何问题,请随意将本教程的问题归档到 VS 代码⽂档存储库中。
Prerequisites 先决条件To successfully complete this tutorial, you must do the following steps:要成功完成本教程,您必须执⾏以下步骤:1. Install .安装 Visual Studio 代码。
gcc和gdb的使用 linux

漳州师范学院
实验报告
班级 11网络2班学号姓名座号 15 同组人
实验日期成绩
课程名称:操作系统
实验题目:gcc和gdb的使用
实验目的与要求1.掌握Linux操作系统下最常用的c语言编译器gcc的使用;2.掌握Linux操作系统下最常用的代码调试器gdb的使用;3.掌握调试代码的基本方法,如观察变量、设置断点等
实
验
环
境
的
配
置
PC 兼容机。
Window xp 以上操作系统
第 1 页
实验内容与具体步骤将下面的程序输入到一个文件名字为test.c的磁盘文件中,利用调试程序找出其中的错误,修改后存盘。
该程序的功能是显示一个简单的问候语,然后用反序方式将它列出。
漳州师院实验报告
实验内容与具体步骤
实验心得实验中存在的问题及解决办法:
1. 在用gdb进行调试的时候,会运用到一些比如以行号设置断点、以函数名设置断点、以条件表达式设置断点、删除断点、查看和设置变量的值、查看当前设置的断点信息等命令,通过老实讲的以及上网查询的方式找到了这些命令的使用方法。
2. 在编译第一个程序的时候,第一次出现了很多语法错误,通过自己改正了之后解决了这些错误。
3.本次实验学习了一下gcc与gdb的具体使用方法。
并亲自用gdb调试了一下程序。
gdb还是用不熟,只能以后慢慢加深体会了。
注:如果填写内容超出表格,自行添加附页。
漳州师院实验报告。
gcc和gdb

一. gcc编译器1.简介及功能GNU CC(简称为Gcc)是GNU项目中符合ANSIC 标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。
Gcc不仅功能强大,而且可以编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3 和Ada 等多种语言,而且Gcc 又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
2.Gcc 编译流程分为4个步骤:·预处理(Pre-Processing);·编译(Compiling);·汇编(Assembling);·链接(Linking)。
(1)预处理阶段在该阶段,编译器将头文件编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc 在预处理结束后停止编译过程。
(2)编译阶段Gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
(3)汇编阶段汇编阶段是把编译阶段生成的“.s”文件转成目标文件,在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。
4)链接阶段在成功编译之后,就进入了链接阶段。
在这里涉及到一个重要的概念:函数库。
函数库一般分为静态库和动态库两种。
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中。
其后缀名一般为“.a” 。
动态库与之相反,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。
动态库一般后缀名为“.so” 库。
Gcc在编译时默认使用动态库。
3格式及选项参数Gcc指令的一般格式为:Gcc [选项] 要编译的文件[选项] [目标文件](1). 总体选项3)优化选项Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。
实验3 使用gcc编译器

实验三使用gcc编译器一.实验目的1、巩固vi的使用。
2、练习用Linux下gcc编译器运行c或c++程序。
3、练习使用make工具和调试工具gdb。
4、练习编写简单的c或c++程序。
二.实验内容用vi建立C++/C程序后,学习使用gcc编译器编译执行(命令格式详见实验指导书P100),查看结果。
1. helloworld程序。
2. 判断一个年份是平年还是闰年。
3. 打印九九乘法表。
三.实验步骤1、登陆Linux系统,操作方法请参考实验二。
2、使用vi编写helloworld.cpp程序(安装了vim的同学,可以输入vimhelloworld.cpp),保存。
程序代码如下:using namespace std;#include<iostream>int main(){cout<<”hello,world!\n”;return 0;}或编写helloworld.c程序,代码如下:#include<stdio.h>int main(){printf(“hello,world!\n”);return 0;}然后,利用g++ helloworld.cpp或gcc helloworld.c指令编译执行。
(如果没有任何输出提示,恭喜你,编译执行成功。
否则,会提示出错信息,请检查语法并修改。
)最后,在命令行输入 ./a.out 查看结果。
3、make工具在应用程序的开发过程中,若每次修改源文件都需要重新输入编译命令,这种做法很烦琐而且开发效率不高。
为了能快速组织源文件进行编译,linux中提供了make工具。
Make的运行过程前,必须编写Makefile文件。
它描述了软件包中文件之间的关系,提供更新每个文件的命令。
Make实验上是根据Makefile 来进行编译的。
以helloworld.c为例,编写makefile文件:helloworld:helloworld.ogcc –o helloworld helloworld.o(开头使用Tab键空格) helloworld.o:helloworld.cgcc –o helloworld.o –c helloworld.cclean:rm –f *.o hello然后,重新编译helloworld.c,命令:gcc –g helloworld.c –o helloworld 第三步,输入命令:make4、调试工具---gdb运行gdb调试程序通常的命令格式为:gdb 程序的文件名例如: gdb helloworld启动gdb调试工具后,进入gdb的调试界面。
Linux 段错误

1执行socket文件时,出现段错误(core dumped)产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.解决方法:利用gdb逐步查找段错误:首先我们需要一个带有调试信息的可执行程序,所以我们加上―-g -rdynamic"的参数进行编译,然后用gdb调试运行这个新编译的程序,具体步骤如下:1、gcc -g -rdynamic d.c2、gdb ./a.out3、r这样就找到了出错位臵。
然后在相应位臵修改。
2linux 段错误如何调试linux下的c程序常常会因为内存访问错误等原因造成segment fault(段错误)此时如果系统core dump功能是打开的,那么将会有内存映像转储到硬盘上来,之后可以用gdb对core文件进行分析,还原系统发生段错误时刻的堆栈情况。
这对于我们发现程序bug很有帮助。
使用ulimit -a可以查看系统core文件的大小限制;使用ulimit -c [kbytes]可以设臵系统允许生成的core文件大小。
ulimit -c 0 不产生core文件ulimit -c 100 设臵core文件最大为100kulimit -c unlimited 不限制core文件大小步骤:1、当发生段错误时,我们查看ulimit -a (core file size (blocks, -c) 0)并没有文件,2、设臵:ulimit -c unlimited 不限制core文件大小3.、运行程序,发生段错误时会自动记录在core中4、test]$ ls -al core.* 在那个文件下(-rw------- 1 leconte leconte 139264 01-06 22:3 1 core.2065)5、使用gdb 运行程序和段错误记录的文件。
(est]$ gdb ./test core.2065)6、会提哪行有错。
CentOs下安装gccg++gdb的方法

CentOs下安装 gHale Waihona Puke cg++gdb的方法
Centos支持使用yum安装,安装软件一般格式为yum install .......,注意安装时要先成为root用户,且在联网的状态下。 使用yum安装gcc:yum install gcc 使用:which gcc 查看是否安装成功 使用yum安装g++:yum install gcc-c++ 使用:which g++ 查看是否安装成功 gdb安装 方法一:使用yum安装:yum install gdb 总结 以上所述是小编给大家介绍的CentOs下安装gcc/g++/gdb的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小 编会及时回复大家的。在此也非常感谢大家对网站的支持!
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GDB 概述
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许, 各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如 果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、 BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就 是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以 是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这 些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可 能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有 着图形化工具所不能完成的功能。
(gdb) disassemble func
查看运行时数据
一、程序变量
在GDB中,你可以随时查看以下三种变量的值: 1、全局变量(所有文件可见的) 2、静态全局变量(当前文件可见的) 3、局部变量(当前Scope可见的) 如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量,也就是说,如果一个全局变 量和一个函数中的局部变量同名时,如果当前停止点在函数中,用print显示出的变量的值会是函数中的局部变量的值。如果此 时你想查看全局变量的值时,你可以使用“::”操作符: file::variable function::variable 可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值: gdb) p‘f2.c’::x 当然,“::”操作符会和C++中的发生冲突,GDB能自动识别“::”是否C++的操作符,所以你不必担心在调试C++程序时会出现 异常。
生成静态库和动态库
静态库生成: ar rc libxx.a xxx.o gcc xx.c –static –Lxx –lxx –o xx 动态库生成: gcc hi.c -I./ -fPIC -shared -o libhi.so gcc mian.c -I./ -L./ -lhi -o main
编辑和搜索源代码
Edit Edit number Edit function Edit filename:number Edit filename:function Edit *address
源代码内存
你可以使用info line命令来查看源代码在内存中的地址。info line后面可以跟“行 号”,“函数名”,“文件名:行号”,“文件名:函数名”,这个命令会打印
基本gdb命令
Ctrl+c 发信号量中断当前操作 Info break:显示断点信息 Delete n:去除第几号断点 Disable n:暂停使用某个断点 Enable n:启动某个暂停的断点 Continue:继续运行
启动GDB的几种方法
1、gdb program(示例)
program 也就是你的执行文件,一般在当前目录下。 2、gdb program core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后 core dump后产生的文件。 3、gdb program 1234 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时 的进程ID。gdb会自动attach上去,并调试他。program应该在PATH 环境变量中搜索得到。
设置断点
我们用break命令来设置断点。正面有几点设置断点的方法: break function 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。 break linenum 在指定行号停住。 break +offset break -offset 在当前行号的前面或后面的offset行停住。offset为自然数。 break filename:linenum 在源文件filename的linenum行处停住。 break filename:function 在源文件filename的function函数的入口处停住。 break *address 在程序运行的内存地址处停住。 break break命令没有参数时,表示在下一条指令处停住。 break … if cond …可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示 当i为100时停住程序。 查看断点时,可使用info命令,如下所示:(注:n表示断点号) info breakpoints [n] info break [n] info watchpoints [n] 。
用gdb调试GCC程序
gdb是一个用来调试C和C++程序的常用调 试工具之一。 gdb所提供的一些功能擦: 监视程序中变量的值。 设置断点以使程序在指定的代码行上停止 执行。 逐行执行代码。 分析崩溃程序的产生的core文件
暂停 / 恢复程序运行
调试程序中,暂停程序运行是必须的,GDB可以方便地暂停 程序的运行。你可以设置程序的在哪行停住,在什么条件 下停住,在收到什么信号时停往等等。以便于你查看运行 时的变量,以及运行时的流程。 当进程被gdb停住时,你可以使用info program 来查看程 序的是否在运行,进程号,被暂停的原因。 在gdb中,我们可以有以下几种暂停方式:断点 (BreakPoint)、观察点(WatchPoint)、捕捉点 (CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue 命令。
在GDB中运行程序
在gdb中,运行程序使用r或是run命令。程序的运行,你 有可能需要设置下面三方面的事。 运行环境。
set env environmentVarname=value 设置环境变量。如:set env USER=benben show env [varname] 查看环境变量,不带varname,打印出当前所有环境变量。
工作目录。
cd 相当于shell的cd命令。 pwd 显示当前的所在目录
程序的输入输出。
使用重定向控制程序输出。如:run > outfile
调试已运行的程s查看正在运行的程序的PID(进程ID), 然后用gdb PID process-id 格式挂接正在运行的程序。 2、先用gdb 关联上源代码,并进行gdb,在gdb中用 attach process-id 命令来挂接进程的PID。并用detach来 取消挂接的进程。
出所指定的源码在运行时的内存地址,如:
(gdb) info line tst.c:func Line 5 of "tst.c" starts at address 0x8048456 and ends at 0x804845d .
还有一个命令(disassemble)你可以查看源程序的当前执行时的机器码,这个 命令会把目前内存中的指令dump出来。如下面的示例表示查看函数func的汇 编代码。
基本gdb命令
List 显示程序内容,一般10行 List 函数名:显示函数对应内容 List 行号:显示该行周围的源代码 Set listsize 行数:设置显示代码的行数 Show listsize :显示当前listsize的设置 List first,last:显示first和last之间的内容
维护停止点
Delete n:去除第几号断点 Disable n:暂停使用某个断点 Enable n:启动某个暂停的断点 clear 清除所有的已定义的停止点。 clear function 清除所有设置在函数上的停止点。 clear linenum 清除所有设置在指定行上的停止点。
二、数组
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作 符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句: int *array = (int *) malloc (len * sizeof (int)); 于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值: p *array@len @的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中,其输出结果,大 约是下面这个样子的: (gdb) p *array@len $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40} 如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。
GDB的命令概貌
在命令行中输入 gdb,然后键入help(示例) root@linux:/home/benben# gdb GNU gdb 5.1.1 Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-suse-linux". (gdb) help List of classes of commands: aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data files -- Specifying and examining files internals -- Maintenance commands obscure -- Obscure features running -- Running the program stack -- Examining the stack status -- Status inquiries support -- Support facilities tracepoints -- Tracing of program execution without stopping the program user-defined -- User-defined commands