掌握C++ builder的除错艺术(2).1

第二篇-近距离观察(1)

1.调试可执行程序前的准备

2.工程选项

3.设置断点并闯入可执行程序

4.察看储存在变量中的值

5.使用Watches(观察)

6.使用Inspectors(巡视器)

7.使用Evaluate/Modify(求值/修改)

8.Stepping Through, Over and Around Blocks of Code

9.Stepping的类型

10.Stepping的注解

11.其他提示

Okay,(再小小准备一下)现在开始追踪、搜索经过前次的努力后仍然躲在代码中的bug的时候了,也就是开始跟踪前一篇文章代码里标记过的bug/异常。首先是准备阶段。

调试可执行程序前的准备

在我们开始调试可执行程序前,我们需要确保一些设置在大多数情况下的正确性。我将会一条接一条的过一遍,并简单解释一下为什么必须那样做。(如果您对有些东西感兴趣的话,按下帮助按钮,会有许多更详尽的内容)。现在就开始吧,先打开Project|Options选项。

工程选项

首先我们在"Compiler"(编译)标签处停下。您只需简单的单击"Full debug"(完全调试模式)按钮,我们所需的绝大多数的其余设置就已经搞定了。将"Code optimization"(代码优化)设为"None"(无)总是件好事,这样做实际上告诉编译器:所有的事情都已做好,只需产生机器码就行了。而不要为了提高一点点运行速度尝试进行其他的智能优化。(当然,一切都完成之后,您可以打开此项。)这样做的好处是大大降低了我们调试的难度。因为程序中的代码与我们书写的一样,没有被编译器优化过。在"debugging"(调试)面板中,将"Debug information"(调试信息)选上(点一下),并且必须设置为"Line number information"(行数信息)。我还建议将"Disable inline expansions"(禁用内联扩展)一项选上。内联扩展对发布的代码来说很好,但调试时最好还是关掉此项,他只会让您更头痛。

然后是"Pascal"标签,尤其在您的工程里连接了Pascal单元或使用了基于Pascal的VCL控件时(若您拥有其Pascal源码时,编译器会自动使用此节中的设置重新编译)。这里您必须将"Optimization"优化选项禁用,然后通常我会将"debugging"(调试)部分的所有选项选上(打钩)。

接下来是"Linker"(链接)标签,我们需要选上"Create debug information"(生成调试信息)。"Use dynamic RTL"(使用动态RTL)以及"Don’t generate state files"(不要生成状态文件)是造成麻烦的选项。我通常都会使用状态文件(这样允许增量链接,但会在编译目录下产生一个4倍于可执行程序或更大的文件),换个角度来说,这样会增加链接大工程时的速度。而使用dynamic RTL本身就是个争论,尚有很多赞同和反对的讨论。

下一个是"Directories/Conditionals"(路径/条件)标签。在这里我们想要设定"Directories/Conditionals"(调试源路径)的值。我们永远都应将此处设定为$(BCB)\source\vcl,但是如果您有任何其他的组件附加的话,通常将它们的路径也加上是个好主意(路径与路径之间用”;”分隔或者您可以用按下…按钮弹出的对话框来设定它们)。

最后也是最重要的设置是在"Packages"(程序包)标签上。根据所有恰如其分的调试经验您必须禁用"Build with runtime packages"(带运行时程序包编译)。这么做的原因是程序包本身不包含而且不能包含调试信息。这样做,也许不利于您跟踪标准的VCL代码,例如想看清楚VCL函数y中参数x是如何起作用的时候。但是大多数时候,您这么做将会发现调试器将您的绝大多数“症状”归结给VCL,尽管“病因”就在您的源代码中(或在其他的组件中(这已经在我们所有人身上发生了))。一旦您发布您的正式版本时,您可以决定是否使用程序包。(译者注:程序包的本质是一个特殊的DLL,不带运行程序包(静态)编译可以让您的程序脱离Cbuilder独立运行。),但在调试时,请禁用掉。按下OK按钮,我们已经准备好啦。下一个对话框只需打开一次,但最好还是来检查以下我们在这里的设定是否正确。好了,打开”Tools|Debugger Options…”吧。

对话框最下方的"Integrated debugging"(集成调试器)选项是关键所在。确信已经打上钩。按下OK按钮准备编译可执行程序吧。我建议重新来一次彻底的编译(选择Project|Build All),如果您修改过您的设置的话(尤其是改变”building with packages”方式后)。这将保证我们的所有程序单元按照我们所希望的那样被编译。

设置断点并闯入可执行程序

象您所见过的其他任何一款调试器一样,C++Builder提供强大的断点设置功能。基本上,断点是指代码中的一个点,程序执行至此停下(与退出不同,这只是执行中的暂停)并将控制权交还给调试器。设置一个断点相当容易。只需在您想要设置的程序代码行左侧的灰色槽形区域点击,您会看到一个红点出现,这一行也会变红。程序运行到这一点就会暂停,将控制权交还给调试器。

您也许会问如果我不想每次都停下来呢?当然可以,而且还很容易做到,这取决于您暂停程序的标准是什么?(译者注:条件断点)。在刚才那个断点(红点)上右击鼠标并从弹出菜单上选择” Breakpoint Properties”(断点属性)。此处可以设定两种属性"Condition"(条件)和"Pass Count"(通过次数)。Condition(条件)属性太方便了。您可以利用if()语句输入几乎是任意的条件。但请牢记条件中的所有变量,对此断点都应是可见的。条件属性并未被编译器编译到执行程序中,而是在运行时,当程序运行至断点暂停后,检查断点的条件是否满足。条件为真,停下,否则让程序继续运行。另一个属性"Pass Count"(通过次数)也很容易理解。断点将被通过Pass Count次后停下。结合使用这两个属性,在调试您的代码时,您可以设定非常严格的断点。

还有一件要牢记的是,当您在调试器中发生异常时,会以产生异常处的那一行代码上的断点的形式出现。这种情况很容易制造。一旦您得到一个异常后应做的步骤我会在以后展示如何在堆栈中回溯并跟踪找出异常发生的真正原因(如引起异常产生的那一小片代码)。

另一个要牢记的提示是当您运行您的程序时,代码窗口左侧有蓝点的任意一行都可以设成断点。所有非法的断点将会变为红点中带一个黄色的小叉,这一行代码也会变成黄褐色。合法的断点则变为红点中带一个绿色的小钩。运行时,您可以设置/修改任意一点,断点立即生效而无须重新编译。

时间: 2024-10-26 17:17:48

掌握C++ builder的除错艺术(2).1的相关文章

掌握C++ builder的除错艺术(1)

第一篇-正确书写代码 1.简介 2.书写干净的代码 3.使用异常及异常处理能力 4.使用记录(logging)机制 5.结合使用记录机制与类的异常处理机制 6.处理您代码外产生的异常 7.你的回合 8.版权说明 简介 这篇文章,我将从最基本的开始谈起.但希望可以涉及更广的层面,而不仅仅是为你的程序除错(debug).你将会看到,我认为除错(debugging)这个字的全部意义,并不只是通过ide的内建机制来运行的.我希望在这篇小小的文章结束时,几乎每个读者都可以学到至少是一件新东西,并把它藏到你

掌握C++ builder的除错艺术(2).2

第二篇-近距离观察(2) 使用evaluate/modify(求值/修改) 最后一种显示变量或代码块的值的途径是evaluate/modify(求值/修改)窗口.这个窗口可以象打开巡视器一样打开,在您要evaluate/modify(求值/修改)的代码行上右击选择"debug|evaluate/modify"就会弹出evaluate/modify(求值/修改)窗口.本窗口用来对表达式/变量求值并/或修改.watches和/或inspectors也可以实现同样的功能.但如果您想要修改的话

Borland C++ Builder专题

BCB中如何给Table减肥 C++ Builder开发经验几则 C++ Builder在运行时创建BDE别名 C++ Builder常用代码片断 C++ Builder实现在线接收电子邮件 C++ Builder动态设定odbc数据源 如何利用C++ Builder实现对Excel97 的调用 BCB创建基于Internet的点对点Chat 用C++ Builder开发Web程序 用BCB开发多层数据库应用程序 用C++ Builder编写自已的IE SKIN 用BCB5的打包程序打包BCB6

掌握CB的调试艺术

程序的bugs越少,最终用户对这个程序的评价越高.而开发人员事先对bugs的处理越多,最终用户能提供的关于bugs的信息就越多,也越准确,这样,开发人员在接到最终用户反映之后,就能够快速找到出现bugs的那部分代码,并以最快速度发布程序的升级包. 在这份教程中,我们从最基本的部分开始,逐步介绍许多在调试程序时"应该做"或"不应该做"的原则.正如你将看到的,这份教程中所指的"调试"这个词所包含的意思很多,而不只是如大部分人所想到的--利用IDE集成

C++ Builder调用Matlab

Borland C++Builder是一种新颖的可视化编程语言.在工程应用中,我们一般用C++Builder语言编写应用程序,实现交互界面.数据采集和端口操作等,但C++Builder在数值处理分析和算法工具等方面,其效率远远低于Matlab语言.在准确方便地绘制数据图形方面,Matlab语言更具有无可比拟的优势.此外,Matlab还提供功能强大的工具箱.但Matlab的缺点是不能实现端口操作和实时控制.因此,若能将两者结合运用,实现优势互补,将获得极大的效益. 本文结合实际介绍了应用Borla

C++ Builder中如何保持控件的位置及大小

C++ Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C++/Pascal开发工具,利用它可极大地加快应用程序的开发速度.但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了.随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得非常混乱.本文将介绍一些正确定位控件及Form的方法. 利用OnResize事件改变控件位置及大小 C++ Builder/Delphi中的Form控件有一个OnResize事件,Form的

C++Builder 软件还在完善和更新吗?

问题描述 C++Builder 软件还在完善和更新吗? 我用C++builder5开发的应用程序,打包后做成安装系统,却无法在win7系统上安装,有人告诉我说是因为C++Builder 软件开发公司已经不再对其维护和更新了,所以无法适用于高版本的window系统,是这样的吗? 解决方案 基本没有维护了,换visual studio吧. 解决方案二: 貌似还有BCB XE之类的新版本存在,但是从市场份额来说,BCB几乎绝迹了. 解决方案三: BCB在5之后又经历了6,2006,2007,2009,

CCAI 2017 | 刘燕:艺术与人工智能的明天——人机信任合作

大会第二天下午,南加州大学计算机系名誉副教授.机器学习中心主任刘燕参与了[人工智能科学与艺术]论坛的讨论,并发表了<艺术与人工智能的明天--人机信任合作>主题演讲,刘燕教授认为将来人工智能与艺术的结合,主要在于人机信任合作,在提供可解释性.可迁移性.可靠性方面进行长足的发展.刘燕教授从DeepDream.Megenta.Angelina.Sunspring等振奋人心的最新AI艺术项目和作品入手,谈人工智能与艺术的共同点.不同点.从可解释性的角度,人工智能和艺术都是目前无法解释的黑箱,但人工智能

CCAI 2017 | 北京航空航天大学计算机学院副院长王蕴红:人工智能技术与艺术的鉴赏创作

大会第二天下午,北京航空航天大学计算机学院副院长王蕴红参与了[人工智能科学与艺术论坛]的讨论,并发表了<人工智能技术与艺术的鉴赏创作>主题演讲. 她详解了人工智能技术的优势.可发挥作用,及其可能对于艺术发展的影响.王蕴红表示:"人工智能技术的发展趋势中,艺术将成为其最难接近人类智能的部分",但其也有正反两面,一方面,艺术欣赏和训练软件将使得艺术学习更为便捷和低成本,艺术创作的辅助软件将使得艺术家效率更高:但另一方面,也提出疑问,用大概率的方法训练能否产生小概率事件的发生?原