2

IE の JavaScript Chakra エンジンで遊んでいます。

MSDN からサンプル コードをダウンロードしました。関数 ID とスクリプト ID しかない場合に関数ソースを取得する方法を見つけようとしています。

js スクリプトのプロファイリングを開始し、プロファイラー ( IActiveScriptProfilerCallback2) の出力から、どの関数がコンパイルされ、呼び出されているかを確認できます...

たとえば、コールバックはFunctionCompiled次のようになります。関数 ID とスクリプト ID、さらには関数名も取得できますが、関数のソース コードを見つける方法がわかりません。

HRESULT Profiler::FunctionCompiled(PROFILER_TOKEN functionId, PROFILER_TOKEN scriptId, const wchar_t *pwszFunctionName, const wchar_t *pwszFunctionNameHint, IUnknown *pIDebugDocumentContext)
{
    fwprintf(stdout, L"Profiler::FunctionCompiled: 0x%lx, 0x%lx, %s, %s\n", scriptId, functionId, pwszFunctionName, pwszFunctionNameHint);
    return S_OK;
}
4

1 に答える 1

2

私はそれを解決したと思います..これが私の醜いScriptCompiled関数です。

HRESULT Profiler::ScriptCompiled(PROFILER_TOKEN scriptId, PROFILER_SCRIPT_TYPE type, IUnknown *pIDebugDocumentContext)
{
    fwprintf(stdout, L"Profiler::ScriptCompiled: 0x%lx, %u\n", scriptId, type);

    if (pIDebugDocumentContext) {
        IDebugDocumentContext *debugDocumentContext = NULL;
        pIDebugDocumentContext->QueryInterface(__uuidof(IDebugDocumentContext), (void**)&debugDocumentContext);

        IDebugDocument *debugDocument = NULL;
        debugDocumentContext->GetDocument(&debugDocument);

        IDebugDocumentText *debugDocumentText = NULL;
        debugDocument->QueryInterface(__uuidof(IDebugDocumentText), (void**)&debugDocumentText);

        ULONG lines, chars;
        debugDocumentText->GetSize(&lines, &chars);

        printf("Lines: %d Chars: %d\n", lines, chars);

        chars++;
        WCHAR *text = (WCHAR*)malloc(sizeof(WCHAR) * chars);
        ULONG charsRetrieved = 0;
        debugDocumentText->GetText(0, text, NULL, &charsRetrieved, chars);
        text[charsRetrieved] = L'\0';

        wprintf(L"%s\n", text);
    }

    return S_OK;
}
于 2014-06-26T14:07:46.167 に答える