【问题标题】:Watching value types on the stack and objects on heap from within an application从应用程序中观察堆栈上的值类型和堆上的对象
【发布时间】:2011-04-17 02:51:17
【问题描述】:

如果这是一个愚蠢的问题,请原谅我。可以在应用程序(例如控制台应用程序)运行时以编程方式“观察”堆栈和堆的内容吗?是否有任何 API 可以做到这一点?

【问题讨论】:

  • 假设有:进行观察的代码本身将使用进程的堆栈和堆,从而改变结果。您需要的是 debuggermemory profiler,或两者兼而有之。然后您可以从外部过程中观察正在发生的事情。以编程方式执行此操作:为自己编写一个调试器。

标签: c# .net heap-memory stack-memory


【解决方案1】:

好吧,您可以尝试使用CLR Debugger API - 尽管我不确定您是否可以在同一进程中使用它。但是,我认为可能有更好的解决方案......你实际上想做什么?这里的大局是什么?

【讨论】:

  • 纯粹从学习的角度来看。我认为每次应用程序(如您提到的,可能是不同的)新对象时,看到一个计数器(在我的 UI 上)在“堆”上增加会很有趣。更新:-我想我应该从您上面提到的链接中查看以下段落:-“可以检查线程以检查其调用堆栈。线程的调用堆栈分为两个级别:链级别和堆栈级别帧级别。调用栈首先被分解成链。链是一个连续的逻辑调用栈段..."
  • @ydobonmai:我会将它作为一个事件连接到一个应用程序中。除非你真的需要,否则我不会开始尝试进入调试器 API。
  • “我会将它作为一个事件连接到一个应用程序中”。你说的是哪个“事件”?你的意思是你会在我新建的每个对象的构造函数中增加一个计数器,或者我完全错了。可以举个例子吗?
  • @ydobonmai:如果您想跟踪创建的每个对象,那么是的,您需要从每个构造函数中调用一个方法。当然,这不会帮助您跟踪不受您控制的对象的构造。如果没有大量时间,我不会尝试做这件事 - 我不希望调试器 API 特别简单。
【解决方案2】:

我不知道,虽然一些非托管代码可以轻松跟踪堆栈,而跟踪堆需要考虑 GC,因为指针可以在每次 GC 之后移动。

现在,由于唯一可以更改变量的应用程序是您的控制台应用程序(!),那么您为什么要这样做呢?当然,您只会在应用程序中跟踪您自己在做什么。是为了修复错误吗?在这种情况下,我建议您进行代码审查而不是黑魔法。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2014-01-28
    • 2016-02-04
    • 2013-01-25
    • 2020-08-24
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多