问题标签 [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 投票
1 回答
111 浏览

asp.net-core - 我应该跟踪哪种方法以了解新请求进入 .net 核心应用程序

我正在实施分析器来跟踪传入 IIS 中托管的 .net 核心应用程序的 http 请求。我正在使用 coreclr 分析 api 来挂钩方法进入/退出。

我应该跟踪哪种方法以了解进入我的应用程序的新 http 请求。

0 投票
1 回答
222 浏览

clr-profiling-api - 如何使用 ICorProfilerInfo3 接口中的 GetFunctionEnter3Info 函数从 COR_PRF_ELT_INFO 获取 COR_PRF_FUNCTION_ARGUMENT_INFO

我正在使用 CLR 分析 API 并尝试使用 GetFunctionEnter3Info 函数从 COR_PRF_ELT_INFO 获取参数信息 (COR_PRF_FUNCTION_ARGUMENT_INFO)。

下面是我的代码。似乎 GetFunctionEnter3Info 函数没有设置 pArgumentInfo 的值。它始终具有空值。但是,该函数返回 S_OK,这是成功的。

我可能会遗漏一些东西。我应该如何从 COR_PRF_ELT_INFO 获得 COR_PRF_FUNCTION_ARGUMENT_INFO ?

0 投票
1 回答
71 浏览

clr-profiling-api - 我们可以在 CLR 分析中使用 IMetaDataImport2 从类中调用方法吗?

我正在使用 CLR 分析 API 来分析我的 .NET Core 应用程序。

在方法中输入钩子我可以得到classID和元数据。有没有办法使用元数据从该类调用另一个函数?

例如:考虑下面的例子。在 CommonStats 类中,当为函数 ProcessRequestInternal 调用方法进入/退出挂钩时,我需要调用函数 GetDefaultValue 并保存返回值。

0 投票
1 回答
116 浏览

clr-profiling-api - 如何使用 ICorProfilerInfo2 从字节数组对象中获取值

我正在使用 ICorProfilerCallback2 接口来分析我的应用程序。在函数输入钩子上,我试图从作为参数传递给函数的字节数组中读取值。我有参数信息 COR_PRF_FUNCTION_ARGUMENT_INFO,我可以从中获取字节数组参数的起始地址。

如果它是一个字符串参数,我可以使用 ICorProfilerInfo2 接口中的“GetStringLayout”方法来获取 bufferoffset 和 stringlengthoffset。

如何找到字节数组的偏移量以及如何从中读取值?

我在哪里可以找到这些文件?

0 投票
1 回答
80 浏览

.net - .NET Profiler - 获取函数参数的类型

我已经实现了 .Net Profiler 回调,它允许我获取有关在 .NET 应用程序中调用的所有函数的数据。函数回调很好用。从回调开始,我打电话给

GetModuleMetaData(moduleId, ofRead, IID_IMetaDataImport, (IUnknown**)&metaDataImport);

我随后打电话给

metaDataImport->EnumParams(&phEnum, (mdMethodDef)metaDataToken, rParams, cMax, &pcTokens);

pcTokens 包含一组参数引用标记。我可以使用这些标记通过以下调用获取参数名称。

metaDataImport->GetParamProps(rParams[i], &(mdMethodDef)metaDataToken, &pulSequence, szName3, cchName3, &pchName3, NULL, NULL, NULL, NULL);

我一直试图找到每个参数的类型。我找不到任何可以给我参数类型的文档。https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/metadata/imetadataimport-interface

有什么想法吗?

0 投票
1 回答
50 浏览

.net - 解析 COR_PRF_FUNCTION_ARGUMENT_INFO 结构

我想知道我应该如何解析提供给SetEnterLeaveFunctionHooks3WithInfo函数的回调方法的COR_PRF_FUNCTION_ARGUMENT_INFO结构。

据我了解,该结构包含一组内存地址,其中包含函数参数值的位置。可以在此处找到有关此结构的信息:https ://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/cor-prf-function-argument-info-structure

我还解析了函数的元数据以确定提供给函数的参数数量和每个参数的类型。我使用了IMetaDataImport接口的GetMethodProps函数。

我不知道下一步该做什么,我将如何继续使用COR_PRF_FUNCTION_ARGUMENT_INFO结构获取每个参数的实际值?我是否需要确定每个参数的大小来计算每个参数的内存地址的偏移量?谢谢你的帮助

0 投票
1 回答
199 浏览

c# - IMetaDataEmit::DefineUserString 返回 HRESULT: -2​​147024882 (0x8007000E E_OUTOFMEMORY)

我正在玩CLR 的非托管 Profiling 接口

当使用 netcoreapp3.1 或 net5.0 控制台应用程序运行时,在 inICorProfilerCallback::JITCompilationStarted或 in 中,对在控制台应用程序模块中存储字符串文字并返回令牌的ICorProfilerCallback::ModuleLoadFinished任何调用都会返回 -2147024882 (0x8007000E E_OUTOFMEMORY) 的 HRESULT。无论传递什么值,调用都会返回相同的 HRESULT 。IMetaDataEmit::DefineUserStringmdStringIMetaDataEmit::DefineUserString

.NET 应用程序非常简单

并且是构建和运行的

在运行应用程序时设置相关的 Core CLR 分析环境变量

分析器是使用com-rs用 Rust 编写的,调用IMetaDataEmit::DefineUserString定义为

不安全的调用是对 comr-rs 生成的函数

我正在使用在分析器的其他位置U16CString创建一个*const u16指针以传递LPCWSTR给接口函数,例如IMetaDataImport::EnumMethodsWithName,所以我不认为这是一个问题,但我想我会提到它。

失败调用的日志是

将指针传递给的UCString.inner是。Vec<u16>IMetaDataEmit::DefineUserString

IMetaDataEmitICorProfilerInfo在初始化使用时从传递给探查器的存储中检索ICorProfilerInfo::GetModuleMetaData,使用CorOpenFlags ofReadofWrite

whereGetModuleMetaData是在ICorProfilerInfo生成的 withcom::interfaces!宏上定义的

好像我在 Rust 的某个地方遗漏了一些东西。ICorProfilerInfo从, IMetaDataImport,中检索数据与IMetaDataImport2获取和修改 IL 函数体(更改现有指令)一样有效。我的一个想法是是否IMetaDataEmit可能需要可变,但我认为不必如此,因为元数据的更改发生在 FFI 边界的 C++ 运行时侧。

编辑

我组装了一个简单的 C++ 分析器,它调用并IMetaDataEmit::DefineUserStringICorProfilerCallback::ModuleLoadFinished示例 .NET 应用程序上按预期工作,因此这表明问题出在某个地方的 Rust 代码中。

浏览运行时代码,我认为RegMeta::DefineUserString是代码路径的实现DefineUserString和跟踪,我认为E_OUTOFMEMORY是来自StgBlobPool::AddBlob.

0 投票
1 回答
50 浏览

async-await - .NET 分析 api - 计算执行异步方法所需的时间

为了监控我的 dotnet 核心应用程序,我使用 .NET clr profiling api 来获取方法级别的跟踪并计算任何方法完成其执行所花费的时间。我无法获得异步方法所花费的时间。

在上面的代码中,我从 PostDataAsyncWithHeader() 方法发出 api 请求,这几乎需要 5 秒才能完成。但是当我使用 clr 分析 Enter 和 exit 挂钩来计算时间时,Get() 方法显示大约 5 秒,但 RunQueryAsync() 和 PostDataAsyncWithHeader() 方法显示 0ms。但实际时间由 PostDataAsyncWithHeader() 方法占用。

我想找到 PostDataAsyncWithHeader() 方法所花费的确切时间。请建议我如何实现它。

0 投票
0 回答
33 浏览

async-await - .NET profiling api获取当前线程的父线程ID

我正在使用 dotnet 分析 api 来监视多线程程序中的方法。我看到我的一种方法是花费更多时间。当我检查时,我看到该方法的线程 ID 与调用它的父方法不同。如何找到该线程的父线程 ID,以便获取堆栈跟踪。

0 投票
1 回答
53 浏览

c# - .NET Profiler - Filter out .Net Framework Functions

I've created a .NET Profiling DLL that implements the ICorProfilerCallback3 interface.

I'm using the profiling to trace the functions called during Runtime, however, I'm looking to trace application specific functions, not the standard .NET framework functions.

I successfully used the SetEnterLeaveFunctionHook method and supply it with callback functions.

Then while I'm in the callback functions, I get the function information and assembly information using the GetFunctionInfo and GetModuleInfo2 functions.

The issue I'm running into is this obviously gets called for EVERY function and I'm looking for a way to distinguish between a .Net framework DLL and not a standard DLL.

For instance the majority of calls when the application starts goes to the mscorlib.dll which I'm not interested in tracing.

Any thoughts or ideas? I've tried call this function but pdwImplFlags doesn't appear to populate with anything useful.

https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/metadata/imetadataimport-getmethodprops-method