【问题标题】:Code Analysis from Common Intermediate Language (CIL)来自通用中间语言 (CIL) 的代码分析
【发布时间】:2012-07-13 00:12:41
【问题描述】:

我想对我的 .NET 代码(它是 .dll、.exe 和 C# 代码的组合)进行一些相当基本的程序分析。使用 Microsoft 的Common Compiler Infrastructure,我首先将代码转换为我想要构建调用图的 IL 形式。获得调用图后,是否可以利用一些标准工具来深入了解代码复杂性、识别瓶颈、内存占用等?任何指针将不胜感激!

【问题讨论】:

  • 查找性能瓶颈的最佳方法是使用分析器。内存分析器将帮助您解决内存问题。不运行代码很难分析这种事情。
  • 很抱歉给您带来了困惑。我不是在寻找内存泄漏/问题本身。相反,试图衡量一个进程的内存占用,即有多少对象分配等(都在静态程序分析的领域内)
  • 我不知道是谁叮你的,但我不认为这是合理的。加个反丁。我不知道在 CCI 之上可以使用哪些工具(据我所知,CIL 不是 Microsoft,所以我对您实际谈论的基础架构有点困惑)。无论如何,我猜那里没有很多,但这是一个猜测。
  • 我不确定这是否是您正在寻找的,但 JetBrains 在他们的产品中做了一些静态分析(例如 resharper),并且正在对一个名为 N2 的项目做一些事情,该项目似乎有对你正在寻找的东西有一定的亲和力。见blogs.jetbrains.com/dotnet/2012/06/jetbrains-and-nemerle

标签: .net optimization profiler cil cci


【解决方案1】:

我认为你想要的几乎是不可能的。对象分配的数量可能会因特定输入而有很大差异。

例如,假设您的程序中有一个方法分配了很多对象,但它只能在某些条件下运行。如果您的分析要准确评估对象分配的计数,则需要知道该方法是否运行。这样做的唯一方法是实际评估该条件,这意味着您实际上需要运行程序。

而且内存占用可能更加困难:它需要您跟踪完整的对象图并模拟 GC。

简而言之:找出程序性能特征的最佳方法是实际运行它。使用静态分析做同样的事情会很困难而且不准确。不要忘记it's impossible to find out whether program completes using static analysis。我觉得你想要的更难。

【讨论】:

  • 我认为您在低估静态分析方面走得太远了。对于您尝试过的任何运行,运行该程序可能不会出现任何问题,但您的应用程序仍然可能存在错误/泄漏。这就是静态分析的重点。我同意动态分析已被广泛接受、易于完成且通常非常有用。
  • 但是 OP 似乎并没有在寻找错误或泄漏。他似乎想得到统计数据。而且我确实认为静态分析是错误的工具。
  • 他说“获得洞察力”,这通常意味着“以任何可能的方式”,但他非常坚持想要静态分析。
  • 他在a comment 中明确表示这不是他想要的:“我不是在寻找内存泄漏/问题本身。”
  • Ira, svick- 感谢您的意见!我完全不反对动态分析。我在这里的问题只是想问静态分析(工具)能走多远。虽然如果没有符号/concolic 测试很难预测条件对象分配,但理论上应该可以知道更坏的情况(通过跟踪 Newobj IL 语句)。一种方法是制作一个 IL 解析器,编写脚本来生成调用图并跟踪这些变量。但是,在动手之前,我想知道是否有可用的工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
相关资源
最近更新 更多