2011-01-17 3 views
2

디버깅 gflags 도구를 사용하여 dlls 옵션으로 전체 페이지 힙을 사용하려고합니다. 이렇게하면 응용 프로그램과 함께 전체 페이지 힙을 사용할 수 있지만 지정된 dll 만 사용할 수 있습니다.gflags dll로 활성화하는 전체 힙이 작동하지 않습니다.

dlls 옵션을 사용하지 않으면 제대로 작동합니다. 내가 할당 된 메모리 블록을 통해 쓰기 시도에 예외를 얻을 수 있어요. 하지만 dll 옵션을 사용하여 동일한 기능을 사용하려고하면 문서에 따라 dll 코드를 사용해야 할 때 주 응용 프로그램 코드 또는 dll 코드에 의해 할당 된 메모리 블록에 대한 예외가 발생하지 않습니다.

Windows XP와 Windows 7에서 모두 동일한 시도를했으며 동일한 문제가 있습니다. 나는 dll 이름을 잘못 입력하고 dll에서 전체 페이지 힙을 사용할 수없는 경우를 대비하여 여러 번 검사했습니다.

gflags -p /enable test_dll1_app.exe /dlls test_dll1.dll 

gflags -p /enable test_dll1_app.exe /dlls test_dll1.dll /full 

이 내가 테스트를 위해 사용하고있는 코드는 다음과 같습니다 :

(가) 아무 소용이 두 명령을 시도

DLL 코드 :

#define TEST_DLL1_API __declspec(dllexport) 

extern "C" TEST_DLL1_API int * fntest_dll1(void) 
{ 

    int * value0 = new int [413]; 
    int * value = value0; 

    for (int i=0; i < 440; i++) 
     *value0++ = i; 

    return value; 
} 

기본 응용 프로그램 코드 :

typedef int * (*AddFunc)(); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HINSTANCE LoadDll; 
    LoadDll = LoadLibrary(_T("test_dll1.dll")); 

    if (LoadDll) 
    { 
     AddFunc pfnctFunc; 
     pfnctFunc = (AddFunc)GetProcAddress(LoadDll, "fntest_dll1"); 
     if (pfnctFunc) 
     { 
     int * value = pfnctFunc(); 

     for (int i=0; i < 440; i++) 
      *value++ = i; 
     } 
    } 

    int * value = new int [413]; 

    for (int i=0; i < 440; i++) 
    *value++ = i; 


    return 0; 

}

누군가가 내 실수를 정확하게 도움이 될 수 있는가. GB

+0

나는 이것이 dll 기반으로 어떻게 작동하는지 실제로보고 싶지 않다. 특정 모듈이 힙 API를 호출했는지 확인하는 유일한 방법은 지나치게 비싼 것으로 보이는 모든 호출에서 스택 백 추적을 수행하는 것입니다. –

답변

3

/dlls는 Win32 API HeapAlloc을 호출하는 DLL에 영향을줍니다. new []로 할당 했으므로 지정해야하는 DLL은 실제로 C 런타임 (예 : msvcrt90.dll)입니다.

+0

예! 이제 작동합니다! 그리고 DLL을 소유하고 있기 때문에 C 런타임과 정적 링크를 수행하여 msvcrt90.dll이 아닌 특정 DLL을 완전히 검사 할 수있었습니다. 많은 감사합니다 !!! –

관련 문제