本文是鼠年第3篇文章,也是汪子熙公衆号第202篇原創文章。
今天是大年初三,Jerry祝大家霍去病,辛棄疾,健健康康,長命百歲。
ABAP條件斷點這個話題,Jerry的同僚曾經問過我,雖然小但很實用。
所謂條件斷點,就是設定在某行語句上的斷點,并不總是會觸發,而是僅當滿足一定條件時才觸發。
條件斷點的使用場合是什麼?
舉個簡單的例子,下圖第15行ADD語句設定一個斷點。因為它在一個具有1000行的内表循環體内,是以正常情況下會觸發1000次。
假設我們在調試一個bug,這個bug當循環到第999次時才出現,那我們前998次的單步調試都是無效的。最高效的做法,就是借助條件斷點的概念,讓斷點在代碼執行到第999次循環時,觸發且僅觸發一次。
本文介紹實作ABAP條件斷點的三種方式。也歡迎大家分享自己最喜歡用的且本文尚未提到的條件斷點技術。
為了友善記憶,Jerry用天下會雄霸幫主的三種絕技來給這三種條件斷點的實作方式命名。
方法一
天霜拳 - 給ABAP斷點維護觸發條件
天霜拳,冰系技能,雄霸傳予大弟子秦霜。
天霜拳在馬榮成的《風雲》漫畫裡一共出現了14式:
風霜撲面
霜寒抱月
霜結中霄
霜雪紛飛
霜冷長河
霜痕累累
霜凝見拙
披霜撥露
霜雪冰山
傲雪淩霜:這是天霜拳的絕招,也是最為強勁的一招。一招四式(傲立孤峰、雪嶺尋梅、淩雲壓頂、霜河倒影),寒氣彌漫,四下五丈之内都被凍成冰霜。
大師兄啊,在《風雲》裡是個杯具人物,唉。
在ABAP調試器裡點選Break/Watchpoints面闆,建立一個斷點:
在Free Condition Entry裡維護這個斷點的觸發條件。
回到我上面的例子,我的内表裡包含了從1到1000的整數,總共1000條記錄,而我的觸發條件維護為 = 22. 顯然,這個斷點在第22次循環時,唯一觸發一次。
維護完畢後,我們在斷點面闆裡看到了這個建立的斷點:
按F8繼續調試,斷點有且僅觸發了一次,此時的值為22,正好符合我們維護的觸發條件,成功。
方法二
排雲掌 - 利用ABAP調試器裡的觀察點(Watchpoint)
小的時候看漫畫,覺得不哭死神步驚雲簡直是一個bug般的存在,會的技能之多令人發指。
僅《風雲》第一部裡,步驚雲就掌握了霍家劍法,悲痛莫名,排雲掌,聖靈劍法,麒麟臂,三霸劍等等。Jerry個人認為塑造得最成功出彩的,還要算那十二式變化莫測,名稱飄逸的排雲掌:
行雲流水
披雲戴月
翻雲覆雨
排雲倒海
烏雲蔽日
重雲深鎖
撕天排雲
雲海波濤
燮雲無定
殃雲天降
愁雲慘淡
ABAP的調試器,也和步驚雲的排雲掌一樣,使用方式變化多端。
此處建立Watchpoint:
我們知道在LOOP循環體内,系統變量sy-tabix會自動賦以目前的循環次數。是以我們在Watchpoint的觸發條件裡,維護成sy-tabix = 22, 也可以達到在第22次循環時觸發的目的。
Watchpoint建立好之後顯示如下:
按F8繼續調試,程式果然在第22次循環時觸發了:
并且調試器裡彈出一條提示資訊:Watchpoint reached
方法三
風神腿 - ABAP Debugger Script
天下武功,唯快不破。
擁有一頭飄逸長發的聶風,施展起六式風神腿來,如暴風驟雨,摧枯拉朽, 真可配得上“風中之神”的稱号。
捕風捉影
風中勁草
暴雨狂風
雷厲風行
風卷樓殘
神風怒嚎
ABAP Debugger Script這項技術,在SAP研究院内部用的很廣泛。
回到上面的例子,我們将編寫一段簡單的ABAP代碼,去控制目标ABAP代碼的斷點觸發。
在ABAP調試器裡,點選Script标簽頁,建立一個新的ABAP腳本:
我們想用ABAP腳本監控ABAP代碼裡某個簡單變量的值變化,是以使用腳本建立向導裡的Variable Value(for Simple Variables):
這個向導會自動幫我們生成ABAP腳本,其實也就是一段ABAP代碼了,這段代碼可以用程式設計的方式,在調試器激活的上下文裡,擷取某個ABAP變量的值。
下圖腳本的語義很清晰,擷取調試器裡field symbol 的值,存儲在臨時變量lv_result裡。如果該變量的值為22,就調用ABAP腳本的工具方法break,觸發斷點。
把這段腳本通過上圖的Save As按鈕另存下來,取名ZJERRY_TEST.
然後重新執行我們的測試代碼, 使用Load Script加載剛才儲存的ABAP腳本:
點選Start Script執行腳本:
斷點再次如期觸發.
希望大家能靈活運用這三種ABAP條件斷點的實作方式, 将它們融會貫通。《風雲》中的雄霸, 将天霜拳,排雲掌和風神腿融為一體, 自創了三分歸元氣這項神技。Jerry也祝願大家早日煉成屬于自己開發領域的三分歸元氣。
本文來自雲栖社群合作夥伴“汪子熙”,了解相關資訊可以關注微信公衆号"汪子熙"。