【问题标题】:see what code gets executed in realtime查看实时执行的代码
【发布时间】:2012-10-08 20:02:27
【问题描述】:

我在 调试模式下运行 Visual Studio 2012 的应用程序,

我想看看实时执行了哪些代码,相当于在做

Console.WriteLine(" command.do ... etc. "); 

在每一行之后

是否可以实时查看执行了哪些代码?

【问题讨论】:

  • 如果我是,我会直接踢我的电脑,直到它做到这一点。
  • 在第一行添加断点并按F5...魔法!
  • 或按 F11。会在第一行自动中断。
  • Chuck Norris 可以在线性时间内对列表进行排序。他使用名为 KickSort 的 QuickSort 变体。他还可以通过将它们分开来分解巨大的整数。
  • 你不能使用普通的旧断点吗?

标签: c# .net visual-studio visual-studio-2012


【解决方案1】:

是和不是。

是的,从技术上讲这是可行的。

不,您不会找到执行此操作的工具(当然,我不能 100% 确定什么不存在)。


这可以使用 .NET 框架提供的分析 API 来完成。一些分析器甚至宣传逐行跟踪,但这仅意味着他们将测量每一行的时间,而不是使用一些快捷方式来降低性能损失。

然而,你应该试着解释你最终想要完成的事情,而不是试图强迫自己走最短的路。

【讨论】:

    【解决方案2】:

    我建议你看看像 JetBrains 这样的工具。它有 10 天的免费试用期,并且可以很好地集成到 Visual Studio 中。

    http://www.jetbrains.com/profiler/

    这并不完全符合您的要求。但我想不出更好的了。

    【讨论】:

      【解决方案3】:

      实时调试时,不应延迟程序。这可以使用不便宜的外部硬件(例如逻辑分析仪)来完成。

      与其跟踪每一行的执行,不如只跟踪一些重要行的执行。该跟踪必须非常快。 Visual Studio 的跟踪太慢了,并且阻塞了调用 Trace 的第二个线程,这是实时调试中的一大禁忌。

      幸运的是,编写自己的内存跟踪很容易,只会导致微秒延迟并且是非阻塞的:

      const int maxMessages = 0x100;
      const int indexMask = maxMessages-1;
      string[] messages = new string[maxMessages];
      int messagesIndex = -1;
      
      public void Trace(string message) {
        int thisIndex = Interlocked.Increment(ref messagesIndex) & indexMask;
        messages[thisIndex] = message;
      }
      

      关于这种方法的更详细描述,它还收集线程和时间信息并很好地输出跟踪: CodeProject:实时调试多线程代码1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        相关资源
        最近更新 更多