天天看點

用 Arthas “庖丁解牛”Arthas 征文活動火熱進行中

作者 | Halimao Java、go 愛好者( https://github.com/halimao/

【Arthas 官方社群正在舉行征文活動,參加即有獎品拿哦~

點選投稿

生産環境的 bug 開發環境無法複現怎麼辦?關鍵位置沒有列印日志資訊不足怎麼辦?莫慌,騷年。讓強大的 Arthas法師來 carry,帶你去生産環境"遨遊"闖關。

剛接觸 Arthas,就被它能夠 watch 方法的輸入參數和傳回值的功能震驚到了。這簡直太酷炫了,讓你可以像本地單步調試一樣,跟蹤到每一步的執行結果和擷取目前的變量數值。以前要定位線上問題,資訊不足就需要加日志列印,定位問題,可能需要反複重新開機應用。用了 Arthas,根本不需要加日志列印,重新開機應用這些操作。花了大概一個周末下午,在本地跑了下官方 demo,熟悉了下常用操作。腦子裡對 Arthas 能夠做什麼,能解決什麼,怎麼解決,已經有了大概的了解。後面需要用的時候,就能派上大用場了(學了就一定有 bug 會找上門的=.=)。

下面介紹一個特意找上門的 bug。

背景:同一個聊天交友類産品,對外以一個主品牌以及多個新品牌進行釋出。服務端是共用一套資料的,但是所有對外展示的資訊,涉及到品牌相關的,需要進行文案替換。在同一個群組裡,主品牌和新品牌的使用者可以互相聊天。

問題現象:

  • 線上某個群組裡面,同一條聊天消息涉及到需要替換文案的内容時,主品牌側的使用者有的顯示正常,有的顯示為新品牌文案;
  • 不同的群聊天消息,同一個使用者有的展示正常,有的異常;
  • 新品牌側的使用者看到的群聊天消息文案替換正常。

先貼下相關的代碼(用 Arthas 的 jad 直接反編譯的源碼):

群聊消息下發方法:

用 Arthas “庖丁解牛”Arthas 征文活動火熱進行中

write 方法文案替換邏輯代碼:

用 Arthas “庖丁解牛”Arthas 征文活動火熱進行中

PublishMessage 是下行消息類,replaceMsgMap 是提前生成好的各個新品牌對應文案,主品牌使用原始消息文案。

乍一看,文案替換邏輯沒啥毛病(但問題就在這,大家可以先思考下),感覺自己又要去面對一個撲朔迷離的玄學 bug 了(永遠不要把程式 bug 歸結為靈異事件)。代碼看不出問題,本地單步調試鼓搗了一早上,也沒複現出來,看來隻能在生産環境定位了,Arthas 要登場了。

由于生産環境的消息轉發量很大,直接 attach 程序風險太高,且不利于單條消息觀察定位。是以選擇預釋出環境進行 attach,請求量可控,資料和線上一緻,也隻有讀操作,不會影響到生産環境。

用 Arthas 的 watch 指令,觀察 write 方法的輸入參數。

用 Arthas “庖丁解牛”Arthas 征文活動火熱進行中
  • -x 表示周遊深度,可以調整來列印具體的參數和結果内容,預設值是 1
  • -b 表示觀察方法調用前

可以看到,publishMessage、userSession 參數的值都顯示出來了。接着就可以在預釋出觸發消息下行進行資料觀察了。

建了個測試群,除了自己一個主品牌的測試使用者還有另外一個新品牌使用者。最初開始發送了幾條群聊消息都正常,後面又拉了一個新品牌使用者以及主品牌測試使用者,複現的機率就高了許多。觀察了下同一條群聊消息發給每個群成員的 publishMessage 值,發現如果先周遊到了新品牌使用者,再周遊到主品牌使用者時,publishMessage 的文案居然是新品牌文案!!!心裡猛的一驚,是了,就是這個低級錯誤造成的 bug,大家應該也猜到原因了。

下面揭曉下這個問題産生的原因:

  • 周遊群成員傳遞的 publishMessage 形參,每次改變 payload 都會影響到被傳遞進去的 publishMessage 實參
  • replaceMsgMap 裡隻存儲了新品牌文案
  • 主品牌根據 appName 擷取對應文案時為空,則不設定 payload,使用最傳遞進來的 publishMessage 的 payload
  • 周遊群組成員時,順序是随機性的

如果某個主品牌使用者在新品牌使用者之後被周遊到,那麼 publishMessage 的 payload 字段就會被設定為新品牌文案。而主品牌在 replaceMsgMap 裡找不到對應文案,就不更新 payload了,複用了上一次被周遊使用者的 payload,就會出現文案顯示異常。

知道原因後就好處理了,replaceMsgMap 裡把主品牌的文案也加進去,每次周遊到主品牌,也更新 payload 字段,保證文案正常顯示。

整個定位過程,無需增加 log 日志,線上應用也無需重新開機,便能擷取足夠的資訊進行問題排查定位,是不是賊好用了。花個半天時間,摸索鼓搗下,要用時就能省下不少工夫。詳細使用文檔見->

官方文檔

一鍵安裝并啟動 Arthas

  • 方式一:通過 Cloud Toolkit 實作 Arthas 一鍵遠端診斷

Cloud Toolkit 是阿裡雲釋出的免費本地 IDE 插件,幫助開發者更高效地開發、測試、診斷并部署應用。通過插件,可以将本地應用一鍵部署到任意伺服器,甚至雲端(ECS、EDAS、ACK、ACR 和 小程式雲等);并且還内置了 Arthas 診斷、Dubbo工具、Terminal 終端、檔案上傳、函數計算 和 MySQL 執行器等工具。不僅僅有 IntelliJ IDEA 主流版本,還有 Eclipse、Pycharm、Maven 等其他版本。

推薦使用 IDEA 插件下載下傳 Cloud Toolkit 來使用 Arthas:

http://t.tb.cn/2A5CbHWveOXzI7sFakaCw8
  • 方式二:直接下載下傳

位址:

https://github.com/alibaba/arthas

Arthas 征文活動火熱進行中

Arthas 官方正在舉行征文活動,如果你有:

  • 使用 Arthas 排查過的問題
  • 對 Arthas 進行源碼解讀
  • 對 Arthas 提出建議
  • 不限,其它與 Arthas 有關的内容

歡迎參加征文活動,還有獎品拿哦~

阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公衆号。”