Jerry的Restful ABAP Programming模型介绍系列的前两篇文章:node
今天我们来聊聊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里面那种单步调试的便捷性——鼠标轻轻一点,断点即设置好,无需任何配置,当即就能进行单步调试。 spa
那么如今ABAP到了云端后,其单步调试还和以前的On-Premises环境里同样易于使用么?答案是确定的。debug
我们就拿一个具体例子来体验。3d
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 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的原创文章,请关注公众号"汪子熙":