共用方式為


IDiaSession::getFunctionFragments_VA

擷取位於指定虛擬位址 (VA) 之函式的位址和不和諧片段長度。

語法

HRESULT getFunctionFragments_VA(
    ULONGLONG vaFunc,
    DWORD cbFunc,
    DWORD cFragments,
    ULONGLONG *pVaFragment,
    DWORD *pLenFragment
);

參數

vaFunc

[in]函式的虛擬位址。

cbFunc

[in]函式的總大小,以位元組為單位(也就是函式的長度)。

cFragments

[in]針對 pVaFragmentpLenFragment配置的項目計數。

pVaFragment

[out]要接收每個片段虛擬位址的陣列緩衝區。 這必須至少 cFragments 很長。

pLenFragment

[out]要接收每個片段之長度的陣列緩衝區,以位元組為單位。 這必須至少 cFragments 很長。

傳回值

如果成功,則會傳回 S_OK;否則,會傳回錯誤碼。

範例

這示範如何透過 IDiaSymbol擷取函式的位址和長度,然後擷取片段數目、擷取函式片段集,然後將它們列印為開始和結束位址的清單。

HRESULT PrintFunctionFragments(CComPtr<IDiaSymbol> pFunc) {
   ULONGLONG vaStart = 0;
   ULONGLONG cbFunc = 0;

   HRESULT hr = pFunc->get_relativeVirtualAddress(&vaStart);
   if (FAILED(hr)) {
       return hr;
   }
   hr = pFunc->get_length(&cbFunc);
   if (FAILED(hr)) {
       return hr;
   }

   DWORD cFragments = 0;

   hr = pSession->getNumberOfFunctionFragments_VA(vaStart, (DWORD) cbFunc, &cFragments);
   if (FAILED(hr)) {
       return hr;
   }

   ULONGLONG * rgVA = new (std::nothrow) ULONGLONG[cFragments];
   if (rgVA == nullptr) {
       return E_OUTOFMEMORY;
   }

   DWORD * rgLen = new (std::nothrow) DWORD[cFragments];
   if (rgLen == nullptr) {
       delete[] rgVA;
       return E_OUTOFMEMORY;
   }

   hr = pSession->getFunctionFragments_VA(vaStart, (DWORD) cbFunc, cFragments, rgVA, rgLen);
   if (FAILED(hr)) {
       delete[] rgVA;
       delete[] rgLen;
       return hr;

   }
   for (DWORD i = 0; i < cFragments; i++) {
       printf("  %016llX -- %016llX\n", rgVA[i], rgVA[i] + rgLen[i] - 1);
   }

   delete [] rgVA;
   delete [] rgLen;

   return S_OK;
}

另請參閱