创建一个C++源文件,在该源文件中如何完成设置delphi 断点调试,跟踪调试??急求~~~~~~~~~~

C++编程中的调试技巧
在师兄的QQ空间中看到的,觉得非常有用,先收录一下:
1.调试标记
适用预处理#define定义一个或多个调试标记,在代码中把调试部分使用#ifdef 和#endif
进行管理。当程序最终调试完成后,只需要使用#undef标记,调试代码就会消失。常用的调试标记为DEBUG, 语句序列:
&& #define DEBUG
&& #ifdef DEBUG
2.运行期间调试标记
在程序运行期间打开和关闭调试标记。通过设置一个调试bool标记可以实现。这对命令行运行的程序更为方便。
& 例如下面代码
#include&iostream&
& #include
bool debug =
int main(int argc,char*argv[])
&& for(int
i=0;i&i++)
if(string(argv[i])==“--debug=on“)
&&&&&&&&&&&&&&&
&& while(go)
&& if(debug)
&&& 调试代码
3.把变量和表达式转换成字符串
可是使用字符串运算符来实现转换输出定义
#define PR(x)
cout&&#x”=”&&x&&''''\n''''
4.c语言的assert()
该宏在&assert&中,,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言不为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止。
#include& assert&
int main()
&& int i=100;
assert(i!=100); //Fails
当调试完毕后在#include&assert&前加入#define
NDEBUG即可消除红产生的代码
C++代码和调试
本部分教程主要介绍了良好的C++代码风格、如何书写安全的代码以及在Visual
C++环境下的程序调试技术,这些内容对于新员工从学生成长为真正的程序员,逐步参与实际项目的开发工作,以及阅读第三方代码非常重要。
1 规范易懂的代码
现阶段软件开发,都要依靠团队的合作。程序员不再是个人英雄主义的代名词,程序员一方面要依赖大量其他程序员完成的代码,一方面又提供大量代码给其他人使用,代码实际上具备了两个要素:首先是可靠的提供某种功能,其次是清楚地表达作者的思想。任何交流都必须有一定的规范才能进行,体现在代码中就是规范易懂。另外,规范易懂的代码才是可重复使用的,规范的代码具有更长的寿命,具有更好的可维护性,也更方便后期的扩展。
1.1 好代码的几个特征
怎么样的代码才算规范易懂,体现在细节上会有无数的争论,实际上无论风格和习惯如何,好的代码具有几个共同的特征:
良好的命名:好的变量名和函数名,让阅读代码的人马上就知道该变量或者函数的作用,很容易就能理解程序的大概结构和功能。程序员有必要理解匈牙利命名法。
一致性:一致性带来更好的程序,一致的代码缩进风格能够显示出代码的结构,采用何种缩进风格并不重要,实际上,特定的代码风格远没有一致的使用它们重要。
注释:注释是帮助程序读者的一种手段,程序作者也是未来的程序读者之一。最好的注释是简洁地点明程序的突出特征,或是提供一种概观,帮助别人理解程序;但如果注释只是说明代码已经讲明的事情,或者与代码矛盾,或者以精心编排的形式迷惑干扰读者,那就是帮了倒忙。
1.2 养成好习惯
前面已经提过,特定的代码风格远没有一致的使用他们重要,所以,把过多的精力放到A or
B的选择上是浪费时间,你要做的是坚持。如何书写规范易懂的代码,如何养成良好的习惯,下面是一些提示。
1. 按照匈牙利命名法给变量和函数命名。
2. 遵循国际流行的代码风格。
3. 写代码的同时就遵循你的命名规范和书写风格,千万不能事后补救。
4. 利用工具(Parasoft C++ Test)检查你的代码,评估一下自己形成良好的习惯没有。
5. 坚持不懈直到养成习惯。
2 编写安全可靠的代码
在大型应用软件系统中,各个代码片段共同构成完整的系统,代码间的交互非常频繁,程序崩溃往往并不在错误发生的时候就发生,而是延迟了一段时间,经过数个函数之间的中转后才发生,此时定位和查找错误非常费时费力,如何才能及时反映程序中的错误,如何在代码中避免一些幼稚的语义错误呢?一个函数往往会被其他程序员拿来使用,但是他怎么能够正确的使用其他人编写的函数呢?这部分内容能够(部分)帮助解决这些问题。
2.1 契约编程
契约编程(Design by Contract)的思想在C++圣经级的著作,C++之父Bjarne
Stroustrup的《C++程序设计语言》中略微提到过,OO领域的圣经级著作《面向对象软件构造》以大篇幅阐释了契约编程,现在越来越多的软件开发人员认识到契约编程的重要性,并逐步地在实际工作中采用契约编程。
对契约编程简单的解释是:对实现的代码块(函数、类)通过规定调用条件(约束)和输出结果,在功能的实现者和调用者之间定义契约。
具体到我们的工作,开发人员应该对完成的每个函数和类,定义契约。契约编程看似平淡无奇,对程序开发没有什么具体的帮助,实际上,契约编程在开发阶段就能够最大程度的保证软件的可靠性和安全性。
在实际工作中,每当你需要使用其他程序员提供的模块,你并不知道如何调用,也不知道你传入的参数是否合法,有时候对于功能模块的处理结果也不敢相信。这些本来应该很明显的信息因为模块提供者没有显式的提供,造成了调用者只能忐忑不安的摸着石头过河,浪费了大量时间,而且为了让自己的代码更安全可靠,在代码中做了大量的判断和假设,造成代码结构的破坏和执行效率的损失,最后,调用者依旧不能确保自己的调用是正确的。
而契约编程通过严格规定函数(或类)的行为,在功能提供者和调用者之间明确了相互的权利和义务,避免了上述情况的发生,保证了代码质量和软件质量。
2.2 主动调试
主动调试指在写代码的时候,通过加入适量的调试代码,帮助我们在软件错误发生的时候迅速弹出消息框,告知开发人员错误发生地点,并中止程序。这些调试代码只在Debug版中有效,当经过充分测试,发布Release版程序的时候,这些调试代码自动失效。
主动调试和契约编程相辅相成,共同保证软件开发的质量。契约编程相当于经济生活中签订的各种合同,而主动调试相当于某方不遵守合同时采取的法律惩罚措施。
各种开发语言和开发工具都提供这些调试语句,标准C++提供了assert函数,MFC提供了ASSERT调试宏帮助我们进行主动调试,在实际工作中,建议统一使用MFC的ASSERT调试宏。
2.2.1 参数检查
对于编写的函数,除了明确的指定契约外,在函数开始处应该对传入的参数进行检查,确保非法参数传入时立即报告错误信息。例如:
BOOL GetPathItem ( int i , LPTSTR szItem , int iLen )
ASSERT ( i & 0 ) ;
ASSERT ( NULL != szItem ) ;
ASSERT ( ( iLen & 0 )
&& ( iLen & MAX_PATH
ASSERT ( FALSE == IsBadWriteStringPtr ( szItem , iLen ) ) ;
对指针的检查尤其要注意,通常程序员会这样进行检查:
// An example of checking only a part of the error condition
BOOL EnumerateListItems ( PFNELCALLBACK pfnCallback )
ASSERT ( NULL != pfnCallback ) ;
这样的检查只能够排除指针为空的情况,但是如果指针指向的是非法地址,或者指针指向的对象并不是我们需要的类型,上面的例子就没有办法检查出来,而是统统认为是正确的。完整的检查应该如下:
// An example of completely checking the error condition
BOOL EnumerateListItems ( PFNELCALLBACK pfnCallback )
ASSERT ( FALSE == IsBadCodePtr ( pfnCallback ) ) ;
2.2.2 内部检查
恰当地在代码中使用ASSERT,对bug检测和提高调试效率有极大的帮助,下面举个简单的例子加以说明。
switch( nType )
case GK_ENTITY_POINT:
// do something
case GK_ENTITY_PLINE:
// do something
ASSERT( 0 );
在上面的例子中,switch语句仅仅处理了GK_ENTITY_POINT和GK_ENTITY_PLINE两种情况,应该是系统中当时只需要处理这两种情况,但是如果后期系统需要处理更多的情况,而此时上面这部分代码又没有及时更新,或者是因为开发人员一时疏忽遗漏了。一个可能导致系统错误或者崩溃的
bug就出现了,而使用ASSERT可以及时地提醒开发人员他的疏忽,尽可能快的消灭这个bug。
还有一些情况,在开发人员编写代码时,如果能够确信在某一点出现情况A就是错误的,那么就可以在该处加上ASSERT,排除情况A。
综上所述,恰当、灵活的使用ASSERT进行主动调试,能够极大提高程序的稳定性和安全性,减少调试时间,提高工作效率。
2.3 有用的代码风格
一些好的代码风格也能够帮助你避免一些幼稚的、低级的错误,而这种错误又是很难检测到的。由于C++语言简洁灵活的特性,有时候敲错一个字符,或者漏敲一个字符,都有可能造成极大的灾难,而这种错误并不是随着你的编程水平和经验的提高就能逐步避免的,谁都会敲错字符,对吧。
比如程序员经常将等于逻辑判断符==误敲成赋值运算符=,对于我来说就不太可能程序运行出错后才发现,因为我的习惯是,对于逻辑判断,将常量置于==的左边,如果我误输入了=,那么编译的时候编译器就会报错。
if( INT_MAX == i )
3 Visual C++调试技术
检查代码直到头晕眼花也没有发现错误,一运行程序就死机,只好祭出最后的法宝:调试器。Visual
C++调试器可以称得上Windows平台下最好的C/C++调试器了,而且Visual
C++调试器还可以调试用其他语言如Delphi、Java编写的程序,可谓功能强大。
尽管Visual C++调试器具有如此大的威力,它也只能帮助你发现一些隐藏的逻辑错误,对于程序设计和结构的缺陷无能为力。
程序员最常用到的Visual
C++调试技术有设置断点、跟踪调用堆栈和反汇编调试,其他编译器功能均为调试中的辅助工具,因为反汇编调试需要程序员具备汇编语言知识和语言底层结构,这里不再介绍。
3.1 调试的先决条件
专业调试者有一个共同的特点,即他们同时也是优秀的开发者。显然,如果你不是一个优秀的开发者,那么你也不可能成为调试专家,反之亦然。以下是要成为一名高水平的,至少是合格的调试者或者开发者所需要精通的领域。
了解项目:对项目的了解是防范用户界面、逻辑及性能方面的错误的第一要素。了解各种功能如何在各种源文件里实现,以及在哪儿实现,你就能够缩小查找范围,很快找出问题所在。
2. 掌握语言:掌握项目所使用的语言,调试者(开发者)既要知道如何使用这些语言进行编程,还要知道这些语言在后台作些什么。
掌握技术:要解决棘手的问题,第一个重要步骤就是抓住所用技术的要领,这并不意味着你必须对所用技术的一切细节都一清二楚,而是说你应该对所使用的技术有一个大概的了解,而且更重要的是,当需要更详细的信息时,你应该确切的知道在哪儿查找。
操作系统和CPU:任何项目都实际运行在特定的操作系统和特定的CPU,对操作系统了解越多,对查找错误帮助越大;从理论上来说,掌握汇编语言,你就可以调试解决任何bug。
无论从事什么工作,只要是经常从事技术工作的人,都必须不断地学习以跟上技术的发展,更不用说想干得更好或是想走在技术发展的前沿。经常阅读优秀的技术书籍和杂志,多动手编写一些实用程序,阅读其他优秀开发者的代码,作一些反汇编工作,都会有效帮助你提高开发和调试水平(尤其当你将这四者有机结合起来)。
3.2 调试过程
确定一个适用于解决所有错误的调试过程有一定的难度,但John Robbins提出的调试过程应该说是最实用的:
1. 复制错误
2. 描述错误
3. 始终假定错误是自己的问题
4. 分解并解决错误
5. 进行有创见的思考
6. 使用调试辅助工具
7. 开始调试工作
8. 校验错误已被更正
9. 学习和交流
对错误进行描述有助于改正错误,同时也能够得到同事们的帮助。逐步缩小问题范围、排除不存在错误的代码段,直到找到问题所在,是解决所有问题的普遍适用方法。有些奇怪的错误需要你把视线从代码堆转移到诸如操作系统、硬件环境等其他方面去。善用各种调试辅助工具能够节省你大量的时间,而且某些工具本身就不会给你犯有些错误的机会。当你解决了一个bug,停下来思考一下,什么导致你(或他)犯了这样的错误,以后如何避免?
要记住调试器仅仅是个工具,就好比一只螺丝起子,你让它做什么它就只做什么,真正的调试器是你自己脑子中的调试思想。
3.3 断点及其用法
在Microsoft Visual
C++调试器中在源代码行中设置一个断点很简单。只需要打开源文件,将光标放在想要设置断点的代码行上,按下F9快捷键就可以了,再次按下F9快捷键就会取消断点。当运行该代码行的代码时,调试器将在所设置的位置处停止。这种简单的位置断点的功能极其强大,经过统计,只需要单独的使用这种断点,就可以解决
99.46%的调试问题。
如果程序并不是每次运行到断点处都会发生错误,那么不停地在调试器和应用程序之间穿梭很快就会让人厌倦,这时高级断点就派上了用场。从本质上来讲,高级断点允许你将某些智慧写入到断点中,让调试器在执行到断点处时,只当程序内部状态符合你指定的条件时才在断点处中断程序运行,并切换到调试器中。
按下Alt+F9快捷键弹出Breakpoints对话框,浏览一下对话框发现该对话框分为Location、Data和Messages三页,分别对应三种断点:
位置断点:我们通常使用的简单断点均为位置断点,我们还可以设置断点在某个二进制地址或任何函数上,并通过指定各种限定条件来增强位置断点的功能。
2. 表达式和变量断点:调试器会让程序一直运行,直到满足所设的条件或者指定数据更改为止。在Intel
CPU上,这两种断点都尽可能通过CPU的特定调试寄存器使用一个硬件断点,如果能够使用调试寄存器,那么程序将能够全速运行,否则调试器将单步执行每个汇编指令,并每步都检查条件,程序的运行速度将极其缓慢甚至无法运行。
3. Windows消息断点:使用消息断点,可以让调试器在窗口过程接收到一个特定的Windows消息时中断。消息断点适用于C
SDK类型的程序,对于使用MFC等C++类库的程序(应该是绝大多数)来说,消息断点并不实用,可以变通地使用位置断点来达到同样效果。
各种高级断点的设置在MSDN中有详细的介绍,请在Visual C++子集下搜索主题Using Breakpoints:
Additional Information并阅读相关内容。
3.4 调用堆栈
有时候我们并不清楚应该在哪里设置断点,只知道程序正在运行就突然崩溃了,这时候如何定位到出错地点呢?这时的选择就是查看调用堆栈,调用堆栈可以帮助我们确定某一特定时刻,程序中各个函数之间的相互调用关系。
方法是当程序执行到某断点处或者程序崩溃,控制权转到调试器后,按下Alt+7快捷键,弹出Call
Stack窗口,你可以看到当前函数调用情况,当前函数在最上面,下面的函数依次调用其上面的函数。在Call
Stack窗口的弹出菜单上选择Parameter Values和Parameter
Types可以显示各个函数的参数类型和传入值。
3.5 使用跟踪工具
有些时候,我们希望了解程序中不同函数之间的协作关系,或者由于文档的缺失,希望能够确认函数在不同情况下被调用时的传入参数值。这时使用断点功能就过分麻烦,而调用堆栈只能查看当前函数的被调用情况,一种较好的方法就是使用TRACE宏以及相对应的工具。
程序(Debug版)运行中,一旦运行到TRACE宏,就会向当前Windows系统的调试器输出TRACE宏内指定的字符串并显示出来,当在Visual
C++环境中调试运行(按F5键)程序时,可以在Output窗口的Debug页看到TRACE宏的输出内容。实际上,TRACE宏是封装了
Windows API函数OutputDebugString的功能,有些辅助工具可以在不惊动Visual
C++调试器的前提下,拦截程序中TRACE宏的输出内容,比如《深入浅出MFC》的附录中提到的Microsoft System
Journal(MSJ)1996年1月的C/C++专栏介绍的TraceWin工具(在较老版本的MSDN中可以找到源代码和文档)以及功能强大的免费工具DebugView。
使用TRACE宏,我们可以轻松了解程序中各个函数之间的相互协作关系和被调用的先后顺序和时间,进一步说,你能够完全掌握程序的执行流程。
最后请注意,TRACE宏会对程序效率有所影响,所以,当前不用的TRACE宏最好删除或者注释掉。
4 阅读程序的技巧
对于程序员来说,无论是学习还是工作,经常要阅读其他程序员的源代码,如何快速领悟程序的思想,洞悉程序的结构和各个组成部分的功能,进而全面掌握程序所涉及的方方面面,是程序员很重要的一项基本技能。下面介绍一些常用的技巧。
4.1 从功能、界面入手
一个完整的应用程序或者系统是由若干相对独立的功能构成,这些功能反应在与用户交互的图形界面上,就是各种菜单命令、工具栏按钮命令等等。所以如果当前只对程序的某几个功能感兴趣,可以在程序中找到这些菜单命令、按钮命令等的ID响应函数,以此为起点,逐步深入到程序内部,直到完全理解该功能的实现为止。此过程所花费的时间,很大程度上取决于程序员对调试技术的掌握程度。
需要强调的是,在不熟悉程序核心结构和实现技术的情况下,直接采用该方法探究程序,当逐步深入到程序核心时,涉及的程序模块数量会急剧增长,理解难度也会骤然增大;一旦你对程序核心结构和实现技术了然于胸,采用该方法探究程序,会有势如破竹之感觉。
4.2 砍去枝叶,只留主干
前面已经提到,无论如何,最终你都要掌握程序核心结构和实现技术。如何掌握呢?方法是首先将拿到的程序进行完整的备份,然后将次要功能都从程序中去掉,只留下的必须的部分。去除次要功能是一个反复多次的过程,花费的时间取决于程序员对行业知识的理解程度、编程技术的高低和经验的多少。
经常遇到无法在短时间内判断某个模块是否次要的情况(随着对程序的理解逐渐加深,以及经验和技术的积累,这种情况会越来越少),这时候建议直接将该模块去除,然后重新编译连接程序,运行程序,看程序运行是否正常。
以上介绍的两种方法是使用比较频繁的,两种方法可以相互结合,交替使用。但无论采用什么方法探究阅读程序,都不要指望能够不费任何气力,花费一两个钟头就能够将上万行的程序探究个明白。
5 参考资料
《程序设计实践》,机械工业出版社
《高质量C++编程指南》,林锐
《应用程序调试技术》,John Robbins,清华大学出版社
《面向对象软件构造》,Bertrand Meyer,清华大学出版社
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。断点调试断点调试%s——精品文档,值得购买和收藏!!!!!
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口找学校,搜学校,学校口碑早知道!
您可以免费发布教育培训信息,找学校,找课程,找老师,学校建站,发布新闻动态,招生培训等。
推荐学校:
LOADING...
您当前的位置: >>
>> C/C++教程 >> C/C++ 编译器和调试器以及静态库、动态库使用汇总(1)ae566b9b
C/C++ 编译器和调试器以及静态库、动态库使用汇总(1)
更新日期: 来源:网友投搞 作者:佚名 分享1882次
核心提示:新闻资讯频道所转载文章、数据等内容纯属作者个人观点,仅供学习参考使用。本文《C/C++ 编译器和调试器以及静态库、动态库使用汇总(1)》来源于网络并非原创内容,请读者以官方内容为准,如果您发现本资料有侵犯您的知识产权,请立即联系我们,我们将第一时间内删除该资料,以保障您的知识产权。
大多数unix系统下面的调试器的使用方法如下: gdb介绍
GNU 的调试器称为 gdb,该程序是一个交互式工具,工作在字符模式。在 X Window 系统中,有一个 gdb 的 前端图形工具,称为 xxgdb。gdb 是功能强大的调试程序,可完成如下的调试任务: * 设置断点; * 监视程序变量的值; * 程序的单步执行; * 修改变量的值。 在可以使用 gdb 调试程序之前,必须使用 -g 选项编译源文件。可在 makefile 中如下定义 CFLAGS 变量: CFLAGS = -g 运行 gdb 调试程序时通常使用如下的命令: gdb progname 在 gdb 提示符处键入help,将列出命令的分类,主要的分类有: * aliases:命令别名 * breakpoints:断点定义; * data:数据查看; * files:指定并查看文件; * internals:维护命令; * running:程序执行; * stack:调用栈查看; * statu:状态查看; * tracepoints:跟踪程序执行。 键入 help 后跟命令的分类名,可获得该类命令的具体清单。 gdb 的常用命令
命令 解释 break NUM 在指定的行上设置断点。 BT 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。 clear 删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM。 continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而 导致停止运行时。 display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。 file FILE 装载指定的可执行文件进行调试。 help NAME 显示指定命令的帮助信息。 info break 显示当前断点清单,包括到达断点处的次数等。 info files 显示被调试文件的具体信息。 info func 显示所有的函数名称。 info local 显示当函数中的局部变量信息。 info prog 显示被调试程序的执行状态。 info var 显示所有的全局和静态变量名称。 kill 终止正被调试的程序。 list 显示源代码段。 make 在不退出 gdb 的情况下运行 make 工具。 next 在不单步执行进入其他函数的情况下,向前执行一行源代码。 print EXPR 显示表达式 EXPR 的值。 gdb 使用范例----------------- 清单 一个有错误的 C 源程序 bugging.c ----------------- #include #include static char buff [256]; static char* int main () { printf ("Please input a string: "); gets (string); printf ("\nYour string is: %s\n", string); } ----------------- 上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初 始化的字符串地址 string,因此,编译并运行之后,将出现 Segment Fault 错误: $ gcc -o test -g test.c $ ./test Please input a string: asfd Segmentation fault (core dumped) 为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行: 1.运行 gdb bugging 命令,装入 bugging 可执行文件; 2.执行装入的 bugging 命令; 3.使用 where 命令查看程序出错的地方; 4.利用 list 命令查看调用 gets 函数四周的代码; 5.唯一能够导致 gets 函数出错的因素就是变量 string。用 print 命令查看 string 的值; 6.在 gdb 中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为此,我们在第 11 行处设置断点; 7.程序重新运行到第 11 行处停止,这时,我们可以用 set variable 命令修改 string 的取值; 8.然后继续运行,将看到正确的程序运行结果。 运行 gcc/egcs GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。 假如你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可执行文件。例如,假设你有 两个源文件 main.c 和 factorial.c 两个源文件,现在要编译生成一个计算阶乘的程序。 清单 factorial.c ----------------------- #include #include int factorial (int n) { if (n <= 1) return 1; else return factorial (n - 1) * } ----------------------- ----------------------- 清单 main.c ----------------------- #include #include int factorial (int n); int main (int argc, char **argv) {
if (argc < 2) { printf ("Usage: %s n\n", argv [0]); return -1; } else { n = atoi (argv[1]); printf ("Factorial of %d is %d.\n", n, factorial (n)); } return 0; } ----------------------- 利用如下的命令可编译生成可执行文件,并执行程序: $ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120. GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判定是 C 程序还是 C+ + 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。 但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完 完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。 假设我们有一个如下的 C++ 源文件(hello.C): #include void main (void) { cout << "Hello, world!" << } 则可以如下调用 g++ 命令编译、连接并生成可执行文件: $ g++ -o hello hello.C $ ./hello Hello, world! gcc/egcs 的主要选项
选项 解释 -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 要害词。 -c 只编译并生成目标文件。 -DMACRO 以字符串“1”定义 MACRO 宏。 -DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 -E 只运行 C 预编译器。 -g 生成调试信息。GNU 调试器可利用该信息。 -IDirectorY 指定额外的头文件搜索路径DIRECTORY。 -LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。 -lLIBRARY 连接时搜索指定的函数库LIBRARY。 -m486 针对 486 进行代码优化。 -o FILE 生成指定的输出文件。用在生成可执行文件时。 -O0 不进行优化处理。 -O 或 -O1 优化生成代码。 -O2 进一步优化。 -O3 比 -O2 更进一步优化,包括 inline 函数。 -shared 生成共享目标文件。通常用在建立共享库时。 -static 禁止使用共享连接。 -UMACRO 取消对 MACRO 宏的定义。 -w 不生成任何警告信息。 -Wall 生成所有警告信息。
SCO UNIX下面dbaxtra的调试技术
在sco unix下编程大多离不开C语言,即使是数据库应用也有很多是与c搭配使用的,例如informix esql/c 就可以在c语言中嵌入sql 语句。很多人认为在unix下写程序是件很痛苦的事情,其中一个很重要原因是不知道在unix下怎样调试程序。其实在sco unix源码调试器是dbxtra或dbXtra,linux下是gdb。它们类似turbo c的调试器,可以跟踪源码变量。在unix 下调试程序有如下传统方法 一、在要调试语句之前,输出要调试的变量,利用printf()函数。 二、写日志文件,把结果输出到文件中避免屏幕混乱,利用fprintf()函数。 三、利用sco 内置调试器dbxtr
阅读上一篇:
阅读下一篇:

我要回帖

更多关于 delphi 断点调试 的文章

 

随机推荐