共计 2102 个字符,预计需要花费 6 分钟才能阅读完成。
Jerry 的 Restful ABAP Programming 模型介绍系列的前两篇文章:
- 30 分钟用 Restful ABAP Programming 模型开发一个支持增删改查的 Fiori 应用
- Jerry 带您了解 Restful ABAP Programming 模型系列之二:Action 和 Validation 的实现
今天咱们来聊聊 SAP 云平台 ABAP 环境上的调试问题。
Jerry 在 SAP 社区上写了 600 多篇博客,阅读量最高的大概要算下面这篇写于 2013 年的文章:Six kinds of debugging tips to find the source code where the message is raised
其实实际阅读量远大于 14 万,因为 2016 年 SAP 社区改版,之前的阅读量清零了。
这个数字也说明广大 SAP 开发者们对代码调试这个话题的重视程度。
Jerry 之前在 SAP Cloud Platform 上进行 nodejs 和 Java 开发的时候,对运行在云上的用这两门语言开发的应用的单步调试很头痛。尽管仍然可以通过 Jerry 这篇文章 如何提高后台服务应用问题的排查效率?日志 VS 远程调试 里介绍的端口映射方式实现在本地电脑上调试云端应用的功能,但 Jerry 还是怀念 On-Premises ABAP 里面那种单步调试的便捷性——鼠标轻轻一点,断点即设置好,无需任何配置,立即就能进行单步调试。
那么现在 ABAP 到了云端后,其单步调试还和之前的 On-Premises 环境里一样易于使用么?答案是肯定的。
咱们就拿一个具体例子来体验。
Jerry 通过 Restful ABAP Programming 系列的前两篇,已经开发出了一个支持增删改查,支持自定义数据校验和 Action 的 Fiori 应用。
我选中 ID 为 103 这条记录,点击 Accept Travel 按钮后,期望通过该 Action 将其状态设置为 Accepted:
不幸的是,我没能看到期望中的状态变化,而是下面这个所有 ABAP 编程人员都不愿意看见的 ABAP 运行时错误提示界面。
不过,大家注意到了上图右下角的 Debug 超链接么?和 SAPGUI 一样,点击之后立即就能打开调试器,能够观察发生这个运行时错误的调用栈,引起错误的详细代码位置和相关变量的值。
顺便提一句,如果您想自定义在 SAP GUI 里出现的 ABAP 运行时错误显示(就是在 On-Premises 环境下 ST22 事务码里看到的内容),比如添加一段 ” 佛祖保佑,永无 BUG”,那么可以参考 Jerry 这篇文章:
你的 ABAP 程序给佛祖开过光么?来试试 Jerry 这个小技巧
回到 ABAP Development Tool 里,我们先点击 Show 超链接,就可以看到运行时错误明细:Short Text 告诉我们,我们点击 Accept 按钮后,相关的处理框架有意地抛出一个 CX_CSP_ACT_RESPONSE 的异常。抛出异常的位置是在程序 CL_CSP_ACT_CHECK_FEATS_ACTIONS 里,这暗示我们,这个错可能和 Action 执行前的检查 (CHECK) 有关。
继续向下滑动鼠标,发现在框架代码内,因为从第 353 行内表 it_feature_result 里没有读出任何内容,因此 sy-subrc 不为 0,导致进入第 355 行的 RAISE SHORTDUMP 分支。
在 SAP Cloud Platform ABAP 环境下当前登录用户发生的所有运行时错误,可以在 ABAP Development Tool 的 Feed Reader 视图下查看,这个功能相当于 SAP GUI 里的 ST22 事务码。
现在我们关于这个运行时错误的静态信息了解得差不多了,下一步在调试器里观察。
重新启动 Fiori 应用,再次点击 Accept 按钮,出现运行时错误后点击 Debug 超链接,ABAP 调试器自动弹出,引起运行时错误的那一行代码被高亮,同时左边显示出调用栈。
把鼠标放在 it_feature_result 上,发现这个内表是空的,当然无法从里面读出数据了。这个内表是当前 ABAP 类 CL_CSP_ACT_CHECK_FEATS_ACTIONS 的方法 handle_rejected_instances 的输入参数,需要搞清楚为啥这个输入参数为空。
从抛出运行时异常的栈帧往外看一帧,就知道这个输入的内表是通过第 291 行的 execute_feature_controllers 生成的,这个方法会通过回调函数的方式,调用我们在 Behavior Definition 实现的一个 get_features 方法里:
这里我们就找到了引起这个运行时错误的根源:因为之前 Jerry 出于测试目的,注释了一段代码,导致 get_features 被框架回调时,没有返回框架期望的数据:
当 Jerry 把这段需要的代码重新 enable 然后设置断点,点击 Accept 按钮,通过调用栈可以清晰看到框架的 execute_feature_controllers 是如何调用到我们实现的 get_features 回调方法的。
希望通过 Jerry 这个简单的例子能够让大家对 SAP Cloud Platform ABAP 编程环境里如何进行调试有一个初步的印象,感谢阅读。
要获取更多 Jerry 的原创文章,请关注公众号 ” 汪子熙 ”: