C#调用C++ dll异常排查

这篇具有很好参考价值的文章主要介绍了C#调用C++ dll异常排查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本情况

最近在做的一款程序,长时间运行总会出现莫名的问题。有时是自动关闭,有时程序报错,有时调用的dll异常……

提出假设——dll内存泄漏

由于开始与C++组合作时,使用其提供的dll出现过数据读写时异常(内存操作异常),于是怀疑他们提供的dll有内存泄漏。于是想通过日志或其它方法来确认这个猜测。

如何验证是C++ dll的问题?

通过记录当前Process的Memory情况,确认在调用dll时内存的基本情况,然后与不调用dll的内存情况进行比对,基本就能确认到底是不是dll的内存操作有问题。

日志数据分析

记录进程内存情况与电脑内存运行情况

以下为记录内存状况的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为进程分配的物理内存,private memory为进程的专用内存(此为最关键,虚拟内存),详细参考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>
        /// 获得当前内存使用情况
        /// </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);

注意:在记录日志时最好记录为一行,同时数据之间以空格或逗号或tab分离等分隔符分离,以方便数据分析时在表格中使用分隔符进行分列统计。

日志图表化

通过日志记录发现,专用内存在不断增长:

C#调用C++ dll异常排查,c#

也就是说一定是存在内存泄漏了。

而在不调用dll时运行50次的内存情况则如下:

C#调用C++ dll异常排查,c#

也就是说在程序运行期间内C#内存使用情况是基本稳定的,不会出现不断增长的情况。

以上基本可以确认是C++的dll出现了问题。文章来源地址https://www.toymoban.com/news/detail-812348.html

到了这里,关于C#调用C++ dll异常排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#调用C++封装的SDK库(dll动态库)——下

    一、说明 上一篇我们相当于封装的是C语言风格的动态dll库,供C#来调用的。 C#调用C++封装的SDK库(dll动态库)——上 如果我们要封装的是下面的类呢?我们该怎么办?大家先思考下。  二、思路 不知道大家还记得设计模式中的单例模式吗? 我们可以采用类似的处理方式,通过

    2023年04月25日
    浏览(41)
  • C#生成dll给c++调用 方法二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++调用示例

    2024年02月14日
    浏览(45)
  • C#开发DLL,CAPL调用(CAPL>> .NET DLL)

    ret为dll里函数返回的值。 在visual studio中建立。

    2024年02月08日
    浏览(42)
  • C# DLL嵌套调用时修改生效

    C# DLL嵌套调用时,需要以被修改的DLL作为最下层,从下往上地重新生成所有DLL才可生效。 DLL1(最下层)代码: DLL2(中间层)代码: 应用程序代码: 实验步骤: 1.在代码无修改的情况下运行应用程序,输出结果为A。 2.修改DLL1动态链接库ConsoleWriteLineSomething方法,使其输出

    2024年01月25日
    浏览(62)
  • 如何在nodejs中调用C# dll

    Edge.js GitHub NPM package 环境要求 1.支持Node.Js 14.x, 16.x, 18.x, 19.x 2.支持 .NET Core 1.0.1 - 6.x - Windows/Linux/macOS nodejs中调用C# dll 下载并安装 .NET 6.0 SDK C#中的代码: 注意事项: 方法必须用async异步修饰,且返回值必须为Task object 不能用静态方法,且方法需要为public nodejs中的代码: C#源码

    2024年02月06日
    浏览(40)
  • 【C#-1】C#调用matlab生成的dll库

    matlab打包dll 1、matlab示例程序: 2、输入deploytool打包matlab程序,具体如下:  3、拷贝 打包成功后,将生成for_redistribution_files_only文件夹中的dll文件拷贝到C#程序lib文件夹下,若没有,新创建一个。 错误解决: 解决方法:将matlab程序改写成一个方法。 C#调用dll 1、添加引用  

    2024年02月07日
    浏览(33)
  • C# 运用(codeDom和反射技术)动态编译dll ,动态调用

          在软件运用工程中,往往会根据各种各样,花样百出的需求来设计软件,在最近的项目中无意中,我就遇到了一个需求,据说是,客户要动态编译dll ,我“滴个乖乖”,这是要逆天啊! 话不多说,直接来点干货。 简单分享一下个小demo: 1.运用codeDom技术实现动态程序集

    2024年02月13日
    浏览(36)
  • LabVIEW于C#各自生成的DLL互相调用的方法

    1.LV调用C#生成的DLL (1)C#类库代码原型 Debug生成的DLL: LV代码: 结果显示 2.C#调用LabVIEW生成的DLL: LV源码 VS2017添加LV生成的DLL 加入命名控件,加源码 运行结果:

    2024年02月16日
    浏览(61)
  • C# 提示:无法加载 DLL“XXX.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

    今天再调试程序时发现程序再笔记本上运行正常,然而拷贝到客户主机上之后出现了(System.DllNotFoundException: 无法加载 DLL“msc.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。)的问题,经过再三调试, 1、确认CPU平台为x86,正常 2、dll的路径,正常 经过再三的排除,发

    2024年02月11日
    浏览(48)
  • C++软件调试与异常排查从入门到精通系列文章汇总

    本文是 C++软件调试与异常排查从入门到精通系列教程 专栏的导航贴( 点击链接,跳转到专栏主页,欢迎订阅,持续更新… )。 📢 建议在阅读专栏文章时,使用本篇导航文章,本导航文章对专栏中的文章进行了分类与排序,读起来更有条理! 专栏介绍 :根据近几年C++软件

    2023年04月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包