本文从传统的 SAPGUI,ABAP Development Tool 和 SAP BTP ABAP 编程环境这三种不同的平台,分别和大家聊一聊。
本文阅读目录
SAPGUI 下的 ST22
ABAP Development Tool 里的 Feed Reader
SAP BTP ABAP Runtime Errors Fiori 应用
笔者刚加入 SAP 没多久,参加了一个 ABAP 后台作业相关的产品开发。
用户在浏览器 UI 界面点击 Save 按钮,会触发一个 ABAP 后台作业的执行。
当时项目需要用同一段 ABAP 程序,处理好几种场景。
在开发过程中,某些场景下后台作业会出现运行时异常,在事务码 ST22 里会生成一条记录。那时候我一直没能找到稳定复现该错误的方法,所以那段时间我很害怕打开 ST22,担心打开之后,又看到一条出错的记录。
后来慢慢有了经验,工作中也开始处理客户报过来的 incident.
对于发生在客户生产系统上的运行时错误,尤其是需要进行某些写操作,比如修改订单金额或者产品单价才会触发的运行时错误(正式称呼是会产生 Side-Effect 的操作),根本不允许我们通过重复执行操作,然后单步调试的方式来定位问题。
此时仔细分析 ST22 里的运行时错误记录数据,几乎是错误排查的唯一途径了。
SAPGUI 下的 ST22
我们在 SAPGUI 里通过 SE38 或者 SE80 执行 ABAP 程序,出现运行时错误,有且仅有一次机会,通过 ST22 界面的 Debugger 按钮,重返出现错误的案发现场。
点击 Debugger 按钮,会自动弹出 ABAP 调试器。
在 ABAP 调试器里查看出现错误现场的方便之处是,我们可以在调试器里查看任意变量的值,以及随意切换调用栈,来弄清楚多层函数的调用关系。
如果关闭调试器,再次启动 ST22 事务码后,会发现此时 Debugger 按钮已经从工具栏上消失了。
之后我们如果想查看调用栈,或者查看出现运行时错误的 ABAP 变量值,只能通过双击 ST22 左侧的菜单项来完成,这就没有在 ABAP 调试器里操作那么直观。
还有的朋友吐槽,说 ST22 事务码的 Selected Variables 面板里,变量显示值的可读性不高。
本文简单解释一下。
以下图为例,出现运行时异常的 ABAP 程序名称为 ZBOOK, 这个名称包含在系统变量 SY-REPID 里。
大写字母 Z 的 ASCII 编码为 5A,大写字母 B 的 ASCII 编码为 42,O 为 4F,K 为 4B,因此我们看到下图绿色,蓝色,灰色,紫色和红色的竖条高亮区域,显示的就是这五个大写字母的对应编码。
因为是从上到下依次显示,不太符合大家平素从左到右的阅读习惯。
从 4B 之后的右侧一列开始,每列全是 20,这是为什么?20 是空白字符的 ASCII 编码,而 SY-REPID 的数据类型是 CHAR40,ZBOOK 占据了五个字符,后面剩下三十五个字符的位置,通过空白字符补足,而空白字符的 ASCII 编码正是 20,如下图图例 1 所示。
下图图例2 所示,为什么 5A,42,4F 底部都多了一个 00?
在笔者下面两篇文章已经提到过,根据 SAP 帮助文档,ABAP 采用 UCS-2 编码方式,可以看成 UTF-16 的子集,因为 UCS-2 不支持 UTF-16 的 surrogates 区间内定义的一些特殊符号。
所谓 UTF-16,就是所有字符固定都用两个字节表示。因此大写字母 Z,在 ABAP 的 UCS-2 编码方式里就是 5A00,以此类推。
上图图例3,又将 ZBOOK 这个字符串的每个字符的 ASCII 编码,从左到右依次排列。最后一个字母 K 后面的空白位置,用空白字符的编码 2000 去填充。2000 会重复 35 次,因此有了上图图例 3 绿色区域的显示。
ST22 里显示的运行时错误的抬头级别的数据,存储在数据库表 SNAP 里。
有意思的是,ST22 显示页面也留了一个增强点,大家可以通过这个增强点,绘制一些自定义图案,比如佛祖保佑,永无 Bug 之类的祈福语句。
感兴趣的朋友可以参考笔者这篇文章:
你的 ABAP 程序给佛祖开过光么?来试试 Jerry 这个小技巧
ABAP Development Tool 里的 Feed Reader
ABAP Development Tool 里的运行时错误查看方式,采取了信息流推送的方式,即所谓的 Feed Reader.
当前登录 ABAP Development Tool 的用户所产生的运行时错误,会以类似工作流行项目(Workflow Item)的形式,自动推送到 Feed Reader 面板去。每个运行时错误还具有是否阅读的状态标志位。
除此之外,ABAP 运行时错误的查看方式,与 SAPGUI 基本相同,这也减少了从 SAPGUI 迁移过来的 ABAP 开发人员的学习成本。
不过,在本文前一章节里介绍的 SAPGUI 中能够显示发生错误时某些 ABAP 变量值的功能,在 ABAP Development Tool 中已经不复存在了。
如果确实需要查看的话,可以打开 ABAP Development Tool 里嵌入的 SAPGUI 窗口。
如果要按照其他条件,查询系统里某些特定类型的运行时错误,可以新建一个 feed query:
自定义查询条件即可:
总之,ABAP Development Tool 里查询 ABAP 运行时错误的方式,和 SAPGUI 里的 ST22 差异不大。如果实在不能适应其操作习惯,还可以回退到 ADT 里嵌入的 SAPGUI 窗口来操作。
SAP BTP ABAP Runtime Errors Fiori 应用
在 SAP BTP ABAP 编程环境里,我们使用名叫 ABAP Runtime Errors 的 Fiori 应用,在浏览器环境里查看 ABAP 运行时错误。
在 Fiori Launchpad 里点击对应的 Tile 访问应用。
界面是一个典型的 Fiori Elements List Report 应用。通过 Smart Filter Bar 区域提供的查询条件,来搜索指定的 ABAP 运行时错误。
选中某个行项目,可以进入该运行时错误的明细页面。
明细页面采用 Fiori Elements 的 Object Page 模版实现,在 General 面板可以看到引起运行时错误的异常信息,错误分析和发生该错误的 ABAP 程序名称。
Source Code Extract 面板,能显示到底是哪一行 ABAP 代码,引发了当前正在查看的 ABAP 运行时错误。
点击 Go to Line with Runtime Error,就能自动跳转到通过浏览器页面显示的 ABAP 源代码,并自动定位到引起运行时错误的那一行 ABAP 代码。
点击 ABAP Code Location(ADT),可以自动打开 ABAP Development Tool,并定位到引起运行时错误的那一行 ABAP 代码,如下图所示。
当然也可以通过 Active Calls/Events 面板来查看运行时错误发生时的 ABAP 程序调用栈和上下文信息。
既然我们是通过这个 Fiori 应用来查看运行时错误,那么通过笔者之前文章介绍的 Fiori 应用索引大全,可以查看到这个 Fiori 应用的更多技术信息。
打开 Fiori App Library,根据关键字 ABAP Runtime Errors 进行搜索,可以找到其详细信息:
https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/index.html#/detail/Apps('F7770')/S33
该应用从 SAP BTP 后台读取当前 tenant 上 ABAP 运行时错误的数据,使用的 OData 服务名称为 TMO_UI_RE_O2.
然后通过 Chrome 开发者工具的 Network 面板,就能找到读取 ABAP 运行时错误的 OData 服务请求了,如下图所示。
当前 ID 为 100 的 tenant 上的 ABAP 运行时错误的记录总数(7197条),以及前 20 条数据,通过该 OData Batch 请求的 inlinecount 和 skip=0&$top=20 参数读取。
总结
本文比较了 SAPGUI,ABAP Development Tool 和 SAP BTP ABAP 三种 ABAP 环境下,查看运行时错误的方式,以及这些环境下运行时错误数据的存储和读取方式,希望对 ABAP 从业者们有所帮助。