目錄
長生劍 - SAPGUI Where Used List
碧玉刀 - ABAP偵錯程式觀察點
霸王槍 - ABAP偵錯程式動態斷點
多情環 - ABAP程式碼靜態掃描
孔雀翎 - SAT
離別鉤 - ST05
拳頭 - 迷之方法???
Jerry在2018年開始用中文在微信公眾號平臺上寫作之前,在SAP官方社群上總共寫了639篇英文部落格。
其中有一篇寫於2013年介紹ABAP除錯技巧的部落格:
Six kinds of debugging tips to find the source code where the message is raised
從2016年至今,在SAP社群上有超過十五萬的閱讀量。
實際的閱讀量遠遠大於這個數字,因為2016年社群改版之後,文章閱讀量清零了。
SAP社群在2016年改版前,有一個所謂的Gamification遊戲化機制,部落格每收到一個贊之後,作者會得到2點積分。這篇部落格當時給Jerry贏得了不少社群積分。
該部落格以一個實際例子,向大家介紹了Jerry多年ABAP程式設計生涯積累的6種錯誤訊息除錯方法。事實上Jerry實際工作中靠著這六種方法,對於我遇到形形色色的錯誤訊息,幾乎沒有遇到除錯不出丟擲訊息準確程式碼位置的情況,個人覺得這些方法還是相當管用的。
具體場景:在SE38裡隨便輸入一個並不存在的程式名,點選Display按鈕,顯示一個提示訊息。我們的任務是透過除錯或者使用Netweaver提供的其他工具找到丟擲這個訊息的ABAP程式碼的準確位置。
古龍的代表作之一《七種武器》,介紹了七件令人聞風喪膽的精妙兵器,央視的《天下足球》系列也曾用這七種武器來類比足壇上那些絕世神鋒們。作為古龍的粉絲,Jerry也將這七種方法用古大師的七種武器來命名,算是向他致敬。
方法1:長生劍 - 使用SAPGUI自帶的Where Used List功能
在我國古代,劍被稱作“百兵之君”,常常被當作一種高貴的裝飾品,從皇帝到文人都喜歡佩劍以顯示身份。在金庸和古龍的名著裡,大多數江湖人物使用的兵器都是劍。
下面是Jerry用來鎮bug的龍泉劍:
正如劍是江湖兒女使用得最多的兵器一樣,我想每一位ABAP從業人員應該都用過SAPGUI裡自帶的Where Used List功能。
滑鼠單擊SE38裡顯示的提示訊息,檢視這條訊息的技術明細:DS017,其中DS代表Message Class的ID,017是這條訊息在Message Class裡的編號。
事務碼SE91, 開啟DS message class,定位到第17條訊息,點選這個圖示使用Where Used List功能。
結果發現SAP標準程式裡丟擲這個訊息的地方太多了。。。
這種情況下只得一條一條看了。注意我們在SE38裡看到的訊息顯示前面有個綠燈,因此說明ABAP程式碼丟擲這條訊息時,是以型別S(Successful)投遞的。這樣我們只看結果列表裡MESSAGE s017這種記錄,對於MESSAGE E017直接忽略,因為後者丟擲的訊息前面顯示的是紅燈。
很快找到了這一條記錄,但我還不能100%確認。此時雙擊進去,設定一個斷點,然後回到SE38,再點一次Display按鈕。
此時斷點觸發,說明ABAP include LWBABAPF00的第813行就是我要找的丟擲這個提示訊息的準確位置。
方法2:碧玉刀 - 使用ABAP偵錯程式的watch point(觀察點)功能
刀同樣是一件歷史非常悠久的武器,早在原始社會,古人類就用石頭、蚌殼、獸骨打製成各種形狀的刀。古人不僅將刀作為勞動工具,還隨身攜帶,作為防身自衛的武器。
方法2介紹的watch point是和刀同樣具有悠久歷史的工具。有多古老?它伴隨著SAPGUI問世的時候,Jerry的有些同事還沒出生。
金庸古龍小說裡,使用刀的名家也不少。金毛獅王謝遜從崆峒派那裡偷了一本《七傷拳:從入門到精通》,除了七傷拳外,使用的武器就是屠龍刀。古龍小說裡使刀的宗師就更多了,白天羽,傅紅雪,以及手持圓月彎刀,能釋放“小樓一夜聽春雨”終極大招的丁鵬:
透過ABAP的關鍵字MESSAGE丟擲訊息時,系統變數SY-MSGID會自動被填充訊息所屬的Message Class,在Jerry這個例子裡為DS,而SY-MSGNO被填充為丟擲訊息的編號,這個例子裡為017. 因此,透過在偵錯程式裡建立watch point並維護相應的觸發條件。在程式執行時,一旦觸發條件滿足,watch point觸發,此時執行到的ABAP語句即為訊息彈出的準確位置。
在命令輸入欄裡鍵入/h開啟除錯模式,點選Display按鈕,彈出偵錯程式:
在偵錯程式的此處建立一個watch point:
條件維護如下,然後按F8繼續程式的執行,之後偵錯程式會自動在丟擲訊息的ABAP程式碼處停下來。
Jerry每次使用ABAP偵錯程式裡的觀察點定位到我想查詢的訊息出處時,會感覺到丁鵬用圓月彎刀施展出“小樓一夜聽春雨”將對手劈成兩半的快感。
方法3:霸王槍 - 使用ABAP偵錯程式裡型別為ABAP命令的動態斷點
槍,百兵之王,槍長而鋒利尖銳,使用靈便,槍頭刃可刺可斬,可刺穿盔甲。槍在十八般武藝中比較難學,不易掌握,俗語:“年棍,月刀,久練槍”。
“一寸長,一寸強”,正因為槍的威力比棍棒等鈍器強,所以我國古代很多名將都用槍,比如《三國演義》中的趙雲,馬超,姜維等等:
槍在這些高武力值的武將手中施展開來,小兵們望風披靡;ABAP動態斷點一出,錯誤訊息則無所遁形。
在偵錯程式此處建立型別為ABAP Commands的動態斷點,命令設定為MESSAGE. 這樣,ABAP偵錯程式會自動在所有出現了MESSAGE關鍵字的地方停下來。
也可以在選單Breakpoints->Breakpoint at處建立很多其他型別的斷點,相當有用。
從方法4開始介紹的訊息定位方法,已經不再侷限於使用ABAP偵錯程式,而是靈活運用SAP Netweaver裡提供的各種有用工具。
方法4:多情環 - ABAP原始碼靜態掃描
這雙環不論套住了什麼,就立刻緊緊地纏住絕不脫手,就好像一個多情的女人一樣,所以名叫多情環。
Jerry在學會ABAP程式碼靜態掃描的技能後,也被程式碼掃描工具深深迷住了,再也擺脫不了對它的依賴。
事務碼SE93裡輸入SE38,找到SE38實現的ABAP程式名和所處的開發包名稱。
方法4的理論依據是,既然我們在SE38裡看到了DS017這條訊息,那麼SE38的實現程式碼裡,必定會出現MESSAGE S017這行程式碼。因此在方法4裡我們改變思路,不再採用動態除錯的辦法,而選擇和它相反的思路。
使用原始碼掃描工具程式RS_ABAP_SOURCE_SCAN查詢SE38實現程式碼裡所有出現了MESSAGE S017的ABAP程式碼位置:
不到一秒鐘,就找到了準確的位置:
另一個事務碼CODE_SCANNER也提供了類似的ABAP程式碼掃描功能,介面和RS_ABAP_SOURCE_SCAN略微有點差異。
方法5:孔雀翎 - 使用ABAP應用效能分析工具SAT
《孔雀翎》是《七種武器》系列裡Jerry最喜歡的一部,而使用SAT進行ABAP訊息定位也是Jerry最喜歡的方法。
孔雀翎是個由純金鑄成、閃閃發光的圓筒,上面有兩道樞紐,按下樞紐,筒裡的暗器便飛射而出,據說這些暗器發出來時,美麗得就像孔雀開屏一樣,輝煌燦爛,然而,就在你被這種驚人的生靈感動得目瞪神迷時,它已經要了你的性命。
李尋歡手中的小李飛刀,號稱“例不虛發”,然而還是有miss的時候,在對決大歡喜女菩薩之時,沒能做到一擊必殺。孔雀翎則不同,在古龍筆下的設定裡,它是一件命中率100%的暗器,孔雀翎面前沒有任何人能逃生。
可惜最後被主人弄丟了,囧。
Jerry回憶自己的訊息分析排錯生涯,似乎想不起一種我使用了SAT但沒能成功找到訊息出處的情況出現,這說明SAT同孔雀翎一樣,在查詢ABAP訊息丟擲位置的領域裡威力極大。
進入事務碼SAT,建立一個新的跟蹤Variant,Aggregation(聚合)記得設定為None,否則後續檢視結果時將得不到期望看到的完整樹形結構。
在Transaction欄位裡輸入SE38,點選Execute按鈕,這樣就在跟蹤模式下啟動了SE38.
接著和以前一樣,點選Display按鈕,看到提示訊息後,返回到SAT介面。這樣SE38從啟動到彈出提示訊息,再到退出這整個過程所執行的ABAP程式碼都被SAT記錄下來了。此時會看到一個進度條,表明SAT在格式化所記錄內容的進度:
等到100%完成後,來到SAT的結果展示頁面裡,點選Call Hierarchy標籤頁,SE38執行的所有ABAP statement羅列如下。使用SAT自帶的搜尋按鈕,輸入MESSAGE S017, 執行即可得到結果。雙擊後就能進入對應的ABAP程式碼。
雖然SAT最主要的用途是用來做應用效能分析和最佳化的,但在Jerry介紹的這個場景裡,它也起到了輔助訊息定位的作用。
除此之外說句題外話,SAT的Processing Blocks介面以樹形結構顯示了ABAP程式碼的一層層呼叫關係,對於我們分析和學習複雜應用的執行邏輯也非常有幫助。
方法6:離別鉤 - 使用ABAP資料庫執行跟蹤和效能分析工具ST05
看下古龍原文對離別鉤的介紹。
“離別鉤也是種武器,也是鉤。”
“既然是鉤,為什麼要叫做離別?”
“因為這柄鉤,無論鉤住什麼都會造成離別。如果它鉤住你的手,你的手就要和腕離別;如果它鉤住你的腳,你的腳就要和腿離別。”
“如果它鉤住我的咽喉,我就和這個世界離別了?”
“是的。”
“你為什麼要用如此殘酷的武器?”
“因為我不願被人強迫與我所愛的人離別。”
“我明白你的意思了。”
“你真的明白?”
“你用離別鉤,只不過為了要相聚。”
“是的。”
Jerry想提醒大家的是,ST05雖然同離別鉤一樣,能有效幫助大家的訊息定位工作,但如果你在客戶生產系統裡開啟了ST05的效能分析開關,之後忘記了關掉,那說不定你可能不得不同你的工作離別了。
ABAP從業人員在懷疑應用程式的效能瓶頸出現在資料庫層面時,往往都會在事務碼ST05裡將資料庫跟蹤開關開啟,在跟蹤模式下重新執行應用,拿到跟蹤結果以此來分析資料庫的效能。
在這個例子裡,Jerry用ST05跟蹤SE38這個事務碼的執行,能得到過程中訪問過的所有資料庫表的名稱,和訪問它們的效能。
為什麼Jerry要弄清楚SE38到底訪問了哪些資料庫表?根據經驗推斷,我們在SE38裡輸入程式的名稱點選Display按鈕後,SE38的實現必定會從某個資料庫表(即Netweaver裡儲存所有ABAP程式名稱的資料庫表)里根據該名稱進行搜尋,如果搜尋未命中,說明該程式並不存在,從而拋一條訊息給使用者。
換言之,SE38里根據使用者輸入去資料庫表裡使用OPEN SQL進行查詢,和丟擲提示訊息,這兩處程式碼的位置一定相鄰。因此我們只要找到了SE38裡查詢報表名稱的資料庫表的位置,那麼距離丟擲提示訊息的程式碼位置也不遠了。
對於SE38裡訪問資料庫表的效能,Jerry是毫不關心的,直接忽略。在ST05的結果列表裡,我只盯著Object Name裡顯示的資料庫表名稱,PROGDIR在裡面太顯眼了。這張表存放的就是所有ABAP程式的名稱,右邊的就是訪問該表的ABAP OPEN SQL:
SELECT WHERE ''NAME" = 'ASDASDD' AND "STATE" = 'A'.
我之前在ST05跟蹤模式下隨便輸了個程式名ASDASDD, 所以SE38試圖到表PROGDIR裡查詢一個名叫ASDASDD且狀態為啟用狀態(A-Activated)的程式。
點選上圖的Display按鈕,就能看到訪問資料庫表PRODDIR的程式碼了,位於第774行:
滑鼠稍稍往下滑動一下,第813行就是我們要找到丟擲提示訊息的程式碼位置。兩個捱得確實夠近吧?
方法7:拳頭 - 使用搜尋引擎根據關鍵字DS 017查詢,或者直接向認識的專家求助
其他六種武器都是金屬製成,唯獨拳頭,乃血肉之軀構成。可能因為這種原因,拳在金庸的小說裡出鏡率不高,七傷拳算是比較著名的拳術之一。
五行之氣調陰陽,損心傷肺摧肝腸。 藏離精失意恍惚,三焦齊逆兮魂魄飛揚!
人體內有陰陽二氣、肺屬金、肝屬木、腎屬水、心屬火、脾屬土五行,所謂「七傷」,便是這七種傷害。
掌握了七傷拳的人,可以同時發出或剛猛或陰柔的不同勁力,摧傷敵人臟腑,拳力複雜,吞吐閃爍,變幻萬端,威力驚人。但這套神妙的拳法,傷敵力強,傷己也重,每練一次,內臟便受一次損傷,這就是“一練七傷,七者皆傷。先傷己,後傷敵”的來歷。
同樣,當遇到我們難以定位的訊息時,我們可以直接使用搜尋引擎,或者向自己認識的專家求助。
Jerry試著在百度裡搜尋DS 017,還真找到一篇相關文章:
來自簡書社群名叫“三月行者”的朋友,真的很感謝他不辭辛勞地把我那篇英文部落格翻譯成了中文:
這是他的簡書地址:https://www.jianshu.com/p/4aa...
使用七傷拳的武者,固然可以發出或剛猛、或陰柔、或剛中有柔,或柔中有剛,或橫出,或直送,或內縮這七種不同的內勁,達到迅速克敵制勝的效果,然而自身也會受到七傷拳的反噬。
同樣,使用搜尋引擎或者求助專家,固然可以迅速解決眼前的問題,但可能失去了利用這個問題提升自己能力的機會,所以大家使用這種方法之前一定要慎重考慮。
總結
《宋史·岳飛傳》:“陣而後戰,兵法之常;運用之妙,存乎一心。” ABAP Netweaver裡給我們提供了大量的工具,祝願大家都能夠靈活運用這些工具,充分挖掘它們的潛力,來解決實際問題。感謝大家閱讀。
更多閱讀
- Jerry的ABAP, Java和JavaScript亂燉
- ABAP開發人員未來應該學些什麼
- Jerry 2017年的五一小長假:8種經典排序演算法的ABAP實現
- Jerry的ABAP原創技術文章合集
- 300行ABAP程式碼實現一個最簡單的區塊鏈原型
- 使用Java+SAP雲平臺+SAP Cloud Connector呼叫ABAP On-Premise系統裡的函式
- 在SAP雲平臺的CloudFoundry環境下消費ABAP On-Premise OData服務
- ABAP vs Java, 蛙泳 vs 自由泳
- 聊聊C語言和ABAP
- 動手使用ABAP Channel開發一些小工具,提升日常工作效率
- 我用ABAP做過的那些無聊的事情
- 不喜歡SAP GUI?那試試用Eclipse進行ABAP開發吧
- 使用Visual Studio Code編寫和啟用ABAP程式碼
- 你的ABAP程式給佛祖開過光麼?來試試Jerry這個小技巧
- 在SAP雲平臺ABAP程式設計環境上編寫第一段ABAP程式
- SAP官方釋出的ABAP程式設計規範
- ABAP Code Inspector那些隱藏的功能,您都知道嗎?
- 還在用ABAP進行SAP產品的二次開發?來了解下這種全新的二次開發理念吧
- ABAP Netweaver體內的那些寄生式程式語言
- 從SAP社群上的一篇部落格開始,聊聊SAP產品命名背後的那份情懷
- 雲端的ABAP Restful服務開發
- 如何在SAP雲平臺ABAP程式設計環境裡把CDS view暴露成OData服務
- 使用abapGit在ABAP On-Premises系統和SAP雲平臺ABAP環境之間進行程式碼傳輸
- 30分鐘用Restful ABAP Programming模型開發一個支援增刪改查的Fiori應用
- Jerry帶您瞭解Restful ABAP Programming模型系列之二:Action和Validation的實現
- Jerry帶您瞭解Restful ABAP Programming模型系列之三:雲端ABAP應用除錯
- SAP雲平臺上的ABAP程式設計環境裡如何消費第三方服務
- ABAP開發者上雲的時候到了 - 現在大家可以免費使用SAP雲平臺ABAP環境的試用版了
- 學而不思則罔 - SAP雲平臺ABAP程式設計環境的由來和適用場景
- SAP雲平臺裡的三叉戟應用
- 如何基於Restful ABAP Programming模型開發並部署一個支援增刪改查的Fiori應用
- SAP 2019 TechEd Key Note解讀:雲時代下SAP從業人員如何做二次開發?
- 有哪些ABAP關鍵字和語法,到了ABAP雲環境上就沒辦法用了?
- ABAP開發環境終於支援以駝峰命名法自動格式化ABAP變數名了
- 利用ABAP 740的新關鍵字REDUCE完成一個實際工作任務
- 一段讓人瑟瑟發抖的ABAP程式碼
- 昨日萬聖節ABAP怪獸級程式碼謎團,公佈答案啦
- 介紹一種在ABAP核心態進行內表高效複製的方法
- 使用SAP Cloud Application Programming模型開發OData的一個實際例子
- 當ABAP遇見普羅米修斯
- 使用ABAP繪製可伸縮向量圖
- ABAP開發環境語法高亮的那些事兒
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":