国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#調(diào)用C++ dll異常排查

這篇具有很好參考價值的文章主要介紹了C#調(diào)用C++ dll異常排查。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

基本情況

最近在做的一款程序,長時間運行總會出現(xiàn)莫名的問題。有時是自動關(guān)閉,有時程序報錯,有時調(diào)用的dll異?!?/p>

提出假設(shè)——dll內(nèi)存泄漏

由于開始與C++組合作時,使用其提供的dll出現(xiàn)過數(shù)據(jù)讀寫時異常(內(nèi)存操作異常),于是懷疑他們提供的dll有內(nèi)存泄漏。于是想通過日志或其它方法來確認這個猜測。

如何驗證是C++ dll的問題?

通過記錄當前Process的Memory情況,確認在調(diào)用dll時內(nèi)存的基本情況,然后與不調(diào)用dll的內(nèi)存情況進行比對,基本就能確認到底是不是dll的內(nèi)存操作有問題。

日志數(shù)據(jù)分析

記錄進程內(nèi)存情況與電腦內(nèi)存運行情況

以下為記錄內(nèi)存狀況的Function:

  private static void MemoryLog()
  {
      Task.Run(async () =>
      {
          string appName = typeof(App).Namespace;
          var mb = 1024 * 1024;
          while (true)
          {
              Process currentProcess = Process.GetCurrentProcess();
              var working = currentProcess.PagedMemorySize64;
              await Task.Delay(1000);
              NlogHelper.Logger.Trace($"MemoryLog Working Set: {currentProcess.WorkingSet64 / mb} MB, PeakWorking Set: {currentProcess.PeakWorkingSet64 / mb} MB, Private Memory: {currentProcess.PrivateMemorySize64 / mb} MB, PagedMemory: {currentProcess.PagedSystemMemorySize64 / mb}MB, PeakPagedMemory:{currentProcess.PeakPagedMemorySize64 / mb}MB");
              NlogHelper.Logger.Trace($"MemoryLog {Performance.GetMemInfo()}");
          }
      });
  }

上述代碼中,working memory為進程分配的物理內(nèi)存,private memory為進程的專用內(nèi)存(此為最關(guān)鍵,虛擬內(nèi)存),詳細參考API:Process 類 (System.Diagnostics) | Microsoft Learn

下述為Performance中的GetMemInfo方法:

  public static string GetMemInfo()
  {
      MEMORY_INFO mi = GetMemoryStatus();
      return string.Format(", \t\t\t{0},{1:f0}%", FormatSize(mi.ullTotalPhys - mi.ullAvailPhys), mi.dwMemoryLoad);
  }


        /// <summary>
        /// 獲得當前內(nèi)存使用情況
        /// </summary>
        /// <returns></returns>
        public static MEMORY_INFO GetMemoryStatus()
        {
            MEMORY_INFO mi = new MEMORY_INFO();
            mi.dwLength = (uint)Marshal.SizeOf(mi);
            GlobalMemoryStatusEx(ref mi);
            return mi;
        }

        [DllImport("kernel32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GlobalMemoryStatusEx(ref MEMORY_INFO mi);

注意:在記錄日志時最好記錄為一行,同時數(shù)據(jù)之間以空格或逗號或tab分離等分隔符分離,以方便數(shù)據(jù)分析時在表格中使用分隔符進行分列統(tǒng)計。

日志圖表化

通過日志記錄發(fā)現(xiàn),專用內(nèi)存在不斷增長:

C#調(diào)用C++ dll異常排查,c#

也就是說一定是存在內(nèi)存泄漏了。

而在不調(diào)用dll時運行50次的內(nèi)存情況則如下:

C#調(diào)用C++ dll異常排查,c#

也就是說在程序運行期間內(nèi)C#內(nèi)存使用情況是基本穩(wěn)定的,不會出現(xiàn)不斷增長的情況。

以上基本可以確認是C++的dll出現(xiàn)了問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-812348.html

到了這里,關(guān)于C#調(diào)用C++ dll異常排查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C#調(diào)用C++封裝的SDK庫(dll動態(tài)庫)——下

    C#調(diào)用C++封裝的SDK庫(dll動態(tài)庫)——下

    一、說明 上一篇我們相當于封裝的是C語言風格的動態(tài)dll庫,供C#來調(diào)用的。 C#調(diào)用C++封裝的SDK庫(dll動態(tài)庫)——上 如果我們要封裝的是下面的類呢?我們該怎么辦?大家先思考下。 ?二、思路 不知道大家還記得設(shè)計模式中的單例模式嗎? 我們可以采用類似的處理方式,通過

    2023年04月25日
    瀏覽(15)
  • C#生成dll給c++調(diào)用 方法二COM方式 vs2022 NO Make Assembly COM-Visible選錯了 不需要clr

    C#生成dll給c++調(diào)用 方法二COM方式 vs2022 NO Make Assembly COM-Visible選錯了 不需要clr

    有些C++項目中也用了C語言.c,用方法一就無法使用【不能使用 /clr 選項編譯 C 文件】。就用方法2。 ?參考:??https://www.5axxw.com/questions/content/2ozion ?1.C#?生成dll ?? ?編譯正常,C#?dll就完成了。 2.C++調(diào)用示例

    2024年02月14日
    瀏覽(24)
  • C#開發(fā)DLL,CAPL調(diào)用(CAPL>> .NET DLL)

    C#開發(fā)DLL,CAPL調(diào)用(CAPL>> .NET DLL)

    ret為dll里函數(shù)返回的值。 在visual studio中建立。

    2024年02月08日
    瀏覽(23)
  • C# DLL嵌套調(diào)用時修改生效

    C# DLL嵌套調(diào)用時,需要以被修改的DLL作為最下層,從下往上地重新生成所有DLL才可生效。 DLL1(最下層)代碼: DLL2(中間層)代碼: 應(yīng)用程序代碼: 實驗步驟: 1.在代碼無修改的情況下運行應(yīng)用程序,輸出結(jié)果為A。 2.修改DLL1動態(tài)鏈接庫ConsoleWriteLineSomething方法,使其輸出

    2024年01月25日
    瀏覽(24)
  • 如何在nodejs中調(diào)用C# dll

    Edge.js GitHub NPM package 環(huán)境要求 1.支持Node.Js 14.x, 16.x, 18.x, 19.x 2.支持 .NET Core 1.0.1 - 6.x - Windows/Linux/macOS nodejs中調(diào)用C# dll 下載并安裝 .NET 6.0 SDK C#中的代碼: 注意事項: 方法必須用async異步修飾,且返回值必須為Task object 不能用靜態(tài)方法,且方法需要為public nodejs中的代碼: C#源碼

    2024年02月06日
    瀏覽(15)
  • 【C#-1】C#調(diào)用matlab生成的dll庫

    【C#-1】C#調(diào)用matlab生成的dll庫

    matlab打包dll 1、matlab示例程序: 2、輸入deploytool打包matlab程序,具體如下: ?3、拷貝 打包成功后,將生成for_redistribution_files_only文件夾中的dll文件拷貝到C#程序lib文件夾下,若沒有,新創(chuàng)建一個。 錯誤解決: 解決方法:將matlab程序改寫成一個方法。 C#調(diào)用dll 1、添加引用 ?

    2024年02月07日
    瀏覽(19)
  • C# 運用(codeDom和反射技術(shù))動態(tài)編譯dll ,動態(tài)調(diào)用

    ? ? ? 在軟件運用工程中,往往會根據(jù)各種各樣,花樣百出的需求來設(shè)計軟件,在最近的項目中無意中,我就遇到了一個需求,據(jù)說是,客戶要動態(tài)編譯dll ,我“滴個乖乖”,這是要逆天??! 話不多說,直接來點干貨。 簡單分享一下個小demo: 1.運用codeDom技術(shù)實現(xiàn)動態(tài)程序集

    2024年02月13日
    瀏覽(24)
  • LabVIEW于C#各自生成的DLL互相調(diào)用的方法

    LabVIEW于C#各自生成的DLL互相調(diào)用的方法

    1.LV調(diào)用C#生成的DLL (1)C#類庫代碼原型 Debug生成的DLL: LV代碼: 結(jié)果顯示 2.C#調(diào)用LabVIEW生成的DLL: LV源碼 VS2017添加LV生成的DLL 加入命名控件,加源碼 運行結(jié)果:

    2024年02月16日
    瀏覽(18)
  • C# 提示:無法加載 DLL“XXX.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。

    C# 提示:無法加載 DLL“XXX.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。

    今天再調(diào)試程序時發(fā)現(xiàn)程序再筆記本上運行正常,然而拷貝到客戶主機上之后出現(xiàn)了(System.DllNotFoundException: 無法加載 DLL“msc.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。)的問題,經(jīng)過再三調(diào)試, 1、確認CPU平臺為x86,正常 2、dll的路徑,正常 經(jīng)過再三的排除,發(fā)

    2024年02月11日
    瀏覽(23)
  • C++軟件調(diào)試與異常排查從入門到精通系列文章匯總

    本文是 C++軟件調(diào)試與異常排查從入門到精通系列教程 專欄的導航貼( 點擊鏈接,跳轉(zhuǎn)到專欄主頁,歡迎訂閱,持續(xù)更新… )。 ?? 建議在閱讀專欄文章時,使用本篇導航文章,本導航文章對專欄中的文章進行了分類與排序,讀起來更有條理! 專欄介紹 :根據(jù)近幾年C++軟件

    2023年04月09日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包