ZT - 使用 IBM Debugger for AIX 来提高开发效率(3)

高级调试

这部分将会讨论 IBM 调试器工具中可用的更多高级特性。它们可以支持更快的问题解决方法,并实现使用 IBM 调试器的主要优势。

[@more@]

高级调试

这部分将会讨论 IBM 调试器工具中可用的更多高级特性。它们可以支持更快的问题解决方法,并实现使用 IBM 调试器的主要优势。

中断点状况

有时有一段代码会得到多次的重复访问,有时甚重由不同的线程访问,但是如果达到某种特定的状况时,您只想停止其中的一段代码。此时就是中断点向导的状况页面大有用武之地的地方了。第二个,可选性页面(您可以从主页面中选择 Next 而不是 Finish 来打开该页面)允许您去处理这种情况。您还可以控制您想要终止的线程,中断的频率,甚重定义在中断以后必须为真的逻辑表达式。在同一位置处您还可能拥有多个状况性的中断点;它们可以从中断点视图中得到轻松激活或者禁止。

各种中断点类型

AIX 工具的 IBM 调试器提供了以下的中断点类型。

  • Address:当执行指针达到程序中一个特定的地址时会暂停一个程序。当您从单独或者混合模式下的源视图中设置一个中断点,也可以创建一个中断点类型。这就允许您进一步完善地指定调试器应该在什么地方中断。
  • Entry:当执行将要输入给定的函数时暂停程序。可以在 Modules 视图中右击一个条目来创建这种类型的中断点。如果函数在模块视图中没有进行监听,因为可执行的包含部分没有得到载入,那么您就可以创建一个进入中断点。
  • Line:当执行达到给定的源代码行时暂停程序,也可以从源视图中进行创建。您可以为尚未达到的位置及尚未载入的模块设置行与条目。查看文献以得到关于怎样去做的具体指导信息。
  • Load: 当载入给定的库时暂停程序。
  • Watch:当内存指定的部分发生改变时暂停程序。

所有中断点都可以从中断点视图内容菜单中得到创建。

模块

模块视图提供了用于创建程序的源文件的代表,包括它们所提供的函数定义。从模块视图中打开这些文件来在源文件编辑器中查看它们。右击视图中的函数元素来设置中断点。


图 6. 模块视图
列出函数的图,根据源文件来分组

监视器

监视器视图允许您轻松地访问并更改您所感兴趣的变量。例如,每一次程序暂停时,您都可以检查特定变量或者表达式的值,您可以为变量或者表达式创建一个监视器,而且该监视器稍后在监视器视图中可以看到。对于查看一些全局性变量来时十分有用,因为它们会在调试过程中发生变更。您可以监视任意有效的表达式,例如简单的局域变量,以及一个数组中的特定索引。

在下面的一个范例中,假设您在程序的第 22 行中有一个中断点。不管何时触动了该中断点,您都可以决定 i 是奇数的还是偶数的。


图 7. 监视的一个表达式
显示行 22:if ((i % 2) == 0) { 的屏幕截图

为了完成此项操作,您可以为表达式 "(i % 2) == 0". 添加一个表达式。实现这一点有很多种方式。在编辑器中,您可以右击表达式,右击,并从弹出菜单中选择 Monitor Expression


图 8. 监视器视图中的监视器
监视器  (i % 2) == 0 = true 的图

在每一步之后,监视器的值都会得到更新,而且一旦它被改动了,那么可以轻松地识别出来。您有好几种方式来添加监视器:您可以从变量视图或者监视器视图通过点击监视器视图中的 绿色加号符号 按钮,并输入要监视的表达式,来监视一个局域变量。

如果您想要监视一个或者多个全局性变量,那么您可以从监视器视图的内容菜单中选择 Select Globals list 来从全局性变量中的列表中选择一个。您还可以从监视器视图中更改一个监视变量的值,而且这种更改是十分有效的。

内存赋值与映射

内存视图允许您去检查并更改特定地址处内存的内容,通常是一个变量。您还可以选择内存以什么格式显示:十六进制、ASCII、EBCDIC、整数。其中地址用作表达式基础的表达式叫做内存监视器,而且您可以使用内存视图中的监视器窗格来添加和删除内存监视器。注意内存监视器不同于监视器视图中使用的监视器以及前文讨论过的监视器。

下面的图片向您展示了名为“it”的变量的 Signed Integer 内存赋值。变量在内存中的地址是 0x2FF22938,而它当前的值则是 10。


图 9. 见识内存视图中的变量
显示 0x2FF22938 处的内存更改为 10 的图片

您可以同时查看不同格式的内存的内容。


图 10. 查看整数形式以及十六制形式的变量
内存视图中分两边格式显示的图

内存视图中一个有用的特性便是内容菜单中的 Reset to Base Address 操作。如果您从赋值的起始地址处移开了,那么您可以使用该操作来轻松跳到该位置处。

映射内存

内存映射特性能够使您根据 XML 文件中所定义的布局来显示内存的某个区域。这是十分有用的,例如,如果您想要显示在程序外部定义的内存块,那么就可以用到上述特性了。

为了创建一个内存映射赋值,您需要在定义您想要使用的布局的文件系统上选择文件。您可以按照以下方法来为变量创建一个映射:在 Variables 或者 Monitors 视图中选择变量或者监视器,并从背景菜单中选择 Monitor Memory > Map... ,然后浏览以选择 XML 文件作为映射的布局使用。这将会(a)为 Memory 视图中的变量创建一个新的内存监视器,并(b)使用该文件创建一个新的内存映射复制。

在一个简单的实例中,内存映射工具使您能够为一个复杂的变量定义一个布局,例如一个集团或者一个结构。

查看以下的结构:

typedef struct {
  unsigned short ushort_val;
  short short_val;
  unsigned long ulong_val;
  long long_val;
  char string_val[12];
  char char_val;
} _test;

相应的布局文件应该如下所示 :

<?xml version="1.0"?>
  

这要比其他的赋值类型更加有用,因为它支持去检查内存的逻辑性结构。每一个“字段”都定义了内存 1 的命名区域或者更多的比特,以及一个在程序内容中有意义的可选文本描述。类型属性用于指示内存应该怎样赋值,以十六进制、十进制、ASCII 等等格式。还有一个好处是,内存映射可以沿着一个大概的、基于列的赋值处显示。

使用以上的 XML 文件,下面的屏幕截图会显示该结构实例的内存映射,如下所示。


图 11. 内存视图中显示的内存映射
显示内存映射布局的屏幕截图

查看一下具体的内存映射赋值,您可以看到有一些列提供了关于每一个字段的具体信息。

Value 列为每一个区域显示了内存的内容。而 Offset 列则显示了每一个区域的偏移。Description 列显示了用户提供的关于每一个区域的信息。对于添加额外的信息,这一点是十分有用的,特别是如果映射在开发员之间进行共享的话更是这样。描述可以得到编辑以进行赋值,而新的描述可以有选择性地自动保存到相应的 XML 文件中。为了激活该项特性,您可以从内存视图页面中打开 Memory 映射偏好页面,并确定 当编辑组与描述时,总是将更改保存到页面中 旁边的框框被选中了 。

为了更加容易的识别,内存赋值使用演示指示器来强调显示一个或者多个经过变更之后的比特。您还可以拥有同时显示的两个不同的赋值,一边一个,如下图所示 。


图 12. 更改多个同时赋值中显示的内存
显示内容更改块的图

左边的区域,被标记为“A”,它是监视器赋值所用的内存映射,同时右边的赋值区域,被标记为“B”,它包含了内存中相同区域内的整数代表。这就允许您使用内容映射来查看内存块的逻辑排列,以及结构之前及之后内存的内容。

内存映射工具有其他的特性或者使用,而且通过咨询官方的文件文献,您还可以学到更多的关于它们的知识。

显示注册表

您可以使用注册表视图,来检查和编辑不同注册表的内容。程序中的注册器被分为了三组:General、Floating Point 以及 Special Purpose。特定目的的注册器是系统定义的,屏幕界面中所列出的注册器是针对 AIX 的。IAR,也就是 Instruction Address Register,包含了当前指南的地址,这就是说,关于执行的指南。注册器视图类似于变量视图,在这个视图中通过强调更改项来指示更改的注册。注册也可以添加到监视器视图中以查看更改。而且,可以使用内存视图来查看它们的内存。


图 13. 从注册器视图中可见的程序中访问注册器
描述注册器视图内容的图

调试操控台

调试操控台支持对已存在的调试操作的命令行进行调试。您可以直接使用调试引擎来进行调试,并在调试操控台上查看得到的结果,这有助于进行互动性的交流。支持的命令是调试引擎附件,而且在 AIX 上,通过在调试操控台上输入“help”可以来将其显示出来。

在 AIX 上,您可以激活“echo”功能,而且稍后您输入的命令可以导出或者导入。这就允许您将您所做的操作“记录”到调试器中,并且生成一个可以重复使用的脚本以让您所调试的程序置于您想要的状态。在下面的屏幕截图中,右边的列就是命令列窗格,它是您所输入的所有命令的列表,而左边的列是命令历史窗格,它显示了输入命令的输出。您可以使用工具栏按钮来清除命令历史以及列表窗格,命令的导入、导出以及运行列表。


图 14. 调试操控台
显示带有命令行的调试操控台的图

调试多个程序

不管您是怎样启动一次调试过程的(通过命令行或者一个对话框),调试器 UI 都可以同时主宰任意数量的调试过程。正如您在前面提到的那样,每一个新的调试过程都由调试视图中的一个调试目标所代表。几乎所有其他视图的内容,包括源代码编辑器、监视器、注册表、模块、变量和内存视图,都会基于活动调试过程来得到更新。在调试视图中更改选择的调试目标,将会在操作之间进行切换,并更新剩余的视图。接下来的屏幕截图显示了带有两个调试操作的调试器。


图 15. 单个 UI 中运行的多个调试操作 UI
调试视图中显示两个调试操作的图

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16896827/viewspace-1036468/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16896827/viewspace-1036468/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值