Jerry帶您瞭解Restful ABAP Programming模型系列之三:雲端ABAP應用調試

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

clipboard1,1

其實實際閱讀量遠大於14萬,因爲2016年SAP社區改版,之前的閱讀量清零了。

這個數字也說明廣大SAP開發者們對代碼調試這個話題的重視程度。

clipboard2,2

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:

clipboard3,3

不幸的是,我沒能看到期望中的狀態變化,而是下面這個所有ABAP編程人員都不願意看見的ABAP運行時錯誤提示界面。

clipboard4,4

不過,大家注意到了上圖右下角的Debug超鏈接麼?和SAPGUI一樣,點擊之後立即就能打開調試器,能夠觀察發生這個運行時錯誤的調用棧,引起錯誤的詳細代碼位置和相關變量的值。

順便提一句,如果您想自定義在SAP GUI裏出現的ABAP運行時錯誤顯示(就是在On-Premises環境下ST22事務碼裏看到的內容),比如添加一段"佛祖保佑,永無BUG",那麼可以參考Jerry這篇文章:

你的ABAP程序給佛祖開過光麼?來試試Jerry這個小技巧

clipboard5,5

回到ABAP Development Tool裏,我們先點擊Show超鏈接,就可以看到運行時錯誤明細:Short Text告訴我們,我們點擊Accept按鈕後,相關的處理框架有意地拋出一個CX_CSP_ACT_RESPONSE的異常。拋出異常的位置是在程序CL_CSP_ACT_CHECK_FEATS_ACTIONS裏,這暗示我們,這個錯可能和Action執行前的檢查(CHECK)有關。

clipboard6,6

繼續向下滑動鼠標,發現在框架代碼內,因爲從第353行內表it_feature_result裏沒有讀出任何內容,因此sy-subrc不爲0,導致進入第355行的RAISE SHORTDUMP分支。

clipboard7,7

在SAP Cloud Platform ABAP環境下當前登錄用戶發生的所有運行時錯誤,可以在ABAP Development Tool的Feed Reader視圖下查看,這個功能相當於SAP GUI裏的ST22事務碼。

clipboard8,8

現在我們關於這個運行時錯誤的靜態信息瞭解得差不多了,下一步在調試器裏觀察。

重新啓動Fiori應用,再次點擊Accept按鈕,出現運行時錯誤後點擊Debug超鏈接,ABAP調試器自動彈出,引起運行時錯誤的那一行代碼被高亮,同時左邊顯示出調用棧。
clipboard9,9

把鼠標放在it_feature_result上,發現這個內表是空的,當然無法從裏面讀出數據了。這個內表是當前ABAP類CL_CSP_ACT_CHECK_FEATS_ACTIONS的方法handle_rejected_instances的輸入參數,需要搞清楚爲啥這個輸入參數爲空。

clipboard10,10

從拋出運行時異常的棧幀往外看一幀,就知道這個輸入的內表是通過第291行的execute_feature_controllers生成的,這個方法會通過回調函數的方式,調用我們在Behavior Definition實現的一個get_features方法裏:

clipboard11,11

這裏我們就找到了引起這個運行時錯誤的根源:因爲之前Jerry出於測試目的,註釋了一段代碼,導致get_features被框架回調時,沒有返回框架期望的數據:

clipboard12,12

當Jerry把這段需要的代碼重新enable然後設置斷點,點擊Accept按鈕,通過調用棧可以清晰看到框架的execute_feature_controllers是如何調用到我們實現的get_features回調方法的。

clipboard13,13

希望通過Jerry這個簡單的例子能夠讓大家對SAP Cloud Platform ABAP編程環境裏如何進行調試有一個初步的印象,感謝閱讀。

要獲取更多Jerry的原創文章,請關注公衆號"汪子熙":
公衆號截圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章