问题标签 [clr-profiling-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net-3.5 - CLR 分析 API 版本
我有一个我编写的 CLR 分析器,它在 JIT 时间将代码注入方法中。我注入的代码取决于 .NET 3.5+。如何检测在探查器初始化时可用的 .NET Framework 版本 ( ICorProfilerCallback::Initialize
)?
理想情况下,如果他们没有安装 .NET 3.5+,我只想不加载我的分析器,这意味着CORPROF_E_PROFILER_CANCEL_ACTIVATION
从Initialize
. 如果我直到稍后才检测到版本(例如在模块加载时),那么我的分析标志将被设置,并且某些 CLR 优化将被禁用,这是不可取的,因为分析器实际上不会工作。
c# - .Net Profiling - Knowing the managed thread begin and end
I am developing a .Net profiler.. I use ILRewriting for this..
I need to trace the managed thread creations and destroys.
Need to know the threading related function that will be called at the beginning of the thread and during the end of the thread , i can inject my code to it and record whenever the event happens.
Any ideas about the default function that will be called at the time of thread creation and ends..??
OR else is there any other way to capture the managed thread creation and destroying events??
I know that we can trace by setting the threading event mask.. but i need to capture particular managed threads not all the threads..
c# - 从 C# 优化 C++ 调用
我正在从 C# 调用两个 C++ 函数调用,我的代码如下。
在 C++ 代码中是:
这个函数从 C# 到 C++ 被调用了大约 200 万次。如果没有这个函数调用,我的 Web 请求将在 5.9 秒内完成。通过这个函数调用,我将得到 7.1 秒..
大约 15% 的开销。我已经通过看到一个帖子使用了“SuppressUnmanagedCodeSecurity”,它将开销从 30% 减少到 15% .. 但是还有其他方法可以减少这 15% 的开销吗??
更新1:
对于 C# 的每个函数调用,函数 ID 都需要发送到 C++。C++ 函数不是空函数。它需要将函数 ID 存储在 STL 中,然后另一个线程将处理它。我正在做一个 .NET 分析器之类的事情。我需要分析每个函数调用。这个 FuncA C++ 函数将从注入的辅助函数中调用。
谢谢,
./拉胡尔
c# - ICorProfilerCallback2:CLR 分析器不记录所有离开呼叫
我正在尝试编写一个记录进程中所有 .Net 方法调用的分析器。目标是使其具有高性能并保持假设最后 5-10 分钟在内存中(固定缓冲区,循环覆盖旧信息),直到用户触发将该信息写入磁盘。预期用途是跟踪很少重现的性能问题。
我从https://github.com/appneta/SimpleCLRProfiler的 SimpleCLRProfiler 项目开始。分析器使用 .Net 分析的ICorProfilerCallback2回调接口。我让它在我的环境中编译和工作(Win 8.1、.Net 4.5、VS2012)。但是,我注意到有时会丢失已记录 Enter 呼叫的 Leave 呼叫。Console.WriteLine 调用示例(我将 DbgView 的输出减少到理解的最低限度):
两个进入呼叫没有对应的离开呼叫。分析后的 .Net 代码如下所示:
相关的 SimpleCLRProfiler 方法是:
有谁知道,为什么 .Net Profiler 不会对所有离开方法执行离开调用?顺便说一句,我检查了 OnLeaveMethod 不会在任何跟踪之前由于异常左右而意外退出。它没有。
谢谢,克里斯托夫
c# - ICorProfiler:为什么我会为 jitted 函数得到错误的类型标记?
我的代码结构如下:
我正在使用 ICorProfiler2 API 来分析该代码。现在,当方法 M 被 jitted 时,我得到一个 FunctionID* 指向其 ID 的指针。然后我执行以下操作(高度缩写):
这给了我变量 classToken 中的 TypeToken。
我希望这是在源(又名 A 类)中声明 M 的类型,但我收到了委托 B 的类型令牌。所以我的问题是:我做错了什么还是我假设 GetMethodProps 返回 M 的定义类型的类型标记错误?
不幸的是,GetMethodProps 的文档不是很有帮助:https ://msdn.microsoft.com/en-us/library/ms233163(v=vs.110).aspx
编辑: 澄清:我知道返回了错误的类型,因为我生成了一个包含所有类型/函数标记及其映射到的名称的文件。我用ILSpy验证了这些令牌:它们是正确的。这种映射也在其他应用程序中进行了多次测试,似乎工作得很好,所以我认为这不是问题的根源。
c# - 使用 .NET 的 ICorProfilerInfo::SetILFunctionBody,是否可以将 try-finally EH 子句添加到没有任何异常处理的方法中?
我正在开发一个 IL 重写分析器,我的目标是能够向方法添加一个 try-finally 块。本质上:
根据分析 API ( https://msdn.microsoft.com/en-us/library/ms232096.aspx ) 的有限文档和信息,似乎应该能够使用 SetILFunctionBody 添加新的异常处理子句。
我一直在关注来自http://clrprofiler.codeplex.com/SourceControl/list/changesets?branch=master的 Microsoft 示例 ILRewrite 分析器。我添加了代码以将“EHClause”添加到由“ILRewriter”类维护的 EHClause 列表中,并添加了适当的 leave.s 和 endfinally IL 指令。从分析器的角度来看,一切似乎都正常(SetILFunctionBody 成功),但是当调用修改后的方法时,我们得到了可怕的“公共语言运行时检测到无效程序”。没有更多信息的例外。
我尝试过的事情:
- 审查了仪器,代码没有在受保护区域内做非法的事情(例如返回或分支到外部)。
- 如果我删除 EHClause 和 leave.s/endfinally 指令,则检测方法运行良好。
- 我在 ILRewriting 代码中添加了大量日志记录,以便在最后转储修改后的 IL、EH 信息和字节。我已经使用所需的 try-finally 和状态跟踪代码制作了一个类似的方法,并且这两种方法的 IL(检测与编译)是相同的。然而,实际的“导出”字节有点不同。
这使我相信,分析 API 可能不支持将新的异常处理子句添加到没有任何开头的方法中。我很想听听您对如何解决这个问题的任何想法。
这是来自日志记录的一些信息 - * 是原始 IL。
这是使用当前分析器添加 nop 的样子:
c# - 使用 ICLRProfiling::AttachProfiler() 进行 CLR 分析和重写
我收集到使用 CLR Profiler ICLRProfiling::AttachProfiler方法的主要好处是,您现在可以在目标进程启动后很长时间附加您的 CLR 分析器,并且您也不必在启动时将环境变量COR_ENABLE_PROFILING
和COR_PROFILER
环境变量传递给进程? 这两个假设都是正确的吗?
另外,我在2011 年的 CLR Profiling 团队博客文章中读到 ICLRProfiling::AttachProfiler不支持以下内容,但将来会:
GetILFunctionBody
GetILFunctionBodyAllocator
SetILFunctionBody
SetILInstrumentedCodeMap
SetEnterLeaveFunctionHooks*
SetFunctionIDMapper*
GetNotifiedExceptionClauseInfo
与 Enter/Leave/Tailcall 相关的所有方法
现在支持这些吗?我在问,因为我还没有在网上找到更多关于这个主题的内容,而且 2011-2012 年的许多 Microsoft 链接现在都已失效。如果不是,那么在使用ICLRProfiling::AttachProfiler附加我的 CLR Profiler 时,甚至可以重写函数体吗?
.net - 为什么我的 CLR 分析器不加载普通的、非配置文件优化的原生图像?
我正在开发一个 CLR 分析器,使用CLR分析接口,并且在运行我的分析器(或至少,似乎没有加载这样的图像,但现在我不能确定)。我究竟做错了什么?ngen.exe
/profile
我已验证COR_PRF_USE_PROFILE_IMAGES
未在我的分析器中设置标志(仅允许配置文件优化的本机图像)。
以下是我尝试过的。非常感谢任何帮助/提示!
FUSLOGVW 输出:
我一直在检查本机图像活页夹日志(在FUSLOGVW.exe
)试图弄清楚图像是否已加载:
当
HelloWorld.exe
使用“普通”本机映像运行时 - 启用了探查器的 NGEN'dngen.exe install HelloWorld.exe
- 程序集活页夹日志 (ExplicitBind!FileName=(HelloWorld.exe).HTM
) 显示:因此,基于该警告,似乎未加载本机图像。
当使用配置文件图像运行时,NGEN'd with
ngen.exe install HelloWorld.exe /Profile
,图像似乎已成功加载,并且程序集活页夹输出为:所以看来这一次,图像被加载了。
只是为了确保,在我
c:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib
为所有图像删除的每个 ngen 步骤之间,以就使用的设置达成一致(没有额外的依赖关系HelloWorld.exe
)。
附加信息:
- 我使用的是 .NET 4.0,所以我无权访问
COR_PRF_DISABLE_ALL_NGEN_IMAGES
,它完全禁用了本机图像(在David Broman的这篇博文中进行了描述)。这可能有助于故障排除。
c# - C# icorprofilercallback4::SurvivingReferences
我希望能够在任何应用程序中找到某种对象的所有幸存引用,而无需使用外部内存分析器。
我的基本想法是,我只想能够在我的应用程序中列出所有活跃的用户控件,包括名称和对象大小,这将使我能够发现所有未使用的控件,女巫并没有真正死掉:)
经过一些谷歌研究后,我发现了一些应该符合我兴趣的东西。
icorprofilercallback4::SurvivingReferences
看起来这是纯 C++,我找不到任何示例之王。
有人已经尝试这样做了吗?我在寻找解决方案的正确方向上?
谢谢你对我的问题感兴趣。
c++ - .NET Profiler 进入/离开函数挂钩不会在出现异常的情况下被调用
我正在为一些自定义要求构建一个 .Net Profiler。
我想在 Enter 和 Leave 中加入一些特定的方法。为此,我尝试了以下两种方法。
IL Rewrite - 我能够在这两个地方注入自定义代码。它已成功注入并调用自定义代码。我还能够获取输入参数“this”和返回值。在 Enter 注入并不难。但是,在离开时注入很复杂,因为方法中可能在多个位置返回。我必须在每个编写 return 语句的地方注入代码。
这有点复杂,但有点可行。但是,如果有任何异常,执行不会到达 return 语句,因此我注入的代码不会被调用。
根据此处
SetEnterLeaveFunctionHooks2
给出的ICorProfilerInfo2
示例代码订阅进入/退出。
在这两种情况下,如果方法中出现异常,则不会调用 Leave 处的钩子。
如何处理?我想要所有场景中的返回值。如果出现异常,我应该知道有异常;我会认为是“没有返回值”。可能,我可能还需要异常详细信息。
下面是一个示例方法。我想为 GetString 方法挂钩 Enter 和 Leave。它有多个回报。我能够在正常情况下捕获返回值。但是在出现异常的情况下,执行会立即停止,因为返回时的钩子没有被调用。