<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Linux系列:如何用 C#調(diào)用 C方法造成內(nèi)存泄露

      一:背景

      1. 講故事

      好久沒寫文章了,還是來寫一點吧,今年準備多寫一點 Linux平臺上的東西,這篇從 C# 調(diào)用 C 這個例子開始。在 windows 平臺上,我們常常在 C++ 代碼中用 extern "C" 導出 C風格 的函數(shù),然后在 C# 中用 DllImport 的方式引入,那在 Linux 上怎么玩的?畢竟這對研究 Linux 上的 C# 程序非托管內(nèi)存泄露有非常大的價值,接下來我們就來看下。

      二:一個簡單的非托管內(nèi)存泄露

      1. 構(gòu)建 so 文件

      在 Windows 平臺上我們會通過 MSVC 編譯器將 C代碼編譯出一個成品 .dll,在 Linux 上通常會借助 gcc 將 c 編譯成 .so 文件,這個.so 全稱 Shared Object,為了方便講解,先上一段簡單的代碼:

      
      #include <stdlib.h>
      #include <stdio.h>
      #include <stdint.h>
      #include <string.h>
      
      #define BLOCK_SIZE (10 * 1024)              // 每個塊 10K
      #define TOTAL_SIZE (1 * 1024 * 1024 * 1024) // 總計 1GB
      #define BLOCKS (TOTAL_SIZE / BLOCK_SIZE)    // 計算需要的塊數(shù)
      
      void heapmalloc()
      {
          uint8_t *blocks[BLOCKS]; // 存儲每個塊的指針
      
          // 分配 1GB 內(nèi)存,分成多個小塊
          for (size_t i = 0; i < BLOCKS; i++)
          {
              blocks[i] = (uint8_t *)malloc(BLOCK_SIZE);
              if (blocks[i] == NULL)
              {
                  printf("內(nèi)存分配失敗!\n");
                  return;
              }
      
              // 確保每個塊都被實際占用
              memset(blocks[i], 20, BLOCK_SIZE);
          }
      
          printf("已經(jīng)分配 1GB 內(nèi)存在堆上!\n");
      }
      
      

      接下來使用 gcc 編譯,參考如下:

      
      gcc -shared -o libmyleak.so -fPIC myleak.c
      
      
      • -shared: 編譯成共享庫
      • -fPIC: 指定共享庫可以在內(nèi)存任意位置被加載(地址無關(guān)性)

      命令執(zhí)行完之后,就可以看到一個 .so 文件了,截圖如下:

      最后可以用 nm 命令驗證下 libmyleak.so 中是否有 Text 段下的 heapmalloc 導出函數(shù)。

      
      root@ubuntu2404:/data2/c# nm libmyleak.so
      0000000000004028 b completed.0
                       w __cxa_finalize@GLIBC_2.2.5
      00000000000010c0 t deregister_tm_clones
      0000000000001130 t __do_global_dtors_aux
      0000000000003e00 d __do_global_dtors_aux_fini_array_entry
      0000000000004020 d __dso_handle
      0000000000003e08 d _DYNAMIC
      000000000000125c t _fini
      0000000000001170 t frame_dummy
      0000000000003df8 d __frame_dummy_init_array_entry
      00000000000020f8 r __FRAME_END__
      0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
                       w __gmon_start__
      000000000000203c r __GNU_EH_FRAME_HDR
      0000000000001179 T heapmalloc
      0000000000001000 t _init
                       w _ITM_deregisterTMCloneTable
                       w _ITM_registerTMCloneTable
                       U malloc@GLIBC_2.2.5
                       U memset@GLIBC_2.2.5
                       U puts@GLIBC_2.2.5
      00000000000010f0 t register_tm_clones
                       U __stack_chk_fail@GLIBC_2.4
      0000000000004028 d __TMC_END__
      
      

      2. C# 代碼調(diào)用

      so構(gòu)建好了之后,后面就比較好說了,使用 dotnet new console -n CSharpApplication --use-program-main true 新建一個CS項目。

      
      root@ubuntu2404:/data2/csharp# dotnet new console -n CSharpApplication --use-program-main true
      The template "Console App" was created successfully.
      
      Processing post-creation actions...
      Restoring /data2/csharp/CSharpApplication/CSharpApplication.csproj:
        Determining projects to restore...
        Restored /data2/csharp/CSharpApplication/CSharpApplication.csproj (in 1.7 sec).
      Restore succeeded.
      
      

      編譯下 C# 項目,然后將 libmyleak.so 放到 C#項目的 bin目錄,修改 C# 代碼如下:

      
      using System.Runtime.InteropServices;
      
      namespace CSharpApplication;
      
      class Program
      {
          [DllImport("libmyleak.so", CallingConvention = CallingConvention.Cdecl)]
          public static extern void heapmalloc();
      
          static void Main(string[] args)
          {
              heapmalloc();
              Console.ReadLine();
          }
      }
      
      

      最后用 dotnet CSharpApplication.dll 運行:

      
      root@ubuntu2404:/data2/csharp/CSharpApplication/bin/Debug/net8.0# dotnet CSharpApplication.dll
      已經(jīng)分配 1GB 內(nèi)存在堆上!
      
      

      程序是跑起來了,那真的是吃了1G呢? 可以先用 htop 觀察程序,從截圖看沒毛病。

      那這 1G 真的在 heap 上嗎? 可以用 maps 觀察。

      
      root@ubuntu2404:~# ps -ef | grep CSharp
      root       10764   10730  0 13:35 pts/21   00:00:00 dotnet CSharpApplication.dll
      root       11049   11027  0 13:41 pts/22   00:00:00 grep --color=auto CSharp
      
      root@ubuntu2404:~# cat /proc/10764/maps
      614e1f592000-614e1f598000 r--p 00000000 08:02 1479867                    /usr/lib/dotnet/dotnet
      614e1f598000-614e1f5a4000 r-xp 00005000 08:02 1479867                    /usr/lib/dotnet/dotnet
      614e1f5a4000-614e1f5a5000 r--p 00010000 08:02 1479867                    /usr/lib/dotnet/dotnet
      614e1f5a5000-614e1f5a6000 rw-p 00010000 08:02 1479867                    /usr/lib/dotnet/dotnet
      614e5b5d9000-614e9b8a8000 rw-p 00000000 00:00 0                          [heap]
      ...
      
      
      root@ubuntu2404:~# pmap 10764
      10764:   dotnet CSharpApplication.dll
      0000614e1f592000     24K r---- dotnet
      0000614e1f598000     48K r-x-- dotnet
      0000614e1f5a4000      4K r---- dotnet
      0000614e1f5a5000      4K rw--- dotnet
      0000614e5b5d9000 1051452K rw---   [ anon ]
      ...
      
      

      根據(jù) linux 進程的內(nèi)存布局,可執(zhí)行image之后是 heap 堆,可以看到 [heap] 約等于1G (614e9b8a8000 - 614e5b5d9000),即 pmap 中的 1051452K。

      三:總結(jié)

      部署在 Linux上的.NET程序同樣存在 非托管內(nèi)存泄露 的問題,這篇文章的例子雖然很簡單,希望能給大家?guī)硪恍┧伎己陀^測途徑吧。
      圖片名稱

      posted @ 2025-03-03 14:07  一線碼農(nóng)  閱讀(1530)  評論(11)    收藏  舉報
      主站蜘蛛池模板: 久久午夜色播影院| 五月天中文字幕mv在线| 无码日韩精品一区二区免费| 福利成人午夜国产一区| 91人妻熟妇在线视频| 中文字幕人妻无码一区二区三区| 国模精品视频一区二区三区 | 狠狠色丁香婷婷综合| 国产av无码专区亚洲草草| 亚洲精品专区永久免费区| 国产精品福利自产拍在线观看| 欧美日本激情| 日韩成av在线免费观看| 无码伊人66久久大杳蕉网站谷歌| 国产精品任我爽爆在线播放6080| 一区二区三区四区高清自拍| 蜜桃av无码免费看永久| 熟女人妻精品一区二区视频 | 色午夜久久男人操女人| 国产av中文字幕精品| 国产AV大陆精品一区二区三区| 免费无码一区无码东京热| 日本新janpanese乱熟| 国产成人免费ā片在线观看| 成人无码潮喷在线观看| 邛崃市| 亚洲av第一区二区三区| av色国产色拍| 亚洲人妻av伦理| 国产av一区二区麻豆熟女| 日本高清一区免费中文视频| 国产探花在线精品一区二区| 又大又粗欧美成人网站| 给我中国免费播放片在线| 国产丰满乱子伦无码专区| 国产亚洲综合区成人国产| 免费人成在线观看成人片| 人妻丝袜无码专区视频网站| 最新精品国偷自产在线美女足| 国语精品一区二区三区| 一卡2卡三卡4卡免费网站|