我如何将一个字符串逐行查找到创建它的代码行、方法名、类名和程序集?

Posted

技术标签:

【中文标题】我如何将一个字符串逐行查找到创建它的代码行、方法名、类名和程序集?【英文标题】:How do I chase a string down to the line of code, method name, class name and assembly that it was created in? 【发布时间】:2017-04-10 18:23:59 【问题描述】:

我的托管进程的 GC 堆转储显示,除了其他类型之外,还有很多大型字符串对象。

我关注了其中的几个:

> dumpheap -type System.String
> !do <address>

这告诉我字符串的内容是什么,以及我不太感兴趣的其他内容。

所以,我沿着字符串一直到它的 GC 根。但首先,我想确认它在 LOH 上。

> !gcwhere <address>
> !gcroot <address>

现在我能做到的就差不多了。

我想知道在哪里(哪一行代码创建了它,最好是该行的 !dumpil)以及创建它的方法的方法描述、该方法的声明类型、程序集和应用程序域程序集已加载。

【问题讨论】:

【参考方案1】:

.NET 框架不需要该信息来运行应用程序,因此它不存储它。也没有类似于 GFlags +ust 设置的标志可以激活这样的存储。使用您现在拥有的工具(转储文件或实时调试)是不可能的。

您需要像 ANTS memory profiler 或 JetBrains dotMemory 这样的内存分析器。即使那些默认情况下也不收集分配数据,您必须激活它。

dotMemory 的截图:

【讨论】:

谢谢你。我有一个 dotMemory 许可证。我会用那个。 dotMemory 能够从一开始就收集对象分配,您需要在探查器下启动应用程序时选中“立即收集分配”复选框。 jetbrains.com/help/dotmemory/2017.1/… 是的,我已经看到了。我目前正在使用评估版,同时等待我的许可证密钥。评估版禁用了立即检查分配复选框,并且没有托马斯在回答中提到的收集分配按钮。 @WaterCoolrv2:哇,演示版的限制。他们想如何赢得这样的客户?也许将其报告为错误:youtrack.jetbrains.com/oauth?state=%2Fissues%2FIDEA @WaterCoolrv2 试用期间没有任何限制。当您附加到您的进程而不是从 dotMemory 启动它时,“立即检查分配”被禁用并且“收集分配”按钮不存在。由于 MS Profiling API 限制,无法在附加模式下收集分配数据。有关详细信息,请参阅该答案***.com/questions/27483590/…

以上是关于我如何将一个字符串逐行查找到创建它的代码行、方法名、类名和程序集?的主要内容,如果未能解决你的问题,请参考以下文章

逐行读取文件

逐行读取文件并替换字符串,打印到文件

C逐行创建多维数组

如何逐行读取字符串[重复]

如何逐行读取大文件?

逐行读取文件到结构