【问题标题】:How to get COR_PRF_FUNCTION_ARGUMENT_INFO from COR_PRF_ELT_INFO using GetFunctionEnter3Info function in ICorProfilerInfo3 interface如何使用 ICorProfilerInfo3 接口中的 GetFunctionEnter3Info 函数从 COR_PRF_ELT_INFO 获取 COR_PRF_FUNCTION_ARGUMENT_INFO
【发布时间】:2019-07-21 18:56:48
【问题描述】:

我正在使用 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 ?

    PROFILER_STUB EnterStub(FunctionIDOrClientID functionId, COR_PRF_ELT_INFO eltInfo)
{
        COR_PRF_FRAME_INFO *pFrameInfo = 0;
        ULONG *pcbArgumentInfo = 0;
        COR_PRF_FUNCTION_ARGUMENT_INFO *pArgumentInfo = NULL;

        corProfilerInfo->GetFunctionEnter3Info(functionId.functionID, eltInfo, pFrameInfo, pcbArgumentInfo, pArgumentInfo);
        if(pArgumentInfo) {
            //
        }
    }

【问题讨论】:

  • 您是否在对SetEventMask 的调用中加入了COR_PRF_ENABLE_FUNCTION_ARGS
  • 是的,我做到了。我启用了以下标志:COR_PRF_MONITOR_ENTERLEAVE,COR_PRF_ENABLE_FUNCTION_ARGS,COR_PRF_ENABLE_FUNCTION_RETVAL,COR_PRF_ENABLE_FRAME_INFO
  • 该方法是否会出现在 ngen-ed 图像中? (例如 mscorlib)。我注意到您没有包含 COR_PRF_DISABLE_ALL_NGEN_IMAGES 来禁用经过 ngen 处理的图像,也没有包含 COR_PRF_USE_PROFILE_IMAGES 来请求经过配置文件支持的经过 ngen 处理的图像。

标签: clr-profiling-api


【解决方案1】:

这有点棘手,

By msdn doc:

pcbArgumentInfo [in, out] 指向 COR_PRF_FUNCTION_ARGUMENT_INFO 结构的总大小(以字节为单位)的指针(加上 pArgumentInfo 指向的参数范围的任何其他 COR_PRF_FUNCTION_ARGUMENT_RANGE 结构)。如果指定大小不够,则返回 ERROR_INSUFFICIENT_BUFFER,并将预期大小存储在 pcbArgumentInfo 中。要调用 GetFunctionEnter3Info 只是为了检索 *pcbArgumentInfo 的预期值,请设置 *pcbArgumentInfo=0 和 pArgumentInfo=NULL

换句话说,你有一个COR_PRF_FUNCTION_ARGUMENT_INFO 结构,它引用了多个COR_PRF_FUNCTION_ARGUMENT_RANGE。 首先,获取pcbArgumentInfo的多个字节,然后分配字节并将指向GetFunctionEnter3Info的指针作为COR_PRF_FUNCTION_ARGUMENT_INFO传递。

这是一个例子

PROFILER_STUB EnterStub(FunctionIDOrClientID functionId, COR_PRF_ELT_INFO eltInfo)
{
    ULONG pcbArgumentInfo = 0;
    COR_PRF_FRAME_INFO frameInfo;
    corProfilerInfo3->GetFunctionEnter3Info(functionIDOrClientID.functionID, eltInfo, &frameInfo, &pcbArgumentInfo, NULL);

    char* pArgumentInfo = new char[pcbArgumentInfo];
    corProfilerInfo3->GetFunctionEnter3Info(functionIDOrClientID.functionID, eltInfo, &frameInfo, &pcbArgumentInfo, (COR_PRF_FUNCTION_ARGUMENT_INFO*)pArgumentInfo);

    COR_PRF_FUNCTION_ARGUMENT_INFO* ptr = (COR_PRF_FUNCTION_ARGUMENT_INFO*)pArgumentInfo;
}

要访问COR_PRF_FUNCTION_ARGUMENT_RANGE 的第二个argument info 块,请使用

prt->ranges[1]

块数写在ptr->numRanges

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2017-08-13
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多