调试 ABAP 程序

学习目标

  • 进入调试模式。

  • 控制代码的执行。

  • 分析数据对象的内容。

调试模式

观看此视频以了解调试的需求。

视频:本节含 SAP 官方视频(视频 ID 1_lwyuafsc),需在 learning.sap.com 在线观看。

启动调试器

要调试 ABAP 程序,请设置断点,然后正常运行程序。当程序到达断点时,系统会中断它并在 ADT 中打开 ABAP 调试透视图。然后,您可以单独执行每个后续语句,以查看其对程序产生的影响。还可以检查程序中所有变量的内容,以查看是否有任何意外值。

要设置或移除断点,请右键单击编辑器的左边距,然后选择切换断点。或者,您可以双击左边距。请注意,必须先激活程序,然后才能设置断点。

断点是用户特定且持久的 - 即使已从 ADT 注销并再次返回后,它们仍保持活动状态。为防止调试器在断点处启动,您必须删除断点(使用切换断点功能)或使用上下文菜单中的相应功能将其取消激活。

注意

根据您的个性化设置,ADT 将首先要求确认,然后再自动打开调试透视图。

ADT 中的调试透视图

使用 ABAP 开发工具调试 ABAP 程序时,使用调试透视图。这是标准 Eclipse 调试透视图的定制版本,其中包含对调试尤为重要的视图和功能。

让我们看一下调试器透视图的一些重要元素。

视频:本节含 SAP 官方视频(视频 ID 1_j5gmo2p6),需在 learning.sap.com 在线观看。

如何启动调试器

演示观看演示(SAP 官方交互式练习)

代码执行控制

一些导航功能

开始调试后,使用导航功能控制代码的执行。

一些重要的导航功能如下:

步入 (

F5

)

选择 Step In 或按 F5 执行单个步骤。使用此功能进行逐步分析。例如,如果要查看实际执行的控制结构的代码块。

恢复 (

F8

)

选择恢复或按 F8 执行程序,直到下一个断点。如果调试程序不再命中断点,则程序将一直执行,调试会话将终止。

运行到行 (

Shift+F8

)

选择运行至行或Shift+F8 执行程序,直到当前光标位置。单击代码行并选择此功能是设置断点、选择恢复并再次移除断点的便捷替代方法。

跳转到行 (

Shift+F12

)

选择 跳转至行 或按 Shift+F12 跳过某些代码行,或向后跳转到某些已执行的代码。此功能有助于模拟移除特定代码时将发生的情况,或重复调试您首次错过分析的一些代码。请记住,这实际上是跳跃,而不是执行编码。向后跳转时,对数据对象的更改不会还原!

终止

如果您已完成调试并且不想执行剩余程序,请选择终止。调试会话立即终止。

特殊断点

您了解到可以通过单击 ABAP 编辑器视图的左边距来创建和管理断点。这也适用于调试透视图中的 ABAP 编辑器视图。

此外,您可以切换到断点视图并在其中管理断点。

在断点视图中,您还可以创建特殊断点:

语句断点

语句断点未附加到特定代码行,而是附加到特定 ABAP 语句。例如,语句 CLEAR 上的语句断点会导致每当执行 CLEAR 语句时,程序都会在调试程序中停止 - 无论此语句位于何处。

要创建语句断点,请从断点视图的工具栏中打开下拉列表,然后选择添加语句断点...

异常断点

异常断点附加到特定异常。每当出现此特定异常时,都会导致程序在调试器中停止 - 无论此异常是由程序处理还是导致运行时错误。要创建异常断点,请从断点视图的工具栏中打开下拉列表,然后选择添加异常断点…。

条件断点

通过添加条件将断点转换为条件断点。如果程序执行遇到条件断点,则程序仅在满足条件时在调试器中停止。例如,如果断点位于 DO 和 ENDDO 之间,将导致程序在每次迭代时在调试器中停止。但是,如果添加条件 sy-index > 20,调试程序将在前 20 次迭代期间忽略此断点,并且仅在后续迭代中停止。

要将条件添加到断点,请在断点列表中选择该条件,然后在条件字段中输入条件。按回车保存具有条件的断点。

观察点

如果变量的意外值导致出现问题,可以在程序过程中使用观察点跟踪变量的值。

观看此视频,了解如何操作。

视频:本节含 SAP 官方视频(视频 ID 1_dso8gyzh),需在 learning.sap.com 在线观看。

如何控制代码的执行

演示观看演示(SAP 官方交互式练习)

数据对象的分析

显示数据对象的内容

观看此视频,了解如何在调试器中显示数据对象的内容。

视频:本节含 SAP 官方视频(视频 ID 1_yqvsxfdr),需在 learning.sap.com 在线观看。

显示内部表的内容

观看此视频,了解如何显示内部表的内容。

视频:本节含 SAP 官方视频(视频 ID 1_ydxx5fo0),需在 learning.sap.com 在线观看。

更改变量的值

根据您的权限,您可以在调试期间更改变量的值。

对于简单变量,在"变量"视图中找到该变量,右键单击该变量,然后选择"更改值..."

要更改内部表的内容,我们必须区分更改现有行的值以及添加或删除行。

如图所示,当您在 ABAP 内部表视图中右键单击时,可以使用以下功能:

更改值…

选择

更改值...

更改现有行的内容。

插入行…

选择

插入行...

以添加新行。您可以决定是要附加新行,还是将其插入所选位置。

删除所选行

选择

删除所选行

,移除右键单击之前选择的行。要选择行,左键单击它。要选择多行,请在左键单击其他行时按住

Ctrl

键或

Shift

键。

删除行…

选择

删除行...

以移除更大的行范围,甚至删除所有行。系统将要求您提供要删除的开始行的编号,以及结束行的编号。

如何分析数据对象的内容

演示观看演示(SAP 官方交互式练习)

调试 ABAP 代码

在本练习中,您将使用 ABAP 调试器分析 ABAP 代码。

模板:

  • /LRN/CL_S4D400_BTT_DEBUG(全局类)

解决方案:

  • 无,类保持不变。

任务 1: 准备

复制要调试的类。

步骤

  1. 在 ABAP 编辑器中打开全局类 /LRN/CL_S4D400_BTT_DEBUG 的源代码。

  2. Eclipse 工具栏中,选择打开 ABAP 开发对象。或者,按 Ctrl + Shift + A

  3. 输入 /LRN/CL_S4D400_BTT 作为搜索字符串。

  4. 从开发对象列表中选择 /LRN/CL_S4D400_BTT_DEBUG然后选择确定

  5. 将项目浏览器视图与编辑器链接。

  6. 在项目浏览器工具栏中,找到与编辑器链接按钮。如果尚未按下,请选择它。因此,应在项目浏览器中突出显示在编辑器中打开的开发对象。

  7. 将类 /LRN/CL_S4D400_BTT_DEBUG 复制到您自己的包中的类(建议名称:ZCL_##_DEBUG,其中 ## 代表组编号)。

  8. 在项目浏览器视图中,右键单击类 /LRN/CL_S4D400_BTT_DEBUG 以打开内容菜单。

  9. 从上下文菜单中,选择复制 ....

  10. 输入包名称(ZS4D400_## ,其中 ## 代表组编号)和新类的名称 (ZCL_##_DEBUG),然后选择下一步

  11. 确认传输请求并选择完成

  12. 激活并测试类。

  13. Ctrl + F3 激活类。

  14. F9 键运行类。

  15. 检查控制台视图中的输出。

  16. 检查应作为编辑器视图下方的新标签打开的 控制台 视图。

  17. 如果控制台视图不可见,请选择窗口显示视图其他将其打开。双击命中列表中的控制台

任务 2: 分析起始值

在方法 if_oo_adt_classrun~main() 的第一个可执行语句中输入调试器,并分析某些变量和常量数据对象的值。

步骤

  1. 在不定义类型或声明数据对象的第一个 语句处设置断点。

提示

TYPES 定义数据类型,CONSTANTS 声明常量数据对象,DATA 声明变量数据对象。

  1. 双击行 loan_remaining = loan_total.旁的编辑器左边距以设置断点。

  2. 将类作为控制台应用运行并输入调试程序。

  3. F9 键运行类。

  4. 如果系统询问您是否要切换到调试透视图,请标记记住我的决定然后选择确定

  5. 变量视图中显示数据对象 loan_remainingloan_total 的值。

  6. 在当前代码行(背景为绿色的行)中,双击 loan_remaining

  7. 在同一代码行中,双击 loan_total

任务 3: 控制程序执行

设置断点和观察点。执行单个步骤或继续执行,直到到达下一个断点或观察点。监督数据对象的值更改。

步骤

  1. 执行单个步骤以调试当前行中的值分配。

  2. 在工具栏中,选择步入 (F5) 或按 F5

  3. 检查 loan_remaining 的值是否从 0..00 更改为 5000.00

  4. 显示数据对象 spec_repay_mode 的内容。然后执行另一个步骤以查看执行 CASE - 控制结构的 WHEN 分支。

  5. 在下一代码行中,双击 spec_repay_mode

  6. F5 查看程序跳转到代码行 WHEN 'Q'.

  7. 为变量 loan_remaining 设置一个观察点并恢复程序执行。程序执行在何处再次停止?

  8. 在*"变量"*视图中,右键单击 LOAN_REMAINING,然后选择"设置观察点"。

  9. 在工具栏中,选择恢复 (F8) 或按 F8

  10. 程序执行在代码行 loan_remaining = loan_remaining - repayment_month. 之后立即停止,同样精确,在具有可执行代码的下一代码行中。

  11. 显示数据对象 repayment_plan 的内容。然后执行另一个步骤来查看它如何用 APPEND 语句填充。

注意

由于 repayment_plan 是内部表,因此它不仅显示在变量视图中,还显示在编辑器下的 ABAP 内部表(调试器)视图中。

  1. 双击 APPEND 语句末尾的 repayment_plan

  2. F5 键查看 repayment_plan 如何填充第一行。

  3. 检查 APPEND 语句中的字符串模板,并将其与内部表 repayment_plan 中生成的第一行相关联。显示嵌入表达式中显示的数据对象的内容。

  4. 双击花括号之间出现的数据对象以显示其内容。

  5. 为变量 repayment_plan 设置另一个观察点并恢复程序执行几次。只要执行达到其中一个观察点,就会分析 loan_remaining 的值,并将新行添加到 repayment_plan 中。

  6. 在*"变量"视图中,右键单击 REPAYMENT_PLAN 并选择"设置观察点*"。

  7. F8 恢复程序执行。

  8. 分析变量视图和 *ABAP 内部表(调试器)*视图中的数据对象。

  9. 一段时间后,为所有 EXIT 语句设置语句断点,并删除两个观察点。

  10. 导航至断点视图。

提示

您可以在变量视图旁找到断点视图。

  1. 断点视图的工具栏中,展开最左侧的下拉按钮,然后选择添加语句断点 ....

  2. 在出现的对话框窗口中,输入 EXIT 作为搜索字符串,单击命中列表中的值 EXIT然后选择确定

  3. 断点视图中,右键单击观察点 LOAN_REMAINING,然后选择移除

  4. 断点视图中,右键单击观察点 REPAYMENT_PLAN,然后选择移除

  5. 继续执行程序,直到到达第一个 EXIT 语句。取消激活 EXIT 语句的语句断点。然后执行单个步骤,直到到达程序的输出部分。

  6. F8 恢复程序执行。

  7. 切换到断点视图并取消选择显示 EXIT \[语句\] 的行。

  8. F5,直到到达以 out->write( 开头的第一个代码行。

  9. 打开控制台视图。执行其余程序并在控制台视图上查找输出。 不要按 F5 键调试输出。请改用 F6 。

注意

正如您将在后面的课程中了解到的 out->write( ... ) 不是 ABAP 语句,而是由许多 ABAP 语句组成的可重用代码块。按 F5 进入此代码,对其进行详细分析。使用 F6,您可以跳过代码块,将其视为单个语句。

  1. 多次按 F6,直到到达应用程序末尾。

  2. 分析控制台视图上的附加输出,并将其与上一代码行中的字符串模板进行比较。

  3. 应用程序终止时,不要忘记切换回 ABAP 透视图

  4. 选择 Eclipse 工具栏最右侧的 ABAP