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