如何用debug调试程序C++程序要安装gcc-debuginfo吗

使用工具1:Eclipse CDT version
可在&下载到最新的版本CDT 7.0.2
这个是一个在Eclipse基础上扩展的C,C++编译调试环境。
安装Eclipse首先要求机器上要装有JDK,可到甲骨文网站下载最新的JDK开发包
使用工具2:Cygwin
可在官方网站下载:
此工具集成了gcc g++ gdb为CDT提供编译器和调试器。make提供工程管理
安装的时注意下载的Setup.exe是一个通过网络选择性下载的安装文件。注意选择安装develop目录下的gcc g++ gdb等。
可以在搜索框搜索安装。如果安装后你在cygwin命令行中输入gcc,g++,gdb,make不显示命令存在的话就成功了。
CDT默认的工具链会关联make进行编译,关联gdb进行调试。
建立一个C++的工程写个HelloWorld试一下。
默认的HelloWorld工程。
int main(void) {
puts("Hello World!!!");
return EXIT_SUCCESS;
如果是Cannot run program "make": Launching failed
说明环境变量没有配置好。
需要设置cygwin的bin目录到path下
例如我的安装路径是:D:/cygwin/bin
这是就可以成功编译了
要运行程序需要指定可执行文件的名称,
在Run Configration选项卡中Main中。C/C++ Application
这里是helloworld.exe 注意此处很严格,文件名是大小写敏感的。
之后再点击Run就可以运行起来了。
Hello World!!!将显示在Console窗口当中。
可以运行了接下来配置调试环境。
如果调试的时候需要了错误:
Can't find resource for bundle java.util.PropertyResourceBundle...
这一因为CDT默认没有配置binnary paser
解决方法:
提示:这时最好退出360,因为调试器有远程线程注入行为,360管的太严了。
这时可以进入调试视图了吧。
这时候直接debug的话会找不到调试符号。
只能反汇编。这里要设置文件路径映射。
点击Edit Source Lookup Path
按找提示将/cygwin/....,配置到合理的绝对目录上。
比如我这里显示/cygwin/e/workspace/... 在我的电脑上实际上是E:/workspace
能对应上,Eclipse就可以找到。
同样的方法在提示你去找source的时候去配置cygwin的lib等的路径。
配置好了以后就不会再提示了。
这里HelloWorld程序的编译调试就OK了。
阅读(...) 评论()15065人阅读
编译器(1)
MinGW(1)
注:本文通过互联网收集整理。
简单的GCC用法
总的来说,gcc应该是一个编译器。但整套的gcc环境并不是由gcc构成的,它是由多个包所组成的,这些包的互相作用产生了gcc的开发环境。其中,有一些包是你开发应用程序所必备的基本包,离开这些包你将无法正常使用gcc。
&&& gcc开发环境包括如下几大包:
&&& binary&&&&&&&&&&&&&&&&&&&&&&&& 基本包&& 提供基本的汇编器,连接器等
&&& gcc&&&&&&&&&&&&&&&&&&&&&&&&&&& 基本包&& 各种语言的编译器,包括C,C++,Ada,Java等&
&&& Win32api,mingwi-runtime/glibc& 基本包&& 系统函数库&
&&& make/automake&&&&&&&&&&&&&&&&& 需要包&& 管理项目编译的程序&
&&& gdb&&&&&&&&&&&&&&&&&&&&&&&&&&& 附加包&& 调试程序&
一. 常用编译命令选项&
假设源程序文件名为test.c。
1. 无选项编译链接&
用法:#gcc test.c&
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。编译成功后可以看到生成了一个a.out的文件。在命令行输入./a.out 执行程序。./表示在当前目录,a.out为可执行程序文件名。
2. 选项 -o&
用法:#gcc test.c -o test&
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。输入./test执行程序。
3. 选项 -E &大写,注意&
用法:#gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。
4. 选项 -S &大写,注意&
用法:#gcc -S test.i&
作用:将预处理输出文件test.i汇编成test.s文件。
5. 选项 -c&
用法:#gcc -c test.s&
作用:将汇编输出文件test.s编译输出test.o文件。
6. 无选项链接&
用法:#gcc test.o -o test&
作用:将编译输出文件test.o链接成最终可执行文件test。输入./test执行程序。
7. 选项-O&
用法:#gcc -O1 test.c -o test&
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。输入./test执行程序。
二. 多源文件的编译方法
如果有多个源文件,基本上有两种编译方法:&
[假设有两个源文件为test.c和testfun.c]
1. 多个文件一起编译&
用法:#gcc testfun.c test.c -o test&
作用:将testfun.c和test.c分别编译后链接成test可执行文件。&
2. 分别编译各个源文件,之后对编译后输出的目标文件链接。&
#gcc -c testfun.c //将testfun.c编译成testfun.o&
#gcc -c test.c //将test.c编译成test.o&
#gcc& testfun.o test.o -o test //将testfun.o和test.o链接成test
以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
三. gcc的常用编译参数
&&& 同VC,TC等编译器不同,gcc其实是可以很方便的在提示符下编译程序的。gcc在提示符下编译程序,并没有如同VC那样的冗长而晦涩的编译参数。相反,却有着比VC更灵活且简短的参数。
&&& 不得不承认,不懂gcc编译参数的人,确实会损失一些gcc的强大功能。所以,我下面简单介绍一下gcc的一些基本编译参数。这里,我以C编译器为例。
&&& 注意:gcc的编译参数是区分大小写的。&
&&& 编译二进制代码&
&&& gcc -c yours.c -o yours.o&
&&& 使用这段指令,gcc将会把yours.c编译成yours.o的二进制代码。其中,yours.o就类似于VC,TC中的.obj文档。
&&& 编译最简单的小程序&
&&& gcc -o yours yours.c&
&&& 通过这条指令,gcc将会把yours.c源代码编译成名为yours的可执行程序。当然,您也可以将yours.c改成我们刚才介绍的yours.o文件。这样,gcc将使用编译刚才编译好的二进制文档来链接程序。这里,格式的特点是,-o 后面是一串文件列表,第一个参数是所编译程序的文件名,从第二个开始,就是您编译和连接该可执行程序所需要的二进制文档或者源代码。
&&& 编译时将自己的头文件目录设为默认头文件目录&
&&& gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o&
&&& 这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include &your_include.h&来导入头文件。
&&& 编译时使用自己的静态库存放目录&
&&& gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o&
&&& 这条指令将会让gcc在连接时除了在默认Lib存放目录中搜索指定的静态库以外,还会在Your_Lib_Files_Document_Path中搜索。
&&& 编译时使用静态连接库&
&&& gcc -lyour_lib -o yours yours.o&
&&& 这条指令将会让gcc在连接时把 libyour_lib.a中您所用到的函数连接到可执行程序中。此处注意,gcc所使用的静态连接库是lib*.a格式的。在连接时,只且仅需要提供*的内容就可以了。
&&& 编译时使用优化&
&&& gcc -O2 -c yours.c -o yours.o&
&&& 使用优化方式编译程序,其中除了-O2以外,还有-O3 -O1等等。他们代表不同的优化等级。最常用的,是-O2优化。当然,还有针对特殊CPU的优化,这里就不介绍了。
&&& 编译时显示所有错误和警告信息&
&&& gcc -Wall -c yours.c -o yours.o&
&&& gcc在默认情况下,将对一些如变量申请未使用这样的问题或者申请了没有给予初始值的问题忽略。但是,如果使用了-Wall参数,编辑器将列出所有的警告信息。这样,您就可以知道您的代码中有多少可能会在其他操作系统下出错的地方了。(用这个指令看看你的代码有多少地方写的不怎么合适。)
&&& 编译连接时,加入调试代码&
&&& gcc -g -o yours yours.c&
&&& 正如同VC有debug编译模式一样,gcc也有debug模式。添加了-g 参数编译的可执行程序比普通程序略为大一些,其中添加了一些调试代码。这些代码将被gdb所支持。
&&& 连接时缩小代码体积&
&&& gcc -s -o yours yours.o&
&&& 因为有人说Visual-MinGW生成的代码小,于是研究了一下它的编译参数,发现release模式的编译参数就加了这一项。貌似编译后的代码的确缩小了很多。
&&& 反汇编&
&&& gcc -S yours.c&
&&& 用这个指令能把C语言变成汇编语言,不过不是常见的Intel语法,而是AT&T语法。两者的语法有很大的区别。
&&& 获得帮助&
&&& gcc --help&
&&& 这条指令从意思上就能看出,获得gcc的帮助信息。如果您有什么特殊需要,也许这个指令能帮上点小忙。
&&& 总结:
&&& gcc的编译参数是可以组合起来的,如:
&&& gcc yours.c -o yours -Wall -s -O2
------------------------------------------------------------------------------
MinGW搭建开发环境&
&&& MinGW是Minimalistic GNU for Windows 的缩写。它是一个建立在GCC和binutils 项目上的编译器系统。和其他GCC的移植版相比,它可以说是最接近Win32的一个了。因为,MinGW几乎支持所有的Win32 API,这也是MinGW的特色之一。它所连接的程序,不需要任何第三方库就可以运行了。在某种程度上看,MinGW更像是VC的替代品。
&&& MinGW可以从上获得。
&&& 要安装MinGW有两种方案:
&&& 第一种方案:手动安装
&&& 到下载以下几个压缩包。考虑到文件的更新,此处只写出文件的主要部分,省去文件的版本和更新日期(注:带有src表示源代码)。
&&& gcc-core:C语言编译器,推荐使用最新的。&
&&& gcc-g++:C++语言编译器,版本同上。(可选)&
&&& binutils:MinGW的汇编器和连接器等基础工具。&
&&& mingw32-make:Make工具,用以管理你的项目。&
&&& gdb:MinGW调试器。&
&&& win32api:win32的API函数头文件和连接库&
&&& mingw-runtime:MinGW的运行时库
&&& 把以上的压缩包解压到一个目录中,如C:\MinGW。
&&& 注:MinGW还包括一个MSYM(Minimal SYStem)。这个工具是用来模仿Unix Shell,它可以把Unix上的命令转换成Windows命令,如果习惯Unix可以下载这个工具。
&&& 把MinGW的目录 C:\MinGW\bin 添加进%PATH%环境变量中,可以在系统属性那里永久设置,或者建一个bat文件,写入以下字符:&
&&& set Path=%PATH%;C:\MinGW\bin&
&&& 然后进入DOS运行这个bat文件即可。
&&& 最后在MS-DOS环境下运行:&
&&& gcc -v&
&&& 如果显示一段GCC的版本信息,说明你安装的MinGW能正常工作了。&
&&& 第二种方案:自动安装
&&& 到下载MinGW-x.x.x.exe。安装过程它会自动从网上下载相应的文件,并自动配置好环境。
------------------------------------------------------------------------------
MinGW的使用
这部分将给出MinGW 下gcc/g++开发程序详细例子。在讨论例子使用之前,我们需要对MinGW安装后的结果做个小小的改动。进入MinGW 的安装目录,如C:\MinGW,找到bin 目录下mingw32-make.exe,将其更名为make.exe(完成该改动后可以直接使用make来操作makefile)。
这里开始正式讨论MinGW的使用,分为5 个步骤:(假设在D:\project 下开发,后续本节中文件建立均在该目录下操作)
本节将会分别创建三个文件:cmnd.bat, makefile, main.cpp。
第一步建立 MinGW的gcc/g++的自动搜索路径BAT 文件
创建一个文本文件,输入以下方框内的内容:
set path=C:\mingw\%PATH%;
保存好后,把文件名字改为:cmnd.bat
第二步创建makefile
创建一个文本文件,输入以下方框内的内容(可从本文中拷贝粘贴):
# makefile for MinGW Hello World Test
# @copyright
CC = g++
#RM = rm -rf
MV = MOVE /Y
C++FLAGS = -g -Wno-deprecated -Wall -Werror -I.
OBJ_LIST = $(subst .cpp,.o,$(wildcard *.cpp))
TARGET = main.exe
all: depend.dep $(TARGET)
$(TARGET): $(OBJ_LIST)
$(CC) -o $(TARGET) $(OBJ_LIST) -mconsole
$(RM) *.o *.obj *.tmp *.exe *.dep *.s
depend.dep:
$(CC) -M $(C++FLAGS) $(wildcard *.cpp) & $@
-include depend.*
$(CXX) -c $(C++FLAGS) $&
$(MAKE) -C $& $(DEBUG_MAKE)
保存好后,把文件名字改为: makefile (注:没有后缀)
第三步建立 main.cpp
创建一个文本文件,输入以下方框内的内容:
#include &iostream&
int main(int argc, char* argv[])
cout && &hello world&&&
cout && &----------------------------& &&
cout && &filename=& && __FILE__ && & line=&&& __LINE__ &&
cout && &time=&&& __TIME__ && & date=&&& __DATE__ &&
cout && &funname=&&& __func__ &&
cout && &----------------------------& &&
保存好后,把文件名字改为: main.cpp
说明:main.cpp示例中的__FILE__, __LINE__, __func__等几个宏,对嵌入式软件开发的debug非常帮助。
第四步编译运行console模式
双击第一步中建立的cmnd.bat,进入command模式,输入make 回车,make自动调用makefile编译main.cpp,并且自动运行编译后的结果main.exe,输出如下结果:
D:\project &make
g++ -c -g -Wno-deprecated -Wall -Werror -I. main.cpp
g++ -o main.exe main.o -mconsole
hello world
----------------------------
filename=main.cpp line=17
time=11:19:23 date=May 1 2007
funname=main
----------------------------
第五步编译运行windows 模式
编辑main.cpp,修改为如下的代码内容:
#include &windows.h&
intWINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
MessageBox (NULL, &Hello World, My Dear&, &Hello Demo&, MB_OK);
return (0);
同时把第二步骤的makefile 一行内容修正(把-mconsole改为-mwindows)
$(CC) -o $(TARGET) $(OBJ_LIST) –mconsole
$(CC) -o $(TARGET) $(OBJ_LIST) –mwindows
运行make 如同第四步。
详细的MinGW的说明和使用,参考。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:98942次
积分:1033
积分:1033
排名:千里之外
原创:13篇
转载:21篇
(1)(1)(3)(19)(6)(4)安装gcc-c++的时候出现的如下问题,有谁帮我解释下_百度知道Linux编程(9)
在笔者工作实践中,使用gdb调试C++程序和调试C程序,他们稍有不同,下面是使用总结。
一、编译选项
-g & & & & 生成调试信息
-gstabs+ & 以stabs格式生成调试信息,并且包含仅供gdb使用的额外调试信息生成调试信息,是阻止编译器将局部变量优化的寄存器里,
& & & & & & & & & 笔者在调试C++程序时,不加这个选项,所有的变量都打印不出来,gdb提示说没有这个符号&
二、打断点&
对于C程序,代码都是函数封装,打断点很容易,但是C++代码都是类封装,而且函数还可以重载前2种打断点的方式主要用于C程序,后3种多用于C++程序
1、b funcName 即在函数入口处打断点
2、b lineNum &在某一行打断点
3、b className::funcName或者 b className::funcName(type,type) 在某个类的某个函数入口打断点,由于类的函数有重载,可以在函数名内加上参数类型
4、b fileName:lineNum & 在某个源文件的某一行打断点
5、b fileName:funcName &在某个源文件的某个函数入口打断点
三、常用命令
1、finish & & & & & 一直执行到当前函数返回,即跳出当前函数
2、r & & & & & & & & & 运行程序(run)
3、n & & & & & & & & &执行下一条语句(next 不会进入函数内部)
4、s & & & & & & & & &执行下一条语句(step 会进入函数内部)
5、回车键 & & & &重复执行上一条命令
6、c & & & & & & & & &继续执行直到下一个断点(continue)
7、p & & & & & & & & 打印变量的值(print)
8、bt & & & & & & & &查看函数堆栈(backtrce)
9、q & & & & & & & & 退出gdb调试(quit)
10、info break & & & 查看断点信息
11、delete breakNum &删除某个断点
四、bt命令调试段错误
在Linux下编程,一不下心就会出现段错误(Segmentation fault),关于段错误的产生,笔者目前只是大概知道是内存的非法访问造成的,比如访问空指针,指针越界访问都会造成段错误,关于本质原因,还需要研究Linux内存管理、进程空间等知识,这方面有待后续深入研究。下面演示如何利用 core文件定位程序段错误。
测试代码:segfault.c
/*************************************************************************
& File Name: segfault.c
& Author: KentZhang
& Created Time: Thu 27 Aug :37 PM CST
************************************************************************/
#include&stdio.h&
void test_seg_fault()
printf(&test_seg_fault() start.\n&);
char *p=NULL;
*p = 'a';
printf(&test_seg_fault() end.\n&);
void main()
test_seg_fault();
1、编译程序生成可执行文件
gcc -g segfault.c -o segfault&&
2、生成Core文件
执行命令:ulimit &-c &unlimited
执行程序:./segfault
& & &[root@localhost MyDir]# ls
& & & & & & &core.8450 &segfault &segfault.c
3、启动gdb,打印栈信息
执行命令:gdb &./segfault &./core.8450
然后执行:bt
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Core was generated by `./segfault'.
Program terminated with signal 11, Segmentation fault.
#0 &0x04e2 in test_seg_fault () at segfault.c:13
13 *p = 'a';
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.x86_64
#0 &0x04e2 in test_seg_fault () at segfault.c:13
#1 &0x04ff in main () at segfault.c:19
4、分析结果
& & & & & & & 本实例中,程序崩溃后,保留了2层栈的信息,#0 栈,是程序发生崩溃时所在的栈,即是在test_seg_fault函数内发生崩溃,在segfault.c文件的第13行,这一句发生段错误,到此定位完成。其实函数每调用一层,就会有一层栈的信息,最上面的总是 #0 号栈,即程序当前所在的栈,这很符合压栈操作。
由于笔者的水平有限,出错在所难免,恳请读者拍砖指正,谢谢阅读。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2941次
排名:千里之外
原创:17篇调试C++程序要安装gcc-debuginfo吗_百度知道

我要回帖

更多关于 怎么用debug调试程序 的文章

 

随机推荐