掌握C++Builder的除错艺术 第二篇(1)

ADS AEL脚本进阶:参数化电感与变压器的自动化设计 本文深入探讨了如何利用ADS AEL脚本实现电感与变压器的参数化与自动化设计。通过构建可复用的函数库、封装高级设计流程、集成DRC检查与性能预估,将繁琐的手动绘制升级为高效的智能设计引擎,并最终通过创建GUI工具降低使用门槛,大幅提升射频/微波电路设计效率。 阅读详情

Mastering the Art of Debugging in C++Builder
Article 2 - Watching it Closely

 

掌握C++Builder的除错艺术

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


 

 

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

2.      工程选项

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

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

5.      使用Watches(守护察看)

6.      使用Inspectors

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

8.      Stepping Through, Over and Around Blocks of Code

9.      Stepping Types

10. Stepping Notes

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次后停下。结合使用这两个属性,在调试您的代码时,你可以设定非常严格的断点。

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

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

察看储存在变量中的值

一旦你的程序在你的断点处停下后,该做什么?有一件事你想做而且必须做的,那就是察看储存在你程序中的各种变量真实的值。这部分内容涉及的方面很多,您一定要坚持,忍受这些枯燥的东西。幸运的是当你看完这些,你一定会对调试器这部分最强大的功能有些新的理解。有许多种方法可以察看变量的值,主要要根据您的目的来决定。我会从察看当前函数的Local Variables(局部变量)开始把他们都讲完。

察看局部变量没有太多可以讲的。只需点击”View|Debug Windows|Local Variables”,或按下ctrl-alt-L

拉普拉斯矩阵 1、预备知识 拉普拉斯矩阵定义为:L=D-W。其中,D为度矩阵,W为权重矩阵。 (1)D是对角矩阵,对角线上的元素时节点的度,即所有与该节点相关联的边的权重之和;对角线以外的元素为0。有向图的对角矩阵分为 出度矩阵 和 入度矩阵。 图1.1 无向图中的度矩阵 (2)W在无向图中是对称矩阵,在有向图中是非对称矩阵。 ... 阅读详情

相关推荐

SAP FICO - 外币交易实战:汇率类型配置与货币换算率管理

月底关账前的外币评估就像财务人的"期末考",OB59配置就是你的备考方案。最低值原则(Lowest value principle)最保守。它会比较原始汇率与评估日汇率,取不利方向确认损失。适合风险厌恶型企业,我在制造业客户中应用最多。重估法(Revalue only)更反映市场现状。无论盈亏都按最新汇率调整,适合交易性金融资产处理。有个基金公司客户就靠这个方法及时反映了外汇波动收益。最小差异金额(Minimum difference)是防骚扰设置。

weixin_42524708的博客 355

掌握C++Builder的除错艺术-第二篇(完整版)之二

 Mastering the Art of Debugging in C++BuilderArticle 2 - Watching it Closely掌握C++Builder的除错艺术第二篇-近距离观察(2) 使用Evaluate/Modify(求值/修改)最后一种显示变量或代码块的值的途径是Evaluate/Modify(求值/修改)窗口。这个窗口可以象打开巡视器一样打

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

深入解析DDR5 SDRAM中的CA训练模式(CATM):原理与实现

本文深入解析DDR5 SDRAM中的CA训练模式(CATM),详细探讨其工作原理与实现方法。通过分析JESD79-5标准,揭示CATM在时序校准、信号质量优化和系统稳定性方面的核心价值,并提供硬件设计考量和系统级调试技巧,帮助工程师解决高速内存系统中的信号完整性问题。

weixin_29235923的博客 383

使用c++builder调试代码时总是错过/忽略断点的解决方法

最近刚刚安装了c++builder,将已有的代码进行调试时添加的断点总是不执行,在网上搜了一堆说要转到debug模式下,说根据下面步骤执行即可““C++Builder–>Project–>Option…–>Compiler–>Full Debug”,说的太简单了,根本没找到这样的选项,最后上谷歌搜了一下,呵呵呵呵,完美解决,只需要进行如下设置即可。 · [...

hack_tian的博客 2218

xenomai内核解析--嵌入式实时linux概述

Linux系统作为一个GPOS(通用操作系统)发展至今已经非常成熟可靠了,并且由于遵循GPL协议,开放所有系统源代码,非常易于裁剪。更重要的是,与其他开源的GPOS或RTOS相比,Linux系统支持多种处理器、开发板,提供多种软件开发工具,同时Linux系统对网络和图形界面的支持非常出色。显然,选择Linux操作系统在产品的开发周期和成本控制方面都有巨大优势。 虽然Linux系统功能强大、实用性强...

wsg1100 3699

CIC-IDS数据集特征介绍

###1、简介 通信安全机构(CSE)与加拿大网络安全研究所(CIC)合作项目,该项目对自1998年以来现有的11个数据集的评估表明,大多数数据集(比如经典的KDDCUP99,NSLKDD等)已经过时且不可靠。其中一些数据集缺乏流量多样性和容量,一些数据集没有涵盖各种已知的攻击,而另一些数据集将数据包有效载荷数据匿名化,这不能反映当前的趋势。有些还缺少特征集和元数据。 CIC-IDS-2017数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs)。 它的数据采集截至2017...

蓝亚之舟的博客 3万+

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

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

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

pwm电机调速的原理介绍与代码实现

1、pwm实现调速的原理与介绍 PWM(Pulse Width Modulation)脉冲宽度调制。 1)占空比 pwm占空比就是一个脉冲周期内有效电平在整个周期所占的比例。 通过调节PWM的占空比就能调节IO口上电压的持续性变化,因此也能够控制外设的功率进行持续性变化,也就能控制直流电机的转速快慢。 那么重点就在于如何调节PWM波形的输出。如下图所示 图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4

Clichong 7万+

掌握C++Builder的除错艺术-第二篇(完整版)之一

    Mastering the Art of Debugging in C++BuilderArticle 2 - Watching it Closely掌握C++Builder的除错艺术第二篇-近距离观察(1) 1.        调试可执行程序前的准备2.        工程选项3.        设置断点并闯入可执行程序4.        察看储存在变

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

Nuxt - 项目打包部署及上线到服务器流程(SSR 服务端渲染)

Nuxt-项目打包部署及上线到服务器流程,详细介绍Nuxt项目上线部署,服务端渲染(ssr)项目及nuxt项目部署过程,nuxt项目打包上线,Nuxt项目的部署教程,NuxtJS项目部署方案,Nuxt如何部署到线上,nuxt项目部署篇,Nuxt项目搭建到Nuxt项目部署,Nuxt项目从开始到部署,详细教程。服务器部署nuxt项目,nuxt服务端部署上线,在服务器上部署nuxt项目,NuxtJS项目——命令和部署。......

🏆 前端领域优质创作者 1万+

商用车重型多挡位机械式变速器(AMT)结构设计与仿真分析

本文针对商用车重型AMT变速器开展结构设计与仿真分析。设计采用12挡双中间轴结构,匹配400kW柴油发动机,最大扭矩2000Nm。通过等比级数分配传动比(头挡14.5,最高挡0.78),采用主副箱组合实现多挡位。双中间轴结构可抵消径向力,提升承载能力。关键设计包括:235mm中心距、4.5-5.0mm齿轮模数、锁环式同步器和复合润滑系统。通过Python参数化建模进行强度校核,计算显示中间轴在2000Nm工况下等效应力满足安全系数要求(屈服强度850MPa,安全系数≥2)。该设计解决了传统MT变速器操作强度

AI的内部世界的博客 113

[转载]掌握C++Builder的调试艺术

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

游乐园 1475

在 Fiori Elements Object Page 的表格中用 UI.Hidden 隐藏列:语义、边界与落地实践全解析

摘要: Fiori Elements的Object Page表格中,UI.Hidden注解支持静态和动态隐藏列。动态隐藏分为两种:基于父实体属性隐藏整列,或基于子实体属性按行隐藏单元格。关键约束包括:支持服务端操作的列禁止使用动态隐藏,否则会导致UX不一致。ABAP CDS不支持路径式UI.Hidden,需改用XML注解。该功能需与UI.Importance、个性化等机制明确区分,避免混淆。对于可能参与排序/过滤的列,建议仅使用静态隐藏。实际应用中需注意注解位置(整列或单元格级)和业务场景的匹配。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 204

掌握C++Builder的除错艺术-第二篇(完整版)之一 (转)

掌握C++Builder的除错艺术-第二篇(完整版)之一 (转)[@more@] Mastering the Art of Debugging in C++BuilderArticle 2 - Watching i...

csd3176的博客 191

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ZT:掌握C++Builder的调试艺术

以代码为基础的调试方法  程序的bugs越少,最终用户对这个程序的评价越高。而开发人员事先对bugs的处理越多,最终用户能提供的关于bugs的信息就越多,也越准确,这样,开发人员在接到最终用户反映之后,就能够快速找到出现bugs的那部分代码,并以最快速度发布程序的升级包。   在这份教程中,我们从最基本的部分开始,逐步介绍许多在调试程序时“应该做”或“不应该做”的原则。正如你将看到的,这份教程中所

我一路走来--- 1811

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SuperMap iObject常见问题解答集锦(三)

作者:皇皇 问:如何在程序运行前检查super Objects的安装版本 答:通过SuperMap Objects控件的AboutBox,判断Objects的版本。问:1、Oracle数据集设置可编辑,不能编辑系统崩溃,报错:” ORA-12899: 列 “NVSGIS”.”DISTRICT_C_T”.”NAME” 的值太大 (实际值: 23, 最大值: 20)”; 2、复制SDB数据到Oracl

SuperMap技术控 4509

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

BCB日常使用小集锦

如有疑问,请联系 xuchao@orient-it.com 以下为我的日常笔记,整理出来,供大家分享。1、BCB 编辑快捷键左/右移 块代码选中 块代码 1 CTRL+ SHIFT+ I 是整片往右移,2 CTRL+ SHIFT+ U 是整片文字往左移2、得到执行程序的当前路径ExtractFileDir(Application->ExeName);3、循环中响应其它操作 在循环内加入App

近山者仁 1210

C++ always_inline

always_inline atrribute((always_inline)) 强制内联。所有加了该语句的函数,在编译时会作为内联函数被使用(不会被编译成函数调用方式,而是直接嵌入到调用函数体内)。 会加快函数调用的速度,但会增加函数体的大小(相当于把代码直接copy过去)。慎用。 __attribute((always_inline) void a() { // ... }...

林多 3715

C++Builder 拾零

1、编译器设置Project|OptionsCompiler(编译)"Full debug"(完全调试模式)"Code optimization"(代码优化)"debugging"(调试)"Debug information"(调试信息)"Line number information"(行数信息)"Disable inline expansions"(禁用内联扩展)"Pascal

Léon Atelier 1168

BCB运行期取得Enum(枚举)类型信息

由于Pascal和C++的本质区别,在Delphi里面强大的RTTI功能,BCB中就被相对弱化了很多。不过即便如此,BCB仍然可以享受TObject带来的好处,虽然我们不能够直接使用在delphi下十分方便的GetEnumName。   我们还是不需要为每个枚举类型实现一个静态的String列表。 考虑一下如下的宏实现,为了享受TObject的好处,我们需要从它继承一个VCL子类, 并且为这个类声

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

深入VCL 理解BCB的消息机制(三)

New Page 1<!--font { font-family: Arial; line-height: 140%;font-size:14; margin-top: 1; margin-bottom: 1 }body { font-family: font }-->

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

深入VCL 理解BCB的消息机制 (一)

   <!--font { font-family: Arial; line-height: 140%; font-size: 12pt; margin-top: 1; margin-bottom: 1 }body { font-family: font }--><TABLE bo

没吃过猪肉,光看见猪跑啦.................... 4407
上一篇: 掌握C++Builder的除错艺术-第一篇
下一篇: 掌握C++Builder的除错艺术-第二篇(完整版)之一
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值