一次k8s docker下.net程式的異常行為dump診斷

来源:https://www.cnblogs.com/dotnet-diagnostic/archive/2023/02/28/17153844.html
-Advertisement-
Play Games

背景 昨天,一位朋友找到我尋求幫助。他的項目需要調用一個第三方項目的webAPI。這個webAPI本身可從header, query string中取相關信息,但同事發現他在調用時,無法按期望的那樣從query string中傳參數給到第三方webAPI (webAPI仿佛忽略了從query str ...


背景

昨天,一位朋友找到我尋求幫助。他的項目需要調用一個第三方項目的webAPI。這個webAPI本身可從header, query string中取相關信息,但同事發現他在調用時,無法按期望的那樣從query string中傳參數給到第三方webAPI (webAPI仿佛忽略了從query string過來的信息),朋友不知道是這個webAPI的問題,還是自己調用代碼的問題了。。

由於這個webAPI service是他們公司內部的某team的項目,所以朋友雖然可以看到源碼,但他並不能快速確定原因, 維護項目的人又不好找。通過webAPI service代碼他自己找到了可疑的原因是webAPI中的這個方法有可能阻擋了他期望的webAPI行為: Instance.EnableFallback() (公司隱私,改了名), 但他無法確定這個方法在實際運行的時候的具體返回值。

聽了朋友介紹,我能想到的一個方法是看一下他們公司的這個第三方的service進程的內部情況 (非生產環境,許可權是允許的)

分析

通過kubectl exec -it [namespace:pod] /bin/bash,我們成功進入了service的pod里。雖然是非生產環境,我們也儘量別打擾人家幹活  那麼…就選擇dump一下運行的dotnet進程嘍

由於這次的任務是觀察托管環境的某個記憶體位置的值,我選擇了用dotnet-dump

 

然後dotnet-dump analyze core_123 開始分析。

我們想要的是 Instance.EnableFallback 的返回值,而我的朋友已經知道這個Instance的type,所以用dumpheap -type找一下這個instance在哪裡:

 

 

 然後用!do一下instance具體內容:

1 > do 796f3840d080
2 Name:        XXX.Common.XXX.XXXInstance
3 MethodTable: 00007970d459d3a8
4 EEClass:     00007970d45a4fc0
5 Size:        80(0x50) bytes
6 File:        /app/XXX.dll
7 Fields:
8               MT    Field   Offset                 Type VT     Attr            Value Name
9 00007970d459d9e8  4000016       10 ...XXX]]  0 instance 0000796f3840d130 _evs

根據簡化和隱藏敏感信息後的代碼:

 

 知道了需要繼續用!do 看這個0000796f3840d130:

 1 > do 0000796f3840d130
 2 Name:        System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[XXX.Common.XXX.XXXEnv, XXX]]
 3 MethodTable: 00007970d459d718
 4 EEClass:     00007970ce610c00
 5 Size:        72(0x48) bytes
 6 File:        /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.32/System.Private.CoreLib.dll
 7 Fields:
 8               MT    Field   Offset                 Type VT     Attr            Value Name
 9 00007970ce636448  4001aec        8       System.Int32[]  0 instance 0000796f384143a8 _buckets
10 00007970ce636250  4001aed       10 ...ivate.CoreLib]][]  0 instance 0000796f384143d0 _entries
11 00007970ce5fa0e8  4001aee       30         System.Int32  1 instance                1 _count

大家如果瞭解.net Dictionary類型的實現,就知道目前這個dictionary是1size且具體的item值可以直接用!dp看:

 

 Dictionary里的_entries是個數組,item類型是value type,所以是inlined memory, 所以直接看0000796f38412948, 因為他是數組中第0個元素里的key-value pair里的value(XXXEnv instance的地址)。

1 > do 0000796f38412948
2 Name:        XXX.Common.XXXEnv
3 MethodTable: 00007970d459e700
4 EEClass:     00007970d45a5888
5 Size:        56(0x38) bytes
6 File:        /app/XXX.dll
7 Fields:
8               MT    Field   Offset                 Type VT     Attr            Value Name
9 00007970d340a988  400000a        8 ....Config.XXXConfig  0 instance 0000796f382898f0 _toggleConfig

最後看那個_toggleConfigInstance.EnableFallback()裡面一通調用最終會讀它的內容,簡化代碼如下:

 

 所以繼續!do看一下這個_toggleConfig:

 

 至此原因確定,懷疑的這個方法在當前這個webAPI service下會返回false.

後記

也許有朋友會問,直接dump type是XXXConfig的instance不就行了。是的,不過在這個dump文件中,我發現了不止一個active的XXXConfig instance, 也就是說不止一處會用到這個不唯一的XXXConfig, 而我需要明確Instance.EnableFallback最終的返回,所以需要耐心探索哈 

總結

我的朋友知道了他想確定的Instance.EnableFallback在第三方service運行的時候的真實值之後,也明確了他那邊的應對這個webAPI的調用方式了。

這次診斷的問題雖不是cpu過高、記憶體泄漏這類資源問題,但還是用上了與排查資源泄漏相同的底層調試診斷技術來解決。最後我的朋友很高興,吃了個定心丸


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 歡迎關註個人公眾號:愛喝可可牛奶 LeetCode演算法訓練-回溯總結 適用問題 組合問題:N個數裡面按一定規則找出k個數的集合 排列問題:N個數按一定規則全排列,有幾種排列方式 切割問題:一個字元串按一定規則有幾種切割方式 子集問題:一個N個數的集合里有多少符合條件的子集 棋盤問題:N皇後,解數獨等 ...
  • if條件語句 if語句 if條件語法結構: if 條件語句: 滿足條件運行的代碼1 滿足條件運行的代碼2 ... ps:條件語句(可以是單個數據,即本身就是布爾類型)需返回一個布爾類型,判斷是否進入條件分支語句 if True: print('條件成⽴執⾏的代碼1') print('條件成⽴執⾏的代 ...
  • Lambda表達式 Lambda表達式理解 Lambda表達式是Jdk 8 開始新增的一種語法形式;作用:用於簡化匿名內部類的代碼寫法 註意:Lambda表達式只能簡化函數式介面的匿名內部類!!! 什麼是函數式介面? 有且僅有一個抽象方法的介面。 註意:大部分函數式介面,上面可能會有一個@Funct ...
  • 本節開始,將對 ResourceManager 中一些常見行為進行分析探究,看某些具體關鍵的行為,在 RM 中是如何流轉的。本節將深入源碼探究「啟動 ApplicationMaster」的具體流程。 ...
  • 錯誤描述 在 Spring Cloud 項目中通過 Open Feign 遠程調用時出現如下錯誤: feign.codec.EncodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http ...
  • 之前在做某個業務中,寫了個文件傳輸的程式,程式邏輯很簡單:掃描某個目錄下的文件,對文件進行一些處理,然後把文件移動到另一個目錄。 此前在大多數運行環境里,該程式一直正常運行,直到最近在一個新環境下,出現問題:文件移動失敗。查詢日誌發現在調用file.renameTo方法返回false。我第一反應是查 ...
  • C語言對記憶體的使用劃分為以下區域: 棧區(stack)、堆區(heap)、全局區(靜態區)、常量區、代碼區。 棧區: 由編譯器自動分配釋放,按記憶體地址從高(地址)到低(地址)存儲; 棧區內容的作用域為其所定義的函數內,生命周期為函數執行期間,函數結束自動釋放; 存放局部變數、const局部變數、函數 ...
  • 在上文中分析了 HttpURLConnection的用法,功能還是比較簡單的,沒有什麼封裝 接下來看看Apache HttpClient是如何封裝httpClient的 組成 HttpClient 5 的系統架構主要由以下幾個部分組成: HttpCore:核心包,包含了 HTTP 協議的核心抽象和實 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...