SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

i042416發表於2019-12-11

目錄

長生劍 - SAPGUI Where Used List
碧玉刀 - ABAP偵錯程式觀察點
霸王槍 - ABAP偵錯程式動態斷點
多情環 - ABAP程式碼靜態掃描
孔雀翎 - SAT
離別鉤 - ST05
拳頭 - 迷之方法???


Jerry在2018年開始用中文在微信公眾號平臺上寫作之前,在SAP官方社群上總共寫了639篇英文部落格。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

其中有一篇寫於2013年介紹ABAP除錯技巧的部落格:

Six kinds of debugging tips to find the source code where the message is raised

從2016年至今,在SAP社群上有超過十五萬的閱讀量。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

實際的閱讀量遠遠大於這個數字,因為2016年社群改版之後,文章閱讀量清零了。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

SAP社群在2016年改版前,有一個所謂的Gamification遊戲化機制,部落格每收到一個贊之後,作者會得到2點積分。這篇部落格當時給Jerry贏得了不少社群積分。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

該部落格以一個實際例子,向大家介紹了Jerry多年ABAP程式設計生涯積累的6種錯誤訊息除錯方法。事實上Jerry實際工作中靠著這六種方法,對於我遇到形形色色的錯誤訊息,幾乎沒有遇到除錯不出丟擲訊息準確程式碼位置的情況,個人覺得這些方法還是相當管用的。

具體場景:在SE38裡隨便輸入一個並不存在的程式名,點選Display按鈕,顯示一個提示訊息。我們的任務是透過除錯或者使用Netweaver提供的其他工具找到丟擲這個訊息的ABAP程式碼的準確位置。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

古龍的代表作之一《七種武器》,介紹了七件令人聞風喪膽的精妙兵器,央視的《天下足球》系列也曾用這七種武器來類比足壇上那些絕世神鋒們。作為古龍的粉絲,Jerry也將這七種方法用古大師的七種武器來命名,算是向他致敬。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位


方法1:長生劍 - 使用SAPGUI自帶的Where Used List功能

在我國古代,劍被稱作“百兵之君”,常常被當作一種高貴的裝飾品,從皇帝到文人都喜歡佩劍以顯示身份。在金庸和古龍的名著裡,大多數江湖人物使用的兵器都是劍。

下面是Jerry用來鎮bug的龍泉劍:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位 SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

正如劍是江湖兒女使用得最多的兵器一樣,我想每一位ABAP從業人員應該都用過SAPGUI裡自帶的Where Used List功能。

滑鼠單擊SE38裡顯示的提示訊息,檢視這條訊息的技術明細:DS017,其中DS代表Message Class的ID,017是這條訊息在Message Class裡的編號。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

事務碼SE91, 開啟DS message class,定位到第17條訊息,點選這個圖示使用Where Used List功能。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

結果發現SAP標準程式裡丟擲這個訊息的地方太多了。。。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

這種情況下只得一條一條看了。注意我們在SE38裡看到的訊息顯示前面有個綠燈,因此說明ABAP程式碼丟擲這條訊息時,是以型別S(Successful)投遞的。這樣我們只看結果列表裡MESSAGE s017這種記錄,對於MESSAGE E017直接忽略,因為後者丟擲的訊息前面顯示的是紅燈。

很快找到了這一條記錄,但我還不能100%確認。此時雙擊進去,設定一個斷點,然後回到SE38,再點一次Display按鈕。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

此時斷點觸發,說明ABAP include LWBABAPF00的第813行就是我要找的丟擲這個提示訊息的準確位置。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

方法2:碧玉刀 - 使用ABAP偵錯程式的watch point(觀察點)功能

刀同樣是一件歷史非常悠久的武器,早在原始社會,古人類就用石頭、蚌殼、獸骨打製成各種形狀的刀。古人不僅將刀作為勞動工具,還隨身攜帶,作為防身自衛的武器。

方法2介紹的watch point是和刀同樣具有悠久歷史的工具。有多古老?它伴隨著SAPGUI問世的時候,Jerry的有些同事還沒出生。

金庸古龍小說裡,使用刀的名家也不少。金毛獅王謝遜從崆峒派那裡偷了一本《七傷拳:從入門到精通》,除了七傷拳外,使用的武器就是屠龍刀。古龍小說裡使刀的宗師就更多了,白天羽,傅紅雪,以及手持圓月彎刀,能釋放“小樓一夜聽春雨”終極大招的丁鵬:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位 SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

透過ABAP的關鍵字MESSAGE丟擲訊息時,系統變數SY-MSGID會自動被填充訊息所屬的Message Class,在Jerry這個例子裡為DS,而SY-MSGNO被填充為丟擲訊息的編號,這個例子裡為017. 因此,透過在偵錯程式裡建立watch point並維護相應的觸發條件。在程式執行時,一旦觸發條件滿足,watch point觸發,此時執行到的ABAP語句即為訊息彈出的準確位置。

在命令輸入欄裡鍵入/h開啟除錯模式,點選Display按鈕,彈出偵錯程式:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

在偵錯程式的此處建立一個watch point:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

條件維護如下,然後按F8繼續程式的執行,之後偵錯程式會自動在丟擲訊息的ABAP程式碼處停下來。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

Jerry每次使用ABAP偵錯程式裡的觀察點定位到我想查詢的訊息出處時,會感覺到丁鵬用圓月彎刀施展出“小樓一夜聽春雨”將對手劈成兩半的快感。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

方法3:霸王槍 - 使用ABAP偵錯程式裡型別為ABAP命令的動態斷點

槍,百兵之王,槍長而鋒利尖銳,使用靈便,槍頭刃可刺可斬,可刺穿盔甲。槍在十八般武藝中比較難學,不易掌握,俗語:“年棍,月刀,久練槍”。

“一寸長,一寸強”,正因為槍的威力比棍棒等鈍器強,所以我國古代很多名將都用槍,比如《三國演義》中的趙雲,馬超,姜維等等:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位 SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位 SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

槍在這些高武力值的武將手中施展開來,小兵們望風披靡;ABAP動態斷點一出,錯誤訊息則無所遁形。

在偵錯程式此處建立型別為ABAP Commands的動態斷點,命令設定為MESSAGE. 這樣,ABAP偵錯程式會自動在所有出現了MESSAGE關鍵字的地方停下來。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

也可以在選單Breakpoints->Breakpoint at處建立很多其他型別的斷點,相當有用。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

從方法4開始介紹的訊息定位方法,已經不再侷限於使用ABAP偵錯程式,而是靈活運用SAP Netweaver裡提供的各種有用工具。

方法4:多情環 - ABAP原始碼靜態掃描

這雙環不論套住了什麼,就立刻緊緊地纏住絕不脫手,就好像一個多情的女人一樣,所以名叫多情環。

Jerry在學會ABAP程式碼靜態掃描的技能後,也被程式碼掃描工具深深迷住了,再也擺脫不了對它的依賴。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

事務碼SE93裡輸入SE38,找到SE38實現的ABAP程式名和所處的開發包名稱。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

方法4的理論依據是,既然我們在SE38裡看到了DS017這條訊息,那麼SE38的實現程式碼裡,必定會出現MESSAGE S017這行程式碼。因此在方法4裡我們改變思路,不再採用動態除錯的辦法,而選擇和它相反的思路。

使用原始碼掃描工具程式RS_ABAP_SOURCE_SCAN查詢SE38實現程式碼裡所有出現了MESSAGE S017的ABAP程式碼位置:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

不到一秒鐘,就找到了準確的位置:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

另一個事務碼CODE_SCANNER也提供了類似的ABAP程式碼掃描功能,介面和RS_ABAP_SOURCE_SCAN略微有點差異。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位 SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

方法5:孔雀翎 - 使用ABAP應用效能分析工具SAT

《孔雀翎》是《七種武器》系列裡Jerry最喜歡的一部,而使用SAT進行ABAP訊息定位也是Jerry最喜歡的方法。

孔雀翎是個由純金鑄成、閃閃發光的圓筒,上面有兩道樞紐,按下樞紐,筒裡的暗器便飛射而出,據說這些暗器發出來時,美麗得就像孔雀開屏一樣,輝煌燦爛,然而,就在你被這種驚人的生靈感動得目瞪神迷時,它已經要了你的性命。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

李尋歡手中的小李飛刀,號稱“例不虛發”,然而還是有miss的時候,在對決大歡喜女菩薩之時,沒能做到一擊必殺。孔雀翎則不同,在古龍筆下的設定裡,它是一件命中率100%的暗器,孔雀翎面前沒有任何人能逃生。

可惜最後被主人弄丟了,囧。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

Jerry回憶自己的訊息分析排錯生涯,似乎想不起一種我使用了SAT但沒能成功找到訊息出處的情況出現,這說明SAT同孔雀翎一樣,在查詢ABAP訊息丟擲位置的領域裡威力極大。

進入事務碼SAT,建立一個新的跟蹤Variant,Aggregation(聚合)記得設定為None,否則後續檢視結果時將得不到期望看到的完整樹形結構。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

在Transaction欄位裡輸入SE38,點選Execute按鈕,這樣就在跟蹤模式下啟動了SE38.

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

接著和以前一樣,點選Display按鈕,看到提示訊息後,返回到SAT介面。這樣SE38從啟動到彈出提示訊息,再到退出這整個過程所執行的ABAP程式碼都被SAT記錄下來了。此時會看到一個進度條,表明SAT在格式化所記錄內容的進度:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

等到100%完成後,來到SAT的結果展示頁面裡,點選Call Hierarchy標籤頁,SE38執行的所有ABAP statement羅列如下。使用SAT自帶的搜尋按鈕,輸入MESSAGE S017, 執行即可得到結果。雙擊後就能進入對應的ABAP程式碼。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

雖然SAT最主要的用途是用來做應用效能分析和最佳化的,但在Jerry介紹的這個場景裡,它也起到了輔助訊息定位的作用。

除此之外說句題外話,SAT的Processing Blocks介面以樹形結構顯示了ABAP程式碼的一層層呼叫關係,對於我們分析和學習複雜應用的執行邏輯也非常有幫助。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

方法6:離別鉤 - 使用ABAP資料庫執行跟蹤和效能分析工具ST05

看下古龍原文對離別鉤的介紹。


“離別鉤也是種武器,也是鉤。”

“既然是鉤,為什麼要叫做離別?”

“因為這柄鉤,無論鉤住什麼都會造成離別。如果它鉤住你的手,你的手就要和腕離別;如果它鉤住你的腳,你的腳就要和腿離別。”

“如果它鉤住我的咽喉,我就和這個世界離別了?”

“是的。”

“你為什麼要用如此殘酷的武器?”

“因為我不願被人強迫與我所愛的人離別。”

“我明白你的意思了。”

“你真的明白?”

“你用離別鉤,只不過為了要相聚。”

“是的。”


Jerry想提醒大家的是,ST05雖然同離別鉤一樣,能有效幫助大家的訊息定位工作,但如果你在客戶生產系統裡開啟了ST05的效能分析開關,之後忘記了關掉,那說不定你可能不得不同你的工作離別了。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

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)的程式。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

點選上圖的Display按鈕,就能看到訪問資料庫表PRODDIR的程式碼了,位於第774行:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

滑鼠稍稍往下滑動一下,第813行就是我們要找到丟擲提示訊息的程式碼位置。兩個捱得確實夠近吧?

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

方法7:拳頭 - 使用搜尋引擎根據關鍵字DS 017查詢,或者直接向認識的專家求助

其他六種武器都是金屬製成,唯獨拳頭,乃血肉之軀構成。可能因為這種原因,拳在金庸的小說裡出鏡率不高,七傷拳算是比較著名的拳術之一。

五行之氣調陰陽,損心傷肺摧肝腸。 藏離精失意恍惚,三焦齊逆兮魂魄飛揚!

人體內有陰陽二氣、肺屬金、肝屬木、腎屬水、心屬火、脾屬土五行,所謂「七傷」,便是這七種傷害。

掌握了七傷拳的人,可以同時發出或剛猛或陰柔的不同勁力,摧傷敵人臟腑,拳力複雜,吞吐閃爍,變幻萬端,威力驚人。但這套神妙的拳法,傷敵力強,傷己也重,每練一次,內臟便受一次損傷,這就是“一練七傷,七者皆傷。先傷己,後傷敵”的來歷。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

同樣,當遇到我們難以定位的訊息時,我們可以直接使用搜尋引擎,或者向自己認識的專家求助。

Jerry試著在百度裡搜尋DS 017,還真找到一篇相關文章:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

來自簡書社群名叫“三月行者”的朋友,真的很感謝他不辭辛勞地把我那篇英文部落格翻譯成了中文:

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

這是他的簡書地址: jianshu.com/p/4aae58102

使用七傷拳的武者,固然可以發出或剛猛、或陰柔、或剛中有柔,或柔中有剛,或橫出,或直送,或內縮這七種不同的內勁,達到迅速克敵制勝的效果,然而自身也會受到七傷拳的反噬。

同樣,使用搜尋引擎或者求助專家,固然可以迅速解決眼前的問題,但可能失去了利用這個問題提升自己能力的機會,所以大家使用這種方法之前一定要慎重考慮。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

總結

《宋史·岳飛傳》:“陣而後戰,兵法之常;運用之妙,存乎一心。” ABAP Netweaver裡給我們提供了大量的工具,祝願大家都能夠靈活運用這些工具,充分挖掘它們的潛力,來解決實際問題。感謝大家閱讀。

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位

更多閱讀

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

SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位


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

相關文章