精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux系列:如何用C#調用C方法造成內存泄露

開發 前端
在 windows 平臺上,我們常常在 C++ 代碼中用 extern "C"? 導出 C風格 的函數,然后在 C# 中用 DllImport 的方式引入,那在 Linux 上怎么玩的?

一、背景 

1. 講故事

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

二、一個簡單的非托管內存泄露 

1. 構建 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)    // 計算需要的塊數

void heapmalloc()
{
    uint8_t *blocks[BLOCKS]; // 存儲每個塊的指針

    // 分配 1GB 內存,分成多個小塊
    for (size_t i = 0; i < BLOCKS; i++)
    {
        blocks[i] = (uint8_t *)malloc(BLOCK_SIZE);
        if (blocks[i] == NULL)
        {
            printf("內存分配失敗!\n");
            return;
        }

        // 確保每個塊都被實際占用
        memset(blocks[i], 20, BLOCK_SIZE);
    }

    printf("已經分配 1GB 內存在堆上!\n");
}

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

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

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

圖片圖片

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

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# 代碼調用

so構建好了之后,后面就比較好說了,使用 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;

namespaceCSharpApplication;

classProgram
{
    [DllImport("libmylib.so", CallingConvention = CallingConvention.Cdecl)]
    public static extern void hello();

    static void Main(string[] args)
    {
        hello();
        Console.ReadLine();
    }
}

最后用 dotnet CSharpApplication.dll 運行:

root@ubuntu2404:/data2/csharp/CSharpApplication/bin/Debug/net8.0# dotnet CSharpApplication.dll
已經分配 1GB 內存在堆上!

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

圖片圖片

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

root@ubuntu2404:~# ps -ef | grep CSharp
root       10764   10730013:35 pts/21   00:00:00 dotnet CSharpApplication.dll
root       11049   11027013:41 pts/22   00:00:00 grep --color=auto CSharp

root@ubuntu2404:~# cat /proc/10764/maps
614e1f592000-614e1f598000 r--p 0000000008:021479867                    /usr/lib/dotnet/dotnet
614e1f598000-614e1f5a4000 r-xp 0000500008:021479867                    /usr/lib/dotnet/dotnet
614e1f5a4000-614e1f5a5000 r--p 0001000008:021479867                    /usr/lib/dotnet/dotnet
614e1f5a5000-614e1f5a6000 rw-p 0001000008:021479867                    /usr/lib/dotnet/dotnet
614e5b5d9000-614e9b8a8000 rw-p 0000000000:000                          [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 ]
...

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

三、總結 

部署在 Linux上的.NET程序同樣存在 非托管內存泄露的問題,這篇文章的例子雖然很簡單,希望能給大家帶來一些思考和觀測途徑吧。

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2009-08-28 10:14:45

C#內存泄露

2009-08-31 18:05:14

C#調用WalkTre

2009-08-31 16:33:28

C#調用Dispose

2009-09-01 11:04:59

C#調用擴展方法

2009-08-03 12:57:27

C#調用DLL

2009-08-20 10:53:23

C#操作內存

2009-09-11 10:59:06

Effective C調用Dispose()

2009-09-02 10:49:46

C#調用析構方法

2009-08-26 16:58:12

調用C# Thread

2009-08-05 09:40:02

C#調用DLL函數

2009-08-05 09:30:39

C#調用DLL函數

2009-08-24 15:58:00

Visual C#生成

2011-04-08 09:52:44

C++C#DLL

2015-04-02 16:23:50

C++內存泄露檢查

2009-08-17 16:18:47

C#調用CreateO

2009-08-05 16:29:18

C#調用C++動態鏈接

2025-05-08 03:33:00

Linuxperf.NET

2009-08-11 11:07:49

Java調用C# we

2024-05-16 12:33:37

C#編程指針

2009-08-20 16:07:39

C#和ADO.NET訪
點贊
收藏

51CTO技術棧公眾號

黄色动漫在线免费看| 国产精品一区二区免费看| 国产视频不卡在线| www.久久草.com| 亚洲一区二区视频在线| 免费毛片一区二区三区久久久| 国产精品免费无遮挡无码永久视频| 久久免费av| 精品国产一区二区三区不卡| 可以在线看的黄色网址| 福利视频在线| 久久久综合视频| 91在线无精精品一区二区| 日韩精品一卡二卡| 99久久www免费| 日韩精品在线视频观看| 日本成人xxx| 91久久国产综合久久91猫猫| 亚洲乱码国产乱码精品精98午夜| 久久久com| 亚洲大尺度视频| 九九九久久久精品| 欧美在线观看网址综合| caoporn91| 日韩精品午夜| 亚洲精品视频在线观看视频| wwwww在线观看| 成人看片毛片免费播放器| 亚洲成人精品在线观看| 欧美a级黄色大片| yiren22亚洲综合伊人22| 成人午夜av在线| 亚洲专区国产精品| 伊人免费在线观看高清版| 羞羞答答国产精品www一本| 欧美国产在线电影| 国产午夜手机精彩视频| 日本不卡高清| 在线观看国产精品日韩av| 最新中文字幕视频| 欧美亚洲国产日韩| 亚洲精品一区二区三区四区高清 | 国产免费一区二区三区四区| 嫩草一区二区三区| 亚洲国产高潮在线观看| 波多野结衣三级视频| 综合久久伊人| 欧美美女一区二区| 亚洲欧美久久久久| 久久亚洲人体| 欧美高清视频不卡网| 我要看一级黄色大片| 四虎4545www精品视频| 日韩欧美中文字幕在线观看| 成人在线国产视频| 国产在线xxx| 亚洲午夜国产一区99re久久| 激情成人开心网| 青草视频在线免费直播| 亚洲高清一区二区三区| 拔插拔插海外华人免费| 国产经典三级在线| 亚瑟在线精品视频| 91免费视频网站在线观看| 一个人看的www视频在线免费观看| 都市激情亚洲色图| 免费看国产曰批40分钟| 成人勉费视频| 欧美视频一二三区| 亚洲第一天堂久久| xxxx日韩| 亚洲久久久久久久久久久| av女人的天堂| 小处雏高清一区二区三区| 欧美大肥婆大肥bbbbb| 精品视频一区二区在线观看| 国产一区二区三区久久久久久久久| 日产日韩在线亚洲欧美| 亚洲视屏在线观看| 国产盗摄一区二区三区| 精品一区二区日本| av电影在线网| 亚洲成人你懂的| 亚洲色图久久久| 清纯唯美激情亚洲| 亚洲精品久久在线| 成人小视频免费看| 国产精品hd| 日本午夜人人精品| 国产欧美一级片| 久久综合狠狠综合| 日本丰满少妇黄大片在线观看| 草草视频在线| 欧美日本一区二区三区| 大尺度在线观看| 日韩av片子| 国产69精品久久久久9999| 中文字幕乱码在线观看| 丁香天五香天堂综合| 日韩欧美精品一区二区三区经典| 日本乱理伦在线| 日本精品免费观看高清观看| 自拍视频第一页| 精品一区二区三区的国产在线观看| 欧美日韩国产成人高清视频| 国产黄网在线观看| 成人性生交大片免费看视频在线| 亚洲不卡1区| 在线h片观看| 欧美在线视频全部完| 国产婷婷在线观看| 亚洲第一天堂| 国产精品999999| 人妻妺妺窝人体色www聚色窝| 国产精品伦理一区二区| 国产青青在线视频| 日韩有吗在线观看| 日韩亚洲欧美中文在线| 日本中文字幕第一页| 国产馆精品极品| 一区二区免费在线观看| 欧美日韩亚洲国产| 日韩精品视频免费在线观看| 欧美成人一二三区| 久久精品久久精品| 日韩久久不卡| 亚洲最大成人| 亚洲精品动漫100p| 九九九国产视频| 国产成人综合在线观看| 椎名由奈jux491在线播放| 性感美女一区二区在线观看| 亚洲娇小xxxx欧美娇小| 欧美成人黄色网| 国产麻豆视频一区二区| 亚洲午夜在线观看| 国产成人精品一区二区三区免费| 亚洲男人第一av网站| 免费在线不卡视频| 91视频观看免费| 国产一级爱c视频| 精品按摩偷拍| 77777亚洲午夜久久多人| 国产 日韩 欧美 精品| 一区二区免费在线播放| 中文字幕人妻无码系列第三区| 欧美韩国日本在线观看| 国产精品视频26uuu| 岛国在线视频免费看| 在线观看视频欧美| 91激情视频在线观看| 米奇777在线欧美播放| 噜噜噜噜噜久久久久久91| 涩涩在线视频| 亚洲色图狂野欧美| 亚洲永久精品一区| 中文子幕无线码一区tr| 中文字幕66页| 欧美jizzhd精品欧美巨大免费| 成人精品一二区| av资源新版天堂在线| 亚洲欧美色图片| 在线免费观看高清视频| 亚洲丝袜另类动漫二区| 韩国av中国字幕| 韩日精品视频| 免费电影一区| 国产国产一区| 欧美成人免费观看| 天堂a√在线| 日本韩国欧美在线| 小早川怜子一区二区的演员表| 国产精品99久久久| 黄色大片在线免费看| 在线亚洲a色| 成人欧美一区二区三区在线 | 51午夜精品视频| 国产精品一级伦理| 宅男噜噜噜66一区二区66| 国产一级中文字幕| 久久久久国产免费免费| 天天干天天色天天干| 亚洲人成毛片在线播放女女| 欧美日韩无遮挡| 国产免费av国片精品草莓男男 | 欧美成a人片在线观看久| 中文字幕av一区二区| 成 人 黄 色 片 在线播放 | 国产裸体永久免费无遮挡| 一区二区成人在线| 性高潮久久久久久久| 国产一区二区在线免费观看| 日本一道本久久| 婷婷综合五月| 欧美日韩一区二区三区免费| 亚州精品国产| 欧美亚洲国产成人精品| 免费在线观看黄色网| 日韩h在线观看| 国产精品视频在线观看免费| 欧美日韩亚洲视频| 深夜福利影院在线观看| 国产拍揄自揄精品视频麻豆| 欧美高清精品一区二区| 日韩在线一区二区| 很污的网站在线观看| 三区四区不卡| 久久99久久99精品蜜柚传媒| 国产精品色婷婷在线观看| 日本一区二区三区在线播放| 日本资源在线| 综合久久五月天| 欧美日韩在线中文字幕| 亚洲成人激情图| 国产免费久久久| 欧美三级三级三级爽爽爽| 国产精品美女久久久久av爽| 一区二区三区免费观看| 国产麻豆a毛片| 久久精品日韩一区二区三区| 亚洲av人人澡人人爽人人夜夜| 国产一区日韩二区欧美三区| 成人免费在线观看视频网站| 久久精品网址| 黄色动漫网站入口| 日韩视频一区| 老太脱裤让老头玩ⅹxxxx| 久久久精品久久久久久96| 亚洲精品国产久| 中文无码久久精品| 亚洲高清视频一区二区| 美女毛片一区二区三区四区| 国产九色精品| 国产欧美啪啪| 豆国产97在线| 日韩成人18| 91在线在线观看| 综合久草视频| 91在线视频免费| 精品国产亚洲日本| 91视频国产一区| 精品中文字幕一区二区三区四区| 国产日韩欧美成人| 精品美女一区| 国产日韩欧美在线视频观看| 国产第一精品| 91精品在线观| 天堂精品在线视频| 国产精品久久久对白| 日韩精品一区二区三区中文| 亚洲综合最新在线| 中文字幕av一区二区三区四区| 91沈先生播放一区二区| 精品一区二区三区中文字幕| 91手机在线播放| av自拍一区| 国产在线观看一区| 先锋影音国产精品| 色阁综合av| 99久久夜色精品国产亚洲96| 在线观看成人免费| 欧美久久综合| 日韩中文字幕在线视频观看| 亚洲一区二区成人| 男人的天堂日韩| 久久99国产精品免费| 欧美污在线观看| av一区二区不卡| 亚洲av无码一区二区三区人| 国产精品天干天干在线综合| 欧美一区免费观看| 亚洲sss视频在线视频| 秋霞精品一区二区三区| 欧美三级中文字幕在线观看| 国产黄a三级三级看三级| 精品久久国产老人久久综合| 日本一区高清| 综合av色偷偷网| 男男gaygays亚洲| 日本精品久久中文字幕佐佐木| 日韩成人一区| 成人av网站观看| 精品一区二区三区在线| 9l视频自拍9l视频自拍| 亚洲日本免费| 中文字幕在线导航| 成人一二三区视频| 亚洲精品视频网址| 亚洲一级不卡视频| 在线播放国产一区| 亚洲电影免费观看高清完整版在线观看| 九色视频在线观看免费播放| 久久久成人av| 黑人精品一区| 99精品国产高清在线观看| 国产精品亚洲人成在99www| 国产精品亚洲天堂| 免费日韩av片| 亚洲熟妇一区二区| 欧美国产一区二区| 国产午夜精品一区二区理论影院| 在线看国产日韩| 黄色三级网站在线观看| 中国人与牲禽动交精品| h片精品在线观看| 成人免费网站在线看| 久久av网址| 国内精品在线观看视频| 国产自产v一区二区三区c| 日韩精品无码一区二区三区久久久 | 中文字幕一区二区三区四区不卡| 亚洲天堂日韩av| 日韩欧美国产wwwww| 91在线网址| 日韩av免费在线| 精品少妇一区| 国产一级大片免费看| 美国毛片一区二区三区| 魔女鞋交玉足榨精调教| 一区二区三区小说| 一区二区的视频| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 亚洲男人av电影| 日韩电影免费看| 国产另类第一区| 激情久久婷婷| 久久精品aⅴ无码中文字字幕重口| 综合激情成人伊人| 一级黄色免费片| 中文字幕日本欧美| 成人在线视频免费| 亚洲精品一区二区三| 久久看片网站| 91成人破解版| 欧美性猛交xxxx乱大交蜜桃| 无码精品一区二区三区在线| 国内精品久久久久久久久| 成人知道污网站| 日韩成人手机在线| 国产成人免费视| 国产成人精品av久久| 精品久久一区二区| 乱插在线www| 久草一区二区| 久久精品一区二区国产| 亚洲AV无码国产成人久久| 精品女同一区二区三区在线播放 | www.日本不卡| 国产成人在线观看网站| 日韩av在线资源| 自拍偷拍亚洲视频| 欧美一区国产一区| 人人精品人人爱| 午夜国产福利视频| 538在线一区二区精品国产| 大片免费在线观看| 97久久天天综合色天天综合色hd| 国色天香一区二区| 艳妇乳肉亭妇荡乳av| 日韩欧美国产一区二区| 久久米奇亚洲| 91精品国产自产在线| 一区二区三区午夜探花| 娇妻高潮浓精白浆xxⅹ| 精品久久久久久亚洲国产300| 色综合成人av| 国产精品视频区| 欧美精品国产一区| 无码人妻aⅴ一区二区三区| 色哟哟一区二区在线观看| av在线电影播放| 亚洲最大福利视频| 国产日韩1区| 萌白酱视频在线| 精品国产一区二区三区四区四| 在线观看的黄色| 一本一生久久a久久精品综合蜜| 国产一区二区伦理片| 日韩欧美a级片| www.亚洲男人天堂| 狼人精品一区二区三区在线| 亚洲性生活网站| 亚洲精品国产品国语在线app| 熟妇人妻一区二区三区四区 | 手机免费av片| 亚洲成av人影院| 淫片在线观看| 国产一区二区三区黄| 免费观看一级特黄欧美大片| 青青草精品在线视频| 亚洲欧美一区二区三区情侣bbw| 色综合视频一区二区三区日韩| 日韩精品一区二区三区四| 久久精品在线观看| 国产高潮在线观看| 国产精品久久久久久亚洲调教| 欧美福利在线| 91精品国自产在线| 亚洲国产成人一区| 亚洲一区二区三区久久久|