初级教程之---delphi调试

2023-11-15

一、准备调试    

  Delphi 在 IDE 内部集成了一个调试器,因而对程序的调试不用离开集成开发环境(IDE)就可以进行。该调试器能够控制程序的运行、监视程序的输出、检查和修改变量的值。

在调试程序之前,必须保证程序代码已经没有语法错误,还要正确设置一些选项。为此,需要使用【Project】菜单中的【Options】命令打开【Project  Options】对话框。

打开【Compiler】对话框,选中【Debug information】复选框(默认为选中)。这样,编译器将把 所有的调试信息加到.dcu 文件和.exe 文件中。

VCL 的代码都是仔细调试过的,一般不会有错误。如果仍然不放心,想跟踪进入VCL的内部,则需要选中【Use Debug DCUs】复选框。 要说明的是,调试信息将使可执行文件增大,但不影响程序的性能和对内存的需求。

尽管如此,调试结束后,最好要打开【Project Options】对话框,在【Compiler】选项卡中,清除【Debug information】复选框,再重新编译程序。这样,程序中就不包含任何调试信息。要使用内部集成调试器来调试程序,还必须使用【Tools】菜单中的【Debugger Options】 命令打开【Debugger Options】对话框,选中【Integrateddebugging】

复选框(默认为选中)。否则,【Run】菜单中的调试命令将变灰。但要说明的是,内部集成的调试器可能会与某 些软件冲突,从而引起应用程序运行异常。因此,在调试程序时最好把可能引起冲突的软 件退出运行。

    使用【Tools】菜单上的【Environment Options】命令打开【Environment Options】对话框,再打开【Preferences】选项卡。如果选中【Hidedesigners on run】复选框,当程序运行 时,【ObjectInspector】和【Form】设计器将关闭,以腾出屏幕上的空间。如果选中【Minimizeon run】复选框,当程序运行时,IDE 将最小化,以避免屏幕上内容太多太乱。不过,当程 序暂停运行时,IDE 的窗口会重新恢复成原始大小。

二、设置调试器的选项

1.  设置调试器选项

要设置调试器的选项,可以使用【Tools】菜单中的【Debugger  Options】命令打开

【DebuggerOptions】对话框,如图 7.2 所示。在其中的【General】选项卡、【Event Log】 选项卡、【Language Exceptions】选项卡和【OS Exceptions】选项卡中,可以设置调试的一 些环境、配置及方法等。

2. 编译指令


图 7.2   【Debugger Options】对话框


默认情况下,上述设置对整个项目的所有单元都有效。不过,也可以让这些设置只对部分单元有效,因为有些单元可能没有问题,不需要调试。

要使某个单元不包含调试信息,就在这些单元中加入适当的编译指令,例如:

unit Unit1;
{$DEBUGINFO OFF}
interface
…

3.  自定义调试器的颜色

在前面已提到,代码编辑器可以用不同的颜色显示不同的语法成分,在使用调试器调试程序时也有这个功能。例如,通常断点用白底红色表示,当前执行点用白底蓝色表示。 要自定义调试器的颜色,可以使用【Tools】菜单上的【Editor Options】命令打开【Editor Properties】对话框,再打开【Colors】选项卡,在【Element】框中选择某种语法元素,然后设置它的前景颜色和背景颜色。

三、控制程序的运行

3.1单步执行

   当调试信息编译了程序后,就可以调试程序了,调试器将接管对程序运行的控制,但 程序的运行结果与在非调试状态下运行没有什么两样,包括建立窗口、接受用户输入、计算数值、响应事件、访问数据库等均照常进行。

通过【Run】菜单中的【Step  Over】命令,可以单步执行程序。所谓单步执行,就是 一次只执行一行(一个指令),这样就可以知道哪一行或指令引起了运行期错误或逻辑错误。

【StepOver】命令将把整个过程或函数当做一行。如果把几条语句写在一行上,调试 器将把这几条语句当做一条语句。这样,就无法单独调试其中的某一个语句。如果把一条长语句分成几行写,调试器仍然把这几行当做一行。

调试器每执行一行,当前执行点就自动移到下一个要执行的行上,但不一定是源代码的下一行。例如,若正在执行的是 goto 语句,当前执行点将移到 goto 语句跳转到的行上。

另外还有一种情况就是,如果开启了优化编译的选项,某些源代码行将被合并或越过,这时候,当前执行点不会移到这些行上。

为了清晰地看出当前执行点在哪儿,代码编辑器将用白底蓝色显示当前执行点,同时,在“装订区”显示一个绿色的箭头指向当前执行点,如图 7.3 所示。



图 7.3   当前执行点


3.2跟踪执行

【Run】菜单中的【Trace  Into】命令用于跟踪程序。与单步执行相似,这条命令一次 也只执行一行。不同的是,执行到有函数调用的行时,这条命令将进入函数的内部。

如果程序链接了外部代码诸如动态链接库,只要动态链接库包含了符号调试信息,就 可以跟踪进入这些外部代码。否则,调试器将把动态链接库当做一行处理。

在调试过程中,可以根据需要交替使用单步执行和跟踪执行。例如,对有疑问的调用 命令使用跟踪执行,使控制进入被调用部分内部,调试该被调用部分。而对有把握的调用命令使用单步执行,从而直接跳过被调用部分的调试,这样能提高调试效率。

【Trace Into】命令也能够进入事件句柄的内部,就像进入一般的函数内部一样。要注 意的是,OnPaint 事件是当应用程序的窗口需要重画的时候触发的,当进入处理该事件的句 柄内部时,代码编辑器的窗口将推到前端。也就是说,此时窗口需要重画了,这样又将触发 OnPaint 事件。而一旦进入处理 OnPaint 事件的句柄内部,代码编辑器的窗口又将被推到 前端。如此反复,构成无限循环。要解决上述问题,必须把代码编辑器与应用程序的窗口在屏幕上重新排列,不要相互覆盖。

程序往往大量调用了 VCL 的方法,一般情况下,不要跟踪进入VCL 的内部,因为 VCL

的源代码一般是不会出错的。如果怀疑 VCL 中可能出错,或者想进入 VCL 方法的内部看 看方法是怎样实现的,也可以进入 VCL 方法的内部。Delphi Enterprise 和 Delphi Professional 附带了 VCL 的源代码,而且还提供了带调试信息的 VCL 库。


3.3 跳过一段代码

为了节省时间和提高工作效率,不必每次都从头开始单步或跟踪执行程序,可以直接 跳到有疑问的地方,然后再一行一行地执行程序。

【Run】菜单中的【Run to Cursor】命令可以实现这个功能。它能够先以非调试方式执 行到光标所在的行,再接管对程序的控制,单步或跟踪执行以后的代码。

如果光标所在的行不包含调试信息,调试器将弹出一个错误框显示“No  code wasgenerated for the current Line”。

如果不小心进入了例程的内部,想马上退出来,可以把光标移到该例程的最后一行,使用【Run to Cursor】命令,再使用【Step Over】命令,就可以返回到调用该例程的地方。

3.4   全速执行剩余的代码

 

如果不小心进入了一个例程,但又不想调试这个例程,或者确信该例程的代码没有问题,从而想尽快退出这个例程,可以使用【Run】菜单中的【Run Until Return】命令。这个命令将全速执行该例程的代码,直到返回为止。

 

3.5   返回到执行点

 

在调试过程中,随时可以切换到 IDE 或其他程序中,进行各种操作。如果要重新回到调试器的当前执行点,可以使用【Run】菜单中的【Show  Execution

Point】命令,光标将自动回到先前的执行点上。 如果包含执行点的源文件已关闭,调试器将重新打开这个源文件。如果执行点没有对

应的源代码,Delphi 将打开 CPU窗口,显示相应的机器指令。

 

3.6   暂停运行

 

使用【Run】菜单中的【Program Pause】命令将使程序运行暂时停止,这样就可以检 查程序在此状态下的输出或变量的值是否正确,检查完以后,可以继续对程序进行调试, 或者修改变量的值再让程序继续执行,以便看程序对新的值会做出什么反应。

有时候,程序暂停后无法回到调试器中继续运行,这时候可以同时按— 下

Ctrl+Alt+SysRq键终止程序的运行,如果按一次无效,就多按几次。

 

3.7   重新开始运行


在调试过程中,可以使用【Run】菜单中的【Program Reset】命令中止程序的运行并释 放所有占用的内存和资源,关闭所有打开的文件,清除所有的变量设置,然后重新运行程 序。这通常用于在调试过程中发现了错误并更改了源代码后需要重新编译和运行的情况。

【Program Reset】命令并不删除先前设置的断点和观察表达式,因为重新开始调试程 序时可能还要用到这些设置。

【Program Reset】命令可能不能很“干净”地释放应用程序占用的所有资源,这样可 能导致其他程序运行失败,碰到这种情形应当退出 Delphi 或者重新启动 Windows。


3.8   命令行参数

如果要调试的程序需要传递参数,可以使用【Run】菜单中的【Parameters】命令打开

【Run     Parameters】对话框,如图 7.4 所示。

                           图 7.4   命令行参数

在【Parameters】框内键入要传递的参数,也可以从以前键入过的参数中选择一个。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初级教程之---delphi调试 的相关文章

  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • 如何将枚举类型放入字符串列表中?

    这行代码 ShowMessage GetEnumName TypeInfo TAlign 1 返回 alTop 当我想使用字符串变量 TAlign 而不是TAlign时 如何将枚举类型的所有值放入字符串列表中 就像是 ShowMessage
  • 为什么 TImage 旋转我的图像?

    编写一个移动应用程序 它从安全网站提取图像 如下所示 第一个图像 提取不正确 注意网络版本与移动版本 第二个图像在网站上正确显示 但 Delphi TImage 由于某种原因正在旋转它我不明白为什么 旋转设置为 0 并且在 TImage 组
  • Delphi XE4 中是否可以更改应用程序短标题而不使其与项目 dpr 名称相同?

    我正在编写我的第一个由 delphi 驱动的 iPhone 应用程序 我已经创建了它 但我希望将其命名为 dpr 文件名称以外的名称 因为 dpr 文件不能包含空格 例如 EXE 名称并不总是与人们可能分配给应用程序的人类可读名称相同 而在
  • Delphi + Synapse:如何检查我是否仍然连接

    我在用TTCPBlockSocket http synapse ararat cz doc help blcksock TTCPBlockSocket html对于 TCP IP 应用程序 问题是我无法确定连接何时丢失 GetLastErr
  • 德尔福和Doxygen

    我想使用 doxygen pas2dox 记录我的源代码 当我设置好所有内容 包括过滤器和提取选项 提取所有内容 时 doxygen 运行良好 但生成的文档仅包含源文件作为链接 并且没有提取类型 方法 过滤后的源看起来不错 有任何提示如何定
  • Delphi 应用程序被 Google Chrome 视为“危险”

    我经常用Delphi 2009制作数学软件 并将其发布在我的网站上 然而 去年左右 Google Chrome 开始认为我的一小部分 但数量不断增加 EXE 是 有害的 并且 Google Chrome 拒绝下载它们 例如 今天我编写了一个
  • 新编译的应用程序需要 UAC/elevation?

    我有一个系统 我将其设置为普通的 UAC 并在我的 delphi 环境中编译名为 ka exe 的项目 并为其创建一个 installshield 项目 设置完毕 一切顺利 但每当我开始我的程序时 它都需要提升 而我不知道为什么 为了确保
  • 我可以在 Delphi 中使用字符串“IsEmpty”方法吗

    内河码头文件 IsEmpty 方法 http docs embarcadero com products rad studio delphiAndcpp2009 HelpUpdate2 EN html delphivclwin32 Syst
  • Vista 中的文本转语音

    我通过在 2000 NT XP 中使用 Delphi 创建 OLE 对象来做到这一点 如下所示 Voice CreateOLEObject SAPI SpVoice Voice speak 但这在 Vista 中不起作用 我怎样才能让我的程
  • 什么是代码页 0?

    我正在使用Delphi函数 StringCodePage 我在 COM 函数 Acrobat Annotation getContents 请参阅我的其他帖子 返回的字符串上调用它 它返回 0 0是什么 安西 代码页 0 是 CP ACP
  • 让线程在窗体关闭时保持运行

    我在我的应用程序上创建了一个同步线程 我想知道如果我关闭申请表 是否有办法让该线程保持打开状态 直到完成同步过程 调用线程的WaitFor方法在您的 DPR 文件中 之后Application Run线 如果线程已经运行完毕 那么WaitF
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • 使用 IOmniTaskControl/TOmniWorker 时等待 Invoke 完成

    我使用 TOmniWorker 创建了 IOmniTaskControl 以便我可以定期在特定线程上运行代码块 因此 我将根据需要在此 IOmniTaskControl 上调用 Invoke 当我这样做时 有时需要等待与该工作相关的执行完成
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • Delphi:如何检查是否按下了任何鼠标按钮 - 在鼠标事件之外?

    我有一个 TDrawGrid 想要处理单击单元格并使用鼠标滚轮滚动单元格的方式略有不同 使用鼠标滚轮滚动时 视图应以选定的单元格为中心 而仅单击单元格时 视图不应居中移动 因为这会令人困惑 用鼠标滚轮滚动会触发OnSelectCell事件
  • 如何等到我启动的程序使用完该文件后才删除该文件?

    我一直在寻找一种方法来打开通过 Delphi 应用程序及其适当的应用程序保存到我的计算机上的文件 该文件存储在 SQL 数据库中的 Varbinary 字段中 加载到内存流中 然后通过 TMemoryStream 的 SavetoFile
  • 如何指定从 Delphi TStream 读取的组件的所有者?

    我正在从流中读取组件 并且希望能够指定 Owner 属性 var TComponent comp stream Seek 0 soFromBeginning comp stream ReadComponent nil 谁拥有 comp 我该
  • 为什么使用过程来创建对象比使用函数更受欢迎?

    这类似于这个问题 https stackoverflow com questions 1894217 is it memory safe to provide an object as a function result 我问 为什么 到最
  • Delphi - 如何将通用参数传递给接受 const 参数数组的函数

    我有一个 基类 其中包含一个 函数 该函数接受 const 数组 类型的参数 如下所示 type TBaseClass class TObject public procedure NotifyAll const AParams array

随机推荐

  • How far away ? 【HDU - 2586】【在线LCA算法讲解】

    题目链接 做些LCA的算法 还是很提高代码能力的 这道题就是典型的LCA模板 所以用它来练一下我的LCA算法还是很好的 我们要求的是在一棵树上的任意两点的相互距离 既然在一棵树上 就可以直接调用LCA来解了 我们先任取一根节点 我取的是1
  • Tensorflow高级API

    本文个人博客地址 点击查看 一 Estimator 1 介绍 编程堆栈 Estimator 代表一个完整的模型 Estimator API 提供一些方法来训练模型 判断模型的准确率并生成预测 数据集 构建数据输入管道 Dataset API
  • ORA-01861错误

    ORA 01861 错误一般是日期 字符 数字类型互换时产生的错误 日期型数据有误或者安装Oracle时设置NLS DATE LANGUAGE为美国 或其他国家 也有可能导致ORA 01861错误 因为的日期写法有些不一样 亚洲是 RR M
  • Oracle数据库sql语句处理业务表重复数据取其一

    背景 在日常的工作中 我们会遇见一张表中存在重复的数据 这个重复的数据是指几个字段组成一个唯一索引的 但是因为在加工数据的过程中 会去掉这个唯一索引 但是在迁移到业务表中需要这个唯一索引 或者是业务要求等条件的 如下就演示了如何取其一 如下
  • css滚动条不占用宽度_CSS隐藏滚动条并可以滚动内容的几种方式

    前言 当我们的内容超出了我们的 div 往往会出现滚动条 影响美观 尤其是当我们在做一些导航菜单的时候 滚动条一出现就破坏了 UI 效果 我们不希望出现滚动条 也不希望超出去的内容溢出 就要保留鼠标滚动的效果 我们经常在前端开发中遇到这种情
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 有关python 输出彩色字符,不按颜色显示的问题

    因工作需要 做了一些小程序 python有助于工作效率 能处理WORD excel等常用办公文件 在小程序中 往往为了提示 做一些提示 但提示一多 个别重要信息就无法起到作用 对于些重要的提示 想加一些颜色显示 找了N多的网站和帖子 大多数
  • 位运算n & (n-1)的妙用

    本文转自 http blog csdn net zheng0518 article details 8882394 按位与的知识 n n 1 作用 将n的二进制表示中的最低位为1的改为0 先看一个简单的例子 n 10100 二进制 则 n
  • 行指针(对二维数组,多维数组的深层理解)

    行指针 定义 对二维数组的理解 多维数组的理解 二维数组 多维数组向函数传递参数 二维数组 三维数组 定义 声明行指针的语法 数据类型 行指针名 行的大小 行的大小即数组长度 int p1 3 p1是行指针 用于指向数组长度为3的int型数
  • 【周末闲谈】文心一言,模仿还是超越?

    个人主页 个人主页 系列专栏 周末闲谈 周末闲谈 第一周 二进制VS三进制 文章目录 周末闲谈 前言 一 背景环境 二 文心一言 三 文心一言的优势 四 文心一言能否为百度止颓 五 总结 前言 经过了一周的忙碌 周末如期而至 今天我们来聊聊
  • 如何写简历,Web前端简历

    面试官到底想看什么样的简历 面试一直是程序员跳槽时期非常热门的话题 虽然现在已经过了跳槽的旺季 下一轮跳槽需要年底才会出现 但是当跳槽季的时候你再看这篇文章可能已经晚了 过冬的粮食永远不是冬天准备的 而是秋收的时候 点个关注 点个收藏 需要
  • 【计算机视觉

    文章目录 一 GreedyNAS C 二 RegionViT 三 DenseNAS B 四 DenseNAS C 五 DiCENet 六 uNetXST 七 CSPPeleeNet 八 PocketNet 九 OODformer 十 Dee
  • 红外热成像+可见光双光可融合单IP相机

    红外和可见光同时拍摄双光单IP相机可为无人机 机器人 科研机构等提供可靠的视觉效果和数据分析 相机参数可实现定制化服务 让项目达到最佳效果 常规参数如下 相机双光图像单IP输出 可实现视频图像无缝融合 不仅能够看得清 还能看得准 相机数据可
  • android 点击浏览大图,一个图片浏览器,支持超大图、超长图 BigImageViewPager

    BigImage ImageView ViewPager BigImageViewPager 一个图片浏览器 支持超大图 超长图 支持手势放大 支持查看原图 下载 加载百分比进度显示 采用区块复用加载 优化内存占用 有效避免OOM 截图 功
  • Stream调试

    java的stream即流式处理 编码十分简洁 但是却给调试带来了极大的不便 idea推出了streamtrace功能 可以详细看到每一步操作的关系 结果 非常方便进行调试 初遇StreamTrace 这里简单将字符串转成它的字符数 并设置
  • 银屑病药物争相涌现,将惠及国内600万以上银屑病患者

    origin https www jiemian com article 3629136 html 生物制剂在重度银屑病患者中 清除率高且副作用小 但要如何增加可及性 金淼Jemma 2019 10 30 10 44浏览 2 9w来源 界面
  • 【滑动窗口】算法实战

    文章目录 一 算法原理 二 算法实战 1 leetcode209 长度最小的子数组 2 leetcode3 无重复字符的最长子串 3 leetcode1004 最大连续1的个数 4 leetcode1685 将x减到0的最小操作数 5 le
  • log4j中appender的简介说明

    转自 log4j中appender的简介说明 下文笔者将讲述log4j中的appender的简介说明 如下所示 log4j的appender的功能 log4j中appender的功能 用于定义输出文件的方式 有以下5种输出方式可定义 1 o
  • java使用jsch连接ssh远程服务器

    java这边没有很好的封装工具连接ssh jsch使用起来只是略微方便一点 使用的时候可以封装成工具自己使用 jsch有2种方式和客户端进行交互 ChannelShell和ChannelExec ChannelShell和ChannelEx
  • 初级教程之---delphi调试

    一 准备调试 Delphi 在 IDE 内部集成了一个调试器 因而对程序的调试不用离开集成开发环境 IDE 就可以进行 该调试器能够控制程序的运行 监视程序的输出 检查和修改变量的值 在调试程序之前 必须保证程序代码已经没有语法错误 还要正