问题标签 [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 - 您如何在进程中将本机映射到 IL 指令指针
在使用 .NET 框架的非托管 API 来分析 .NET 进程内进程时,是否可以查找与提供给 StackSnapshotCallback 函数的本机指令指针相关的 IL 指令指针?
可能很明显,我正在拍摄当前堆栈的快照,并希望在堆栈转储中提供文件和行号信息。托管堆栈资源管理器通过查询ISymUnmanagedMethod::GetSequencePoints
. 这很好,但是序列点与偏移量相关联,到目前为止我假设这些是从方法开始的偏移量(在中间语言中)。
在对他的博客文章Profiler stack walk: Basics and beyond的后续评论中,David Broman 表示可以使用ICorDebugCode::GetILToNativeMapping
. 但是,这并不理想,因为获取此接口需要从另一个调试器进程附加到我的进程。
我想避免这一步,因为我想在拍摄这些快照时继续能够从 Visual Studio 调试器中运行我的应用程序。它可以更轻松地单击输出窗口中的行号并转到有问题的代码。
该功能是可能的......您可以在托管代码内部随意吐出一个行号堆栈跟踪,唯一的问题是它是否可访问。另外,我不想使用System::Diagnostics::StackTrace
orSystem::Environment::StackTrace
功能,因为出于性能原因,我需要延迟堆栈的实际转储..所以节省用于稍后解析方法名称和代码位置的成本是可取的.. . 以及混合本机和托管帧的能力。
clr - “Cor”代表什么?
我在主 CLR dll mscorlib.dll 中看到了它,并且在这个 CLR Profiling API 接口 ICorProfilerCallback2 中看到了它。
只是好奇:“Cor”这个词代表什么?
.net - 我是否需要编写自己的非托管 IL 库来使用 CLR Profiling API 重写 IL?
我一直在看一些关于 CLR Profiling API 的文章,其中许多文章都谈到了调用 SetILFunctionBody() 来进行实际的 IL 重写;然而,这些文章都没有真正解释你可以用什么来重写实际的方法 IL 字节。是否有一个非托管库允许我编写 IL,或者我必须自己编写一个?
.net - 为什么探查器无法附加?
我为 .NET 应用程序编写了一个小型分析器。它使用ICorProfilerCallback2
接口。
探查器附加并适用于 .NET 2.0 应用程序,但不适用于 .NET >2.0(3.0、3.5、4.0)。当我启动一个用 .NET 4.0 编译的 exe 时,什么也没有发生,但是对于 .NET 2.0,探查器会启动。我在运行托管 exe 之前设置了以下变量
知道为什么会发生这种情况吗?甚至进不去DllMain
c# - 是否可以直接从 C# 使用 Profiling API?
我只想使用 .NET Profiling API(ICorProfilerCallback
等),但同时不想处理 C++。我已经环顾了一段时间,但没有找到 C# 中的任何示例,但 C# + C++ 中最有趣的部分是使用 C++ 编写的。
c# - CLR 探查器:使用 DefineAssemblyRef 的问题
我想编写一个 CLR 分析器来将我们的应用程序函数与GetILFunctionBody/SetILFunctionBody
.
我想在这段代码中使用 DefineAssemblyRef 导入我们的 c# dll(用于 IL 代码),DefineAssemblyRef 总是返回True
?我的dll必须签名吗?是否需要安装在全局程序集缓存 (GAC) 中?
.net - 如何在 .NET 分析器(ICorProfilerCallback)中获取唯一的方法 ID?
我使用 .NET 分析 API (ICorProfilerCallback) 并很快发现 FunctionID 不稳定(它可能会被重用,请参阅http://msdn.microsoft.com/en-us/library/bb384619.aspx)。没关系。我想出了用模块版本 ID (MVID) 和方法令牌 (mdTokenDef) 对方法进行编码的想法。
但是,我担心这是空间无效(GUID 为 16 个字节 + 令牌为 4 个字节)。现在我考虑使用某种散列(我认为 32 位散列应该足够了)。
你怎么看,有更好的方法来编码方法吗?
c++ - 分析动态 pinvoke
我正在研究 MSIL 探查器,并遇到了接口的问题ManagedToUnmanagedTransition
和UnmanagedToManagedTransition
回调。ICorProfilerCallback
我要检索的是有关被调用方法的信息(它所在的名称和模块名称)。
到目前为止,它工作正常。直到所谓的动态 pinvoke 发生(详细描述于:http: //blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_ .aspx )
在这种情况下IMetaDataImport::GetPinvokeMap
失败。还IMetaDataAssemblyImport::GetAssemblyProps
返回“dynamic_pinvoke”作为程序集的名称。
如何通过动态pinvoke获取模块名称(.dll)和被pinvoke的函数名称?
c++ - CLR 探查器:COM 风格的转换和从派生接口调用函数
我需要开发一个专门的 CLR 分析器。CLR 探查器必须作为 COM 服务器实现ICorProfilerCallback
或当前最高 5 的较新版本来实现。探查器初始化发生在回调方法Initialize(IUnknown* pICorProfilerInfoUnk)
中。这使人们有机会对QueryInterface
提供的IUnknown
对象执行操作并获得指向ICorProfilerInfo
接口的指针。从 .NET 4.5 开始,有ICorProfilerInfo
、ICorProfilerInfo2
、ICorProfilerInfo3
和ICorProfilerInfo4
,每个新版本都提供附加功能。理想情况下,我想获得一个指向最新可用版本的指针,并让 vtables 找出真正的对象是什么。
请注意,在所有情况下,指向返回接口的指针都是相同的变量m_pICorProfilerInfo
,其类型为CComQIPtr<ICorProfilerInfo>
。然后我在它上面调用方法,而忽略了实现该方法的对象的实际类型。
这让我想到了两个问题:
- 在 COM / ATL 上下文中,检索派生接口,将它们存储在上述父接口中,然后从中调用函数是否安全?
- 父接口显然不知道派生接口中的功能。如何检查指针是否是派生接口(例如
ICorProfilerInfo2
)并将其转换为此类?
在到目前为止的测试中,#1 通常看起来还可以。但我更愿意确认或建议。我对第 2 点更加不确定。例如,ICorProfilerInfo
有一个SetEnterLeaveFunctionHooks
功能,而ICorProfilerInfo2
有一个SetEnterLeaveFunctionHooks2
功能。我想做类似下面的伪代码:
任何关于如何实现这一点的建议将不胜感激。
.net - .NET Profiler 进入/离开函数挂钩未调用
我想使用 .NET 分析器来跟踪应用程序的调用函数。我使用CLR Profiler作为模板,但没有更改分析器 (Project ProfilerOBJ
) 本身(GUID 除外)。当我尝试分析应用程序时,不会JITCompilationStarted
调用进入/离开函数挂钩(除了其他回调,如)。但也有一些被调用的回调(例如)(它告诉我分析器已在进程中加载)。Shutdown
我尝试以 32 位和 64 位运行进程(使用 64 位,函数挂钩似乎是在某处定义的)但没有成功。
我分析的测试应用程序如下:
我希望至少调用回调ICorProfilerCallback::ObjectAllocated
和进入/离开函数挂钩。但唯一调用的回调是ICorProfilerCallback::Shutdown
.
似乎甚至没有调用原始 CLR 探查器的进入/离开函数挂钩(我试图在回调中输出一条消息)。
我错过了什么?除了注册进入/离开功能挂钩之外,还有更多的事情要做吗?还是我对进入/离开功能挂钩做出了错误的假设?