實現ABAP條件斷點的三種方式

i042416發表於2020-02-05

本文是鼠年第3篇文章,也是汪子熙公眾號第202篇原創文章。

今天是大年初三,Jerry祝大家霍去病,辛棄疾,健健康康,長命百歲。

實現ABAP條件斷點的三種方式 實現ABAP條件斷點的三種方式

ABAP條件斷點這個話題,Jerry的同事曾經問過我,雖然小但很實用。

所謂條件斷點,就是設定在某行語句上的斷點,並不總是會觸發,而是僅當滿足一定條件時才觸發。

條件斷點的使用場合是什麼?

舉個簡單的例子,下圖第15行ADD語句設定一個斷點。因為它在一個具有1000行的內表迴圈體內,所以正常情況下會觸發1000次。

實現ABAP條件斷點的三種方式

假設我們在除錯一個bug,這個bug當迴圈到第999次時才出現,那我們前998次的單步除錯都是無效的。最高效的做法,就是藉助條件斷點的概念,讓斷點在程式碼執行到第999次迴圈時,觸發且僅觸發一次。

本文介紹實現ABAP條件斷點的三種方式。也歡迎大家分享自己最喜歡用的且本文尚未提到的條件斷點技術。

為了方便記憶,Jerry用天下會雄霸幫主的三種絕技來給這三種條件斷點的實現方式命名。

方法一

天霜拳 - 給ABAP斷點維護觸發條件

天霜拳,冰系技能,雄霸傳予大弟子秦霜。

天霜拳在馬榮成的《風雲》漫畫裡一共出現了14式:

  • 風霜撲面
  • 霜寒抱月
  • 霜結中霄
  • 霜雪紛飛
  • 霜冷長河
  • 霜痕累累
  • 霜凝見拙
  • 披霜撥露
  • 霜雪冰山
  • 傲雪凌霜:這是天霜拳的絕招,也是最為強勁的一招。一招四式(傲立孤峰、雪嶺尋梅、凌雲壓頂、霜河倒影),寒氣瀰漫,四下五丈之內都被凍成冰霜。

大師兄啊,在《風雲》裡是個杯具人物,唉。

實現ABAP條件斷點的三種方式

在ABAP偵錯程式裡點選Break/Watchpoints皮膚,新建一個斷點:

實現ABAP條件斷點的三種方式

在Free Condition Entry裡維護這個斷點的觸發條件。

回到我上面的例子,我的內表裡包含了從1到1000的整數,總共1000條記錄,而我的觸發條件維護為<data> = 22. 顯然,這個斷點在第22次迴圈時,唯一觸發一次。

實現ABAP條件斷點的三種方式

維護完畢後,我們在斷點皮膚裡看到了這個新建的斷點:

實現ABAP條件斷點的三種方式

按F8繼續除錯,斷點有且僅觸發了一次,此時<data>的值為22,正好符合我們維護的觸發條件,成功。

實現ABAP條件斷點的三種方式

方法二

排雲掌 - 利用ABAP偵錯程式裡的觀察點(Watchpoint)


小的時候看漫畫,覺得不哭死神步驚雲簡直是一個bug般的存在,會的技能之多令人髮指。

實現ABAP條件斷點的三種方式

僅《風雲》第一部裡,步驚雲就掌握了霍家劍法,悲痛莫名,排雲掌,聖靈劍法,麒麟臂,三霸劍等等。Jerry個人認為塑造得最成功出彩的,還要算那十二式變化莫測,名稱飄逸的排雲掌:

  • 行雲流水
  • 披雲戴月
  • 翻雲覆雨
  • 排雲倒海
  • 烏雲蔽日
  • 重雲深鎖
  • 撕天排雲
  • 雲海波濤
  • 燮雲無定
  • 殃雲天降
  • 愁雲慘淡

ABAP的偵錯程式,也和步驚雲的排雲掌一樣,使用方式變化多端。

此處建立Watchpoint:

實現ABAP條件斷點的三種方式

我們知道在LOOP迴圈體內,系統變數sy-tabix會自動賦以當前的迴圈次數。因此我們在Watchpoint的觸發條件裡,維護成sy-tabix = 22, 也可以達到在第22次迴圈時觸發的目的。

實現ABAP條件斷點的三種方式

Watchpoint建立好之後顯示如下:

實現ABAP條件斷點的三種方式

按F8繼續除錯,程式果然在第22次迴圈時觸發了:

實現ABAP條件斷點的三種方式

並且偵錯程式裡彈出一條提示資訊:Watchpoint reached

實現ABAP條件斷點的三種方式

方法三

風神腿 - ABAP Debugger Script

天下武功,唯快不破。

擁有一頭飄逸長髮的聶風,施展起六式風神腿來,如暴風驟雨,摧枯拉朽, 真可配得上“風中之神”的稱號。

  • 捕風捉影
  • 風中勁草
  • 暴雨狂風
  • 雷厲風行
  • 風捲樓殘
  • 神風怒嚎

實現ABAP條件斷點的三種方式

ABAP Debugger Script這項技術,在SAP研究院內部用的很廣泛。

回到上面的例子,我們將編寫一段簡單的ABAP程式碼,去控制目標ABAP程式碼的斷點觸發。

在ABAP偵錯程式裡,點選Script標籤頁,建立一個新的ABAP指令碼:

實現ABAP條件斷點的三種方式

我們想用ABAP指令碼監控ABAP程式碼裡某個簡單變數的值變化,所以使用指令碼建立嚮導裡的Variable Value(for Simple Variables):

實現ABAP條件斷點的三種方式

這個嚮導會自動幫我們生成ABAP指令碼,其實也就是一段ABAP程式碼了,這段程式碼可以用程式設計的方式,在偵錯程式啟用的上下文裡,獲取某個ABAP變數的值。

下圖指令碼的語義很清晰,獲取偵錯程式裡field symbol <data>的值,儲存在臨時變數lv_result裡。如果該變數的值為22,就呼叫ABAP指令碼的工具方法break,觸發斷點。

實現ABAP條件斷點的三種方式

把這段指令碼透過上圖的Save As按鈕另存下來,取名ZJERRY_TEST.

然後重新執行我們的測試程式碼, 使用Load Script載入剛才儲存的ABAP指令碼:

實現ABAP條件斷點的三種方式

點選Start Script執行指令碼:

實現ABAP條件斷點的三種方式

斷點再次如期觸發.

實現ABAP條件斷點的三種方式

希望大家能靈活運用這三種ABAP條件斷點的實現方式, 將它們融會貫通。《風雲》中的雄霸, 將天霜拳,排雲掌和風神腿融為一體, 自創了三分歸元氣這項神技。Jerry也祝願大家早日煉成屬於自己開發領域的三分歸元氣。

實現ABAP條件斷點的三種方式
實現ABAP條件斷點的三種方式
實現ABAP條件斷點的三種方式
實現ABAP條件斷點的三種方式

更多閱讀



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2674516/,如需轉載,請註明出處,否則將追究法律責任。

相關文章