[转载]有效提高C++ Builder程序质量(二)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

原著:英雄

使用记录机制:你不可能总是用调试器来调试代码,在某些情况下,可能无法使用内部集成的调试器。这时候,你就不得不依靠其他手段调试程序了。有经验的程序员可能会借助古老的调试方法,例如,使用一些分类的记录机制来确定程序实际运行的过程。我们很幸运,现在有一系列的方法可以简单的完成这样的工作。下面将介绍3种常用方法。

  第一个:OutputDebugString。(WinAPI: VOID OutputDebugString(LPCTSTR lpOutputString);很幸运,微软彻底的实现了调试子系统。它包括的一些特点可能让你想把自己的记录系统扔掉。应用程序在调试器进程中运行时OutputDebugString将用C字符串把调试器输出的信息打印出来。如果程序没有在调试器进程中运行,它将忽略这些调用。它会很好的在客户的机器上运行,不会弹出信息窗口。如果在发布给客户的时候,忘记去掉这些代码程序仅仅会变慢一点,不会有别的不良后果。

  第二个:使用了GExperts,通过 dbugint.pas接口进行调试。它是个可以称之为伟大的程序,你可以把它分发给客户。和OutputDebugString一样,如果客户没有这个程序,它就根本什么也不作。(它会自动检测机器上是否安装了客户端)。要使用dbugintf,它很容易被加入到你的工程中,加入#include "dbugintf.HPp"(要把它加入工程,然后会编译它的pascal文件)。然后,你就可以直接使用SendDebug(要送到记录文件的字符串); 或者,你需要它更机警一些,可以使用SendDebugEx(它给TMsgDlgType增加了一个新的消息类型)SendMethodEnter, SendMethodExit, SendSeparator等等(用法都差不多)。如果你打算给最终用户分发客户端 (Gdebug.exe),不要忘记include所需要的程序包。GExperts可以在http://www.gexperts.org 得到,它是免费的。

  第三个,大概是最艰苦的方法,就是使用你自己的记录控制。这个方法可能不是你想象的这么简单。你可能首先会想到“在窗体上扔一个RichEdit,把它设置为只读的,然后往里面写记录”是这样吧?理论上不错,但是,实施起来...首先,使用RichEdit控件来做记录,会大大降低应用程序的速度,还会在内存中造成碎片,甚至丢失内存。通常,在运行10分钟左右之后,会使整个计算机的速度变慢!(这样做简直是在犯罪!)所以,如果你希望在自己的记录中能够使用彩色和图标,那么最好自己创建一个组件。如果没有这么高的要求,那么有一个简单有效的方法,就是使用ListBox控件作记录,把ListBox的Style属性设置为lbOwnerDrawFixed,这样句柄将会自绘。(GExperts的控制台就是用这样的方法制作的)。

  将记录和异常处理结合使用:你不用总是担心可能会发生什么偶然的异常。一般来说,通过很多的bugs测试后(尽量折磨程序,看看它会不会崩溃),应用程序在运行是应该不会出现什么错误。下面的这个技术,建议组件开发者,在第一次把组件放在IDE环境测试的时候,很应该遵守。一个在IDE中产生的异常会导致很多问题,甚至可能无法重新启动IDE也不能恢复。这个技术很简单。在代码中每一个函数或是主要的函数中加入:
  try  

  {  

   //函数的代码  

  }  

  catch(Exception &E)  

  {  

  SendDebugMessage(“Exception caught in classname::functionname of type:” +E.ClassName()  

  +” with the message:”+E.Message);  

  };  
  (把字符串中classname 和 functionname 替换成相应的类名和函数名。在出现错误时,你会立刻知道错误发生的位置。这样也就不至于强制重起IDE的了。

  ClassName()给了我们什么样的帮助呢?它只是用于返回字符串“Exception”吗?每一次,E都被声明为异常类型?这是VCL另一个优秀的地方,所有的类都从TObject继承,所以,这些类都能自动获得正确的类型和基类的类型,所有的更多的信息都可以在这里找到。(请参见TObject的帮助)所以,尽管我们使用了Exception &E,其中的E.ClassName()将返回捕获到的产生异常的实际类名。得到这些好处需要付出的代价是编译出来的可执行文件变大了一些。所有的Delphi/CBuilder用户都注意到了这一点,但是他们说,没有付出就没有收获。在http://www.bytamin-c.com/的howto栏目可以看到Xiphias的一系列文章。其中,他提到了使用TStringList作记录的方法:先将错误通过TStringList的Add方法加入到StringList里面,然后使用SaveToFile保存到硬盘上。不过要注意在程序结束的时候不要忘记使用SaveToFile()方法把TStringList保存起来。或者,也可以每次捕捉到异常之后都保存一次。

  在代码外部进行异常处理:这是使用代码处理异常的最后一节,以后,我们将使用IDE的调试工具。但是,这节中讲到的方法在处理致命错误时是很重要的。比如说:可以显示一个包含了错误信息的对话框,这样,用户报告bugs的时候会清除的多。你肯定不想听到用户报告说:“啊,这有个对话框,上面写着什么地址发生了错误”。有个好办法能改善这种状况,请往下面看。

  第一步:在主窗体(工程设置里面,自动创建的第一个窗体)中创建这样一个函数:
  void __fastcall AppLevelExceptionHandler(TObject *Sender, Exception *E)  

  {  

  }
  然后,在里面加上显是错误(E->Message)的代码,错误类型(记住前面提到过的E.ClassName())以及其他需要的细节信息。

  第二步:把它与系统挂钩。很简单,只需要在窗体的OnCreate事件中加入这行:

  Application->OnException=AppLevelExceptionHandler;

  在这行代码上,不要吝啬,因为加上它,基本上就可以说所有的错误都不会漏掉了。无论在任何地方发生的错误都可以被捕捉到。

  以代码为基础的调试方法基本就是这些,把它们变为你的习惯吧。如果你要编程的话。
 

[转载]掌握C++Builder的调试艺术 (作者:霍炬编译)  程序bugs越少,最终用户对这个程序的评价越高。而开发人员事先对bugs的处理越多,最终用户能提供的关于bugs的信息就越多,也越准确,这样,开发人员在接到最终用户反映之后,就能够快速找到出现bugs的那部分代码,并以最快速度发布程序的升级包。   在这份教程中,我们从最基本的部分开始,逐步介绍许多在调试程序时“应该做”或“不应该做”的原则。正如你将看到的,这份教程中所指的 阅读详情

相关推荐

c++fortran混合语言编程中动态链接库的调用,[转载]C++Fortran混合语言编程中动态连接库的调用...

摘要:介绍了C++Fortran 90混合语言编程中,在C++中调用Fortran动态连接库(DLL,DynamicLink Library)的方法以及参量传递、函数调用等的方法。关键词:混合编程,Fortran 90,C++,动态连接库前言混合语言编程是利用种或种以上编程语言编写的源码构建程序模块的过程。混合语言编程有以下优点:(1)调用已经存在的源码,如许多单位以前的计算机程序大部分都是...

weixin_39997400的博客 457

掌握C++Builder的除错艺术-第一篇

 Mastering the Art of Debugging in C++BuilderArticle 1 - Coding it Right掌握C++Builder的除错艺术第一篇-正确书写代码  1.        简介2.        书写干净的代码3.        使用异常及异常处理能力4.        使用记录(logging)机制5.  

没吃过猪肉,光看见猪跑啦.................... 2365

RS-232-C端口实时监控软件的设计实现[VC++6]

作者:郎锐 更新时间: 2005-05-07       摘要:    本文介绍了在Microsoft Visual C++ 6.0环境下对RS-232-C串行端口进行编程,以及对后台监控程序所普遍涉及到的无阻塞后台运行、数据的实时接收和处理等问题的解决方法。    一、 引言    在实验室和工业应用中,受信道成本限制,串口常常作为计算机与外部串行设备之间的首选数据传输通道,而且由于串行通信方便

游乐园 2239

Gexperts 使用

http://delphi.sharpplus.com/Delphi_Old/gexperts.htm

987

在BCB下使用GExperts的Debug功能! ()

在BCB下使用GExperts的Debug功能! ()[@more@]GExperts是BCB的一个插件,其中有一项功能是Debug,非常好用。但是由于定义它的是pas文件(这个文件是GExperts安装目录下dbugIntf...

ciya3282的博客 202

[转载]有效提高C++ Builder程序质量()

原著:英雄程序bugs越少,程序的评价越高。我们介绍一些调试程序时“应该做”或“不应该做”的原则。写易读的代码:大概也是最重要的一点,就是写干净易读的代码。  使用Exceptions和Exception的处理方法:开发人员不可能总是依靠于集成的调试工具。所以,学会用其它的方法来找到烦人的bugs是很重要的。一些重要的、处理的错误可能会在窗体之外发生。在C++标准制定出来之前的黑暗日子里,在程序

游乐园 1302

C++ 日志

一个经典的C++日志类 转载于 http://blog.sina.com.cn/s/blog_59b6af6901010nfh.html一个多线程的日志类 转载于 http://www.oschina.net/code/snippet_932501_35769#0-tsina-1-8627-397232819ff9a47a7b7e80a40613cfe1c++ 多线程写日志的一个很实用的日志

xcw_1987的博客 346

优秀的开源C++库:ACE及其安装使用 ()

优秀的开源C++库:ACE及其安装使用 ()[@more@]开源C++库:ACE及其安装使用 什么是ACE?  ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放...

ciya3282的博客 142

英巴卡迪诺新年战略:支持Linux提供中文手册

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34404393的博客 79

一个金融应用项目的总结 ()

一个金融应用项目的总结 ()[@more@]我参与了一个金融应用项目,忙了好一阵子,停下来思考一下,觉得项目存在问题,想给领导提提建议,于是整理了一下思路,先请大家提提看法。 编程方面:我们部门在windows端的开发主要采...

csd3176的博客 148

CAD DLL发布v12新版本,支持最新版本的DWG - AutoCAD®DWG 2018

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34234829的博客 334

C/C++ 知识点---设计模式

在软件工程中,设计模式用来描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类或对象来描述其中的关系和相互作用,是软件“设计”层次上的问题。使用设计模式可提高代码的重用性和可靠性,使代码更容易被他人理解,使代码编制真正工程化。一般将设计模式分为三种类型,共23种:1.创建型模式抽象工厂模式(Abstract Factory):为一个产品族提供一系列相关或相互依赖对象的接口,当需...

weixin_30553065的博客 69

【OpenClaw从入门到精通】第84篇:为什么选择本地部署的 AI Agent 平台(超详细实战版)

OpenClaw 是一个开源、本地优先的 AI Agent 运行时平台,旨在解决云端方案在数据安全、成本可控和架构自由上的痛点。其模块化微内核设计支持插件热插拔,允许自主选择模型(如 LLaMA、Qwen)并通过路由规则按任务切换;内置沙箱工具集(如 Python 执行、网页抓取、SQL 查询)强调最小权限与安全审计;全链路可观测性(Tracing、Audit)保障生产透明。文章对比了云端方案的费效比,提供了完整部署与工具扩展实战代码,并结合金融、医疗等场景给出合规配置建议,以及作者在部署中遇到的四个真实踩

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 204

[转载]天方夜谭VCL: 开门

天方夜谭VCL: 开门虫虫前言如果你爱他,让他学VCL,因为那是天堂。如果你恨他,让他学VCL,因为那是地狱。──《天方夜谭VCL》 传说很久很久以前,中国和印度之间有个岛。那里的国王每天娶一个女子,过夜后就杀,闹得鸡犬不宁,最后宰相的女儿自愿嫁入宫。第一晚,她讲了一个非常有意思的故事,国王听入了迷,第天没有杀她。此后她每晚讲一个奇特的故事,一直讲到第一千零一夜,国王终于幡然悔悟。这就是著名的《

游乐园 2601

C++ Builder VCL的字符串函数(2)

原文地址:http://www.yesky.com/20020701/1618451_1.shtml1. UpperCase  将指定的AnsiString字符串转换为大写形式,函数原型如下:  AnsiString __fastcall UpperCase(const AnsiString S);  2. LowerCase  将指定的AnsiString字符串转换为小写形式,函数原型如下:  

游乐园 2324

[转载]TOpenDialog使用

一、改变打开对话框中“打开”按钮的标题(caption)     在c++Builder控件板上的Dialogs页上的VCL控件包括了Windows常用的对话框。换句话说,VCL并没有提供对话框,那些对话框都是Windows的一部分。VCL只是使得使用这些对话框变得容易些。在一些应用中,你可能想改变打开对话框中打开按钮的标题,例如,变成表示你的程序允许用户添加文件到文档中,这中情况下,你可能想打开

游乐园 2140
上一篇: [转载]有效提高C++ Builder程序质量(一)
下一篇: [转载]掌握C++Builder的调试艺术
Rex_love_Burger
博客等级 码龄23年 13粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值