调试 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: 准备
复制要调试的类。
步骤
在 ABAP 编辑器中打开全局类 /LRN/CL_S4D400_BTT_DEBUG 的源代码。
在 Eclipse 工具栏中,选择打开 ABAP 开发对象。或者,按
Ctrl + Shift + A。输入
/LRN/CL_S4D400_BTT作为搜索字符串。从开发对象列表中选择 /LRN/CL_S4D400_BTT_DEBUG,然后选择确定。
将项目浏览器视图与编辑器链接。
在项目浏览器工具栏中,找到与编辑器链接按钮。如果尚未按下,请选择它。因此,应在项目浏览器中突出显示在编辑器中打开的开发对象。
将类 /LRN/CL_S4D400_BTT_DEBUG 复制到您自己的包中的类(建议名称:ZCL_##_DEBUG,其中 ## 代表组编号)。
在项目浏览器视图中,右键单击类 /LRN/CL_S4D400_BTT_DEBUG 以打开内容菜单。
从上下文菜单中,选择复制 ....
输入包名称(
ZS4D400_##,其中 ## 代表组编号)和新类的名称 (ZCL_##_DEBUG),然后选择下一步。确认传输请求并选择完成。
激活并测试类。
按
Ctrl + F3激活类。按
F9键运行类。检查控制台视图中的输出。
检查应作为编辑器视图下方的新标签打开的 控制台 视图。
如果控制台视图不可见,请选择窗口→显示视图→其他将其打开。双击命中列表中的控制台。
任务 2: 分析起始值
在方法 if_oo_adt_classrun~main() 的第一个可执行语句中输入调试器,并分析某些变量和常量数据对象的值。
步骤
在不定义类型或声明数据对象的第一个 语句处设置断点。
提示
TYPES 定义数据类型,CONSTANTS 声明常量数据对象,DATA 声明变量数据对象。
双击行
loan_remaining = loan_total.旁的编辑器左边距以设置断点。将类作为控制台应用运行并输入调试程序。
按
F9键运行类。如果系统询问您是否要切换到调试透视图,请标记记住我的决定,然后选择确定。
在变量视图中显示数据对象
loan_remaining和loan_total的值。在当前代码行(背景为绿色的行)中,双击
loan_remaining。在同一代码行中,双击
loan_total。
任务 3: 控制程序执行
设置断点和观察点。执行单个步骤或继续执行,直到到达下一个断点或观察点。监督数据对象的值更改。
步骤
执行单个步骤以调试当前行中的值分配。
在工具栏中,选择步入 (F5) 或按
F5。检查
loan_remaining的值是否从0..00更改为5000.00。显示数据对象
spec_repay_mode的内容。然后执行另一个步骤以查看执行 CASE - 控制结构的 WHEN 分支。在下一代码行中,双击
spec_repay_mode。按
F5查看程序跳转到代码行WHEN 'Q'.。为变量
loan_remaining设置一个观察点并恢复程序执行。程序执行在何处再次停止?在*"变量"*视图中,右键单击 LOAN_REMAINING,然后选择"设置观察点"。
在工具栏中,选择恢复 (F8) 或按
F8。程序执行在代码行
loan_remaining = loan_remaining - repayment_month.之后立即停止,同样精确,在具有可执行代码的下一代码行中。显示数据对象
repayment_plan的内容。然后执行另一个步骤来查看它如何用 APPEND 语句填充。
注意
由于 repayment_plan 是内部表,因此它不仅显示在变量视图中,还显示在编辑器下的 ABAP 内部表(调试器)视图中。
双击 APPEND 语句末尾的
repayment_plan。按
F5键查看repayment_plan如何填充第一行。检查 APPEND 语句中的字符串模板,并将其与内部表
repayment_plan中生成的第一行相关联。显示嵌入表达式中显示的数据对象的内容。双击花括号之间出现的数据对象以显示其内容。
为变量
repayment_plan设置另一个观察点并恢复程序执行几次。只要执行达到其中一个观察点,就会分析loan_remaining的值,并将新行添加到repayment_plan中。在*"变量"视图中,右键单击 REPAYMENT_PLAN 并选择"设置观察点*"。
按
F8恢复程序执行。分析变量视图和 *ABAP 内部表(调试器)*视图中的数据对象。
一段时间后,为所有 EXIT 语句设置语句断点,并删除两个观察点。
导航至断点视图。
提示
您可以在变量视图旁找到断点视图。
在断点视图的工具栏中,展开最左侧的下拉按钮,然后选择添加语句断点 ....
在出现的对话框窗口中,输入
EXIT作为搜索字符串,单击命中列表中的值 EXIT,然后选择确定。在断点视图中,右键单击观察点 LOAN_REMAINING,然后选择移除。
在断点视图中,右键单击观察点 REPAYMENT_PLAN,然后选择移除。
继续执行程序,直到到达第一个 EXIT 语句。取消激活
EXIT语句的语句断点。然后执行单个步骤,直到到达程序的输出部分。按
F8恢复程序执行。切换到断点视图并取消选择显示
EXIT \[语句\]的行。按
F5,直到到达以out->write(开头的第一个代码行。打开控制台视图。执行其余程序并在控制台视图上查找输出。 不要按 F5 键调试输出。请改用 F6 。
注意
正如您将在后面的课程中了解到的 out->write( ... ) 不是 ABAP 语句,而是由许多 ABAP 语句组成的可重用代码块。按 F5 进入此代码,对其进行详细分析。使用 F6,您可以跳过代码块,将其视为单个语句。
多次按
F6,直到到达应用程序末尾。分析控制台视图上的附加输出,并将其与上一代码行中的字符串模板进行比较。
应用程序终止时,不要忘记切换回 ABAP 透视图。
选择 Eclipse 工具栏最右侧的 ABAP。