2013-08-12 4 views
2

클래스 메소드의 주소를 찾으려면 dbghelp를 사용하려고합니다. 예 : DirectX 메서드 (DXGI) : dxgi! CDXGIFactory :: CreateSwapChainImpldbghelp를 사용하여 클래스 메소드의 심볼 주소 찾기

올바른 기호를 사용하고 _NT_SYMBOLS_PATH가 정의되었습니다. WinDBG에서 사용 은 다음 '의 X'명령이 제대로 작동 :

result = SymFromName(hprocess, L"dxgi!CDXGIFactory::CreateSwapChain", &symbol) 
// result is false, GetLastError is 1168 
:

0:000> x dxgi!CDXGIFactory::CreateSwapChain 
6acb78ce   dxgi!CDXGIFactory::CreateSwapChain (<no parameter info>) 
6acdaf69   dxgi!CDXGIFactory::CreateSwapChain (<no parameter info>) 

을하지만, SymFromName이 문자열을 사용하려고, 나는 오류 1168 (요소가 발견되지 않음)를 받고 있어요

'::'때문에 또는 동일한 기호에 대해 두 개의 주소가 있기 때문에 실패합니까 (어떻게 해결할 수 있습니까?).

+1

시도한 전체 코드를 게시 할 수 있습니까? SymInitialize 등 등요? –

+1

또한 가능한 경우 유니 코드 버전의 API를 사용하십시오. SymFromNameW (유니 코드) –

+0

@Rahul, DetourFindFunction 메서드를 사용하고 있습니다. 소스는 ms-research 사이트 (출처 : module.cpp)에서 사용할 수 있습니다. SymInitialize가 DetourLoadImageHlp 내에서 호출되고 있습니다. SYMOPT_EXACT_SYMBOL 플래그가 의심 스럽습니다. 확실하지 않다. 고맙습니다. 승리 코어 초에 모두에게 안부. – Uri

답변

2

확실히 SYMOPT_EXACT_SYMBOL 설정으로 인해 1168 오류가 발생합니다. 그렇지 않으면 여러 개의 심볼 또는 '::'이있는 것이 좋으며 API가 유효한 주소를 반환 할 수 있습니다.

#pragma optimize("", off) 
class base 
{ 
public: 
    void method(int i) { printf("in method(int)\n"); } 
    void method(double d) { printf("in method(double)\n"); } 
}; 

int __cdecl main(int argc, char* argv[]) 
{ 
    HANDLE hProcess = GetCurrentProcess(); 
    SymInitialize(hProcess, NULL, TRUE); 
    SymSetOptions(SYMOPT_EXACT_SYMBOLS); 
    SetLastError(0); 

    SYMBOL_INFO symbol = {0}; 
    symbol.SizeOfStruct = sizeof(symbol); 

    BOOL result = SymFromName(hProcess, "[email protected]@@[email protected]", &symbol); 

    printf("symbol : 0x%I64X\n", symbol.Address); 
    printf("error : %u, result : %u\n", GetLastError(), result); 

    return 0; 
} 


을 그리고 향후 참조를 위해, WinDbg는 여러 문자를 조회 할 수 IDebugSymbols::StartSymbolMatch API를 사용

하나의 해결 방법 엉망이 이름을 사용하는 것입니다.

+0

@Josh 감사합니다. 맹 글링 된 이름을 사용하여 실제로 그것을 고칩니다. SYMOPT_EXACT_SYMBOLS없이 다시 컴파일하면이를 수정합니다. – Uri