问题标签 [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.

0 投票
2 回答
1612 浏览

.net - 您如何在进程中将本机映射到 IL 指令指针

在使用 .NET 框架的非托管 API 来分析 .NET 进程内进程时,是否可以查找与提供给 StackSnapshotCallback 函数的本机指令指针相关的 IL 指令指针?

可能很明显,我正在拍摄当前堆栈的快照,并希望在堆栈转储中提供文件和行号信息。托管堆栈资源管理器通过查询ISymUnmanagedMethod::GetSequencePoints. 这很好,但是序列点与偏移量相关联,到目前为止我假设这些是从方法开始的偏移量(在中间语言中)。

在对他的博客文章Profiler stack walk: Basics and beyond的后续评论中,David Broman 表示可以使用ICorDebugCode::GetILToNativeMapping. 但是,这并不理想,因为获取此接口需要从另一个调试器进程附加到我的进程。

我想避免这一步,因为我想在拍摄这些快照时继续能够从 Visual Studio 调试器中运行我的应用程序。它可以更轻松地单击输出窗口中的行号并转到有问题的代码。

该功能是可能的......您可以在托管代码内部随意吐出一个行号堆栈跟踪,唯一的问题是它是否可访问。另外,我不想使用System::Diagnostics::StackTraceorSystem::Environment::StackTrace功能,因为出于性能原因,我需要延迟堆栈的实际转储..所以节省用于稍后解析方法名称和代码位置的成本是可取的.. . 以及混合本机和托管帧的能力。

0 投票
2 回答
6174 浏览

clr - “Cor”代表什么?

我在主 CLR dll mscorlib.dll 中看到了它,并且在这个 CLR Profiling API 接口 ICorProfilerCallback2 中看到了它。

只是好奇:“Cor”这个词代表什么?

0 投票
5 回答
800 浏览

.net - 我是否需要编写自己的非托管 IL 库来使用 CLR Profiling API 重写 IL?

我一直在看一些关于 CLR Profiling API 的文章,其中许多文章都谈到了调用 SetILFunctionBody() 来进行实际的 IL 重写;然而,这些文章都没有真正解释你可以用什么来重写实际的方法 IL 字节。是否有一个非托管库允许我编写 IL,或者我必须自己编写一个?

0 投票
1 回答
694 浏览

.net - 为什么探查器无法附加?

我为 .NET 应用程序编写了一个小型分析器。它使用ICorProfilerCallback2接口。

探查器附加并适用于 .NET 2.0 应用程序,但不适用于 .NET >2.0(3.0、3.5、4.0)。当我启动一个用 .NET 4.0 编译的 exe 时,什么也没有发生,但是对于 .NET 2.0,探查器会启动。我在运行托管 exe 之前设置了以下变量

知道为什么会发生这种情况吗?甚至进不去DllMain

0 投票
1 回答
5725 浏览

c# - 是否可以直接从 C# 使用 Profiling API?

我只想使用 .NET Profiling API(ICorProfilerCallback等),但同时不想处理 C++。我已经环顾了一段时间,但没有找到 C# 中的任何示例,但 C# + C++ 中最有趣的部分是使用 C++ 编写的。

0 投票
1 回答
934 浏览

c# - CLR 探查器:使用 DefineAssemblyRef 的问题

我想编写一个 CLR 分析器来将我们的应用程序函数与GetILFunctionBody/SetILFunctionBody.

我想在这段代码中使用 DefineAssemblyRef 导入我们的 c# dll(用于 IL 代码),DefineAssemblyRef 总是返回True?我的dll必须签名吗?是否需要安装在全局程序集缓存 (GAC) 中?

0 投票
1 回答
301 浏览

.net - 如何在 .NET 分析器(ICorProfilerCallback)中获取唯一的方法 ID?

我使用 .NET 分析 API (ICorProfilerCallback) 并很快发现 FunctionID 不稳定(它可能会被重用,请参阅http://msdn.microsoft.com/en-us/library/bb384619.aspx)。没关系。我想出了用模块版本 ID (MVID) 和方法令牌 (mdTokenDef) 对方法进行编码的想法。

但是,我担心这是空间无效(GUID 为 16 个字节 + 令牌为 4 个字节)。现在我考虑使用某种散列(我认为 32 位散列应该足够了)。

你怎么看,有更好的方法来编码方法吗?

0 投票
1 回答
2063 浏览

c++ - 分析动态 pinvoke

我正在研究 MSIL 探查器,并遇到了接口的问题ManagedToUnmanagedTransitionUnmanagedToManagedTransition回调。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的函数名称?

0 投票
1 回答
361 浏览

c++ - CLR 探查器:COM 风格的转换和从派生接口调用函数

我需要开发一个专门的 CLR 分析器。CLR 探查器必须作为 COM 服务器实现ICorProfilerCallback或当前最高 5 的较新版本来实现。探查器初始化发生在回调方法Initialize(IUnknown* pICorProfilerInfoUnk)中。这使人们有机会对QueryInterface提供的IUnknown对象执行操作并获得指向ICorProfilerInfo接口的指针。从 .NET 4.5 开始,有ICorProfilerInfoICorProfilerInfo2ICorProfilerInfo3ICorProfilerInfo4,每个新版本都提供附加功能。理想情况下,我想获得一个指向最新可用版本的指针,并让 vtables 找出真正的对象是什么。

请注意,在所有情况下,指向返回接口的指针都是相同的变量m_pICorProfilerInfo,其类型为CComQIPtr<ICorProfilerInfo>。然后我在它上面调用方法,而忽略了实现该方法的对象的实际类型。

这让我想到了两个问题:

  1. 在 COM / ATL 上下文中,检索派生接口,将它们存储在上述父接口中,然后从中调用函数是否安全?
  2. 父接口显然不知道派生接口中的功能。如何检查指针是否是派生接口(例如ICorProfilerInfo2)并将其转换为此类?

在到目前为止的测试中,#1 通常看起来还可以。但我更愿意确认或建议。我对第 2 点更加不确定。例如,ICorProfilerInfo有一个SetEnterLeaveFunctionHooks功能,而ICorProfilerInfo2有一个SetEnterLeaveFunctionHooks2功能。我想做类似下面的伪代码:

任何关于如何实现这一点的建议将不胜感激。

0 投票
1 回答
430 浏览

.net - .NET Profiler 进入/离开函数挂钩未调用

我想使用 .NET 分析器来跟踪应用程序的调用函数。我使用CLR Profiler作为模板,但没有更改分析器 (Project ProfilerOBJ) 本身(GUID 除外)。当我尝试分析应用程序时,不会JITCompilationStarted调用进入/离开函数挂钩(除了其他回调,如)。但也有一些被调用的回调(例如)(它告诉我分析器已在进程中加载​​)。Shutdown

我尝试以 32 位和 64 位运行进程(使用 64 位,函数挂钩似乎是在某处定义的)但没有成功。

我分析的测试应用程序如下:

我希望至少调用回调ICorProfilerCallback::ObjectAllocated和进入/离开函数挂钩。但唯一调用的回调是ICorProfilerCallback::Shutdown.

似乎甚至没有调用原始 CLR 探查器的进入/离开函数挂钩(我试图在回调中输出一条消息)。

我错过了什么?除了注册进入/离开功能挂钩之外,还有更多的事情要做吗?还是我对进入/离开功能挂钩做出了错误的假设?