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的原創文章,請關注公衆號"汪子熙":