1

我正在使用 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) {
            //
        }
    }
4

1 回答 1

1

这有点棘手,

通过 msdn 文档:

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,然后分配字节并将指针传递给GetFunctionEnter3Infoas 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;
}

访问第二个使用argument infoCOR_PRF_FUNCTION_ARGUMENT_RANGE

prt->ranges[1]

块数写入ptr->numRanges

于 2019-09-08T11:31:12.747 回答