代码之家  ›  专栏  ›  技术社区  ›  mike

C如何在运行时转储所有变量和当前值

  •  21
  • mike  · 技术社区  · 15 年前

    是否有任何内置或第三方库允许您在运行时简单地将所有变量转储到内存中?我希望能够通过点击一个断点并悬停在变量上查看变量和当前值,与查看它们类似,但实际上不必停止程序执行(即,只需获取快照)。如果它可以将它们转储到一个文件中,然后在程序中打开该文件,以获得一个良好的GUI界面来查看它们,那就太好了,但是简单的文本文件转储就足够了。

    6 回复  |  直到 12 年前
        1
  •  7
  •   bobbymcr    15 年前

    我想不出一个简单的方法来用普通的方式来做这个。可以工作的是以编程方式为正在运行的进程创建一个转储文件。您可以使用p/invoke对 dbghelp.dll 常规或生成 cdb.exe 创建转储文件的过程。一旦拥有了该文件,就可以在调试器中打开它,以便以后使用 SOS.dll with cdb.exe/windbg.exe 或者甚至写一个 debugger script 自动转储您想要的数据(大部分)。

        2
  •  4
  •   mezoid    15 年前

    我相信某种日志框架可以帮助您做到这一点…

    退房:

    http://www.dotnetlogging.com/

    在我的工作场所 log4net 这对我们很有效。

    那么,你为什么要把所有的变量都扔掉,以便日后分析呢?您是否考虑先编写代码测试,以便减少对调试器的依赖,并让一套自动测试为您检查值?

        3
  •  2
  •   RobV    12 年前

    过去我用过 YourKit .NET探查器以分析.NET应用程序。

    Snapshot documentation Profiler API 可用于以编程方式转储快照以供日后查看。

    代码方面,这看起来很简单,如下所示:

    Controller c = new Controller();
    String snapshotPath = c.CaptureSnapshot();
    

    我相信以后您可以将快照文件加载到yourkit图形用户界面中来查看它们。

    如果其他一些流行的人物像JetBrains,我不会感到惊讶。 dotTrace Performance 还有红门 ANTS Performance Profiler

        4
  •  1
  •   Alois Kraus    12 年前

    为此你可以使用 WMemoryProfiler

    • 创建自己进程的内存转储
    • 将特定对象序列化到光盘

    为了实现这一点,您当然需要windbg,但是wmemoryProfiler的API是完全管理的,您基本上可以自行调试您的进程。库处理通常的调试器异常,因为它确实将windbg包装在一个易于访问的库中。

    下面的代码将System.Threading.Thread对象的所有实例都获取到一个对象数组中。这样,您就可以在运行时为自己的应用程序对象编写可视化工具。另一个重载只提供所有AppDomain中的所有对象。

    using (var debugger = new MdbEng())
    {
      var dummy = new Thread(() => {});
      dummy.Name = "Dummy Thread";
    
      // Get all thread objects in all AppDomains
      var threads = debugger.GetObjects("System.Threading.Thread", true);
    
      foreach (Thread t in threads)
      {
        Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name);
      }
      GC.KeepAlive(dummy);
    }
    

    因为它是一个围绕windbg的包装器,所以您还可以动态创建内存转储,然后从进程中加载内存转储,以从转储中提取对象数据以进行可视化。商业内存分析程序(例如,来自科技公司的memoryprofiler)多年来一直采用这种技术,但是当您有一个巨大的内存转储时,这是非常缓慢的,因为它们也使用windbg作为转储分析器。

        5
  •  0
  •   Rafal    12 年前

    Intellitrace 随Visual Studio的最终版本一起提供的工具。这就是你所描述的——它记录了你的应用程序中发生的事情,并允许你在不执行程序的情况下调试它,同时将鼠标悬停在变量和所有其他调试窗口上以帮助你。

        6
  •  0
  •   Yahya    12 年前

    你可以使用 PostSharp . 我发现记录调试时间非常有用,因为部署了环境应用程序。并记录了许多东西。

    但显然,您需要指定需要记录的所有变量。

    查看更多详细信息 here .