2017-12-16 17 views
1

VirtualAlloc에 의한 메모리 할당을 추적하고 싶습니다. 이를 위해 mhookeasyhook을 사용하려고했습니다. 내가 VirtualAlloc 자신을 호출하는 동안 둘 다 잘 작동합니다. 등록 된 후크가 호출되어 거기에서 실제 VirtualAlloc 함수를 호출하고 메모리가 예상대로 반환됩니다.후크 된 VirtualAlloc은 시스템 DLL에서 호출 할 때 nullptr을 반환합니다.

내 문제는 이제 SFML -window를 열려고 시도했는데 VirtualAlloc 호출이 캡처되었지만 메모리가 반환되지 않습니다. 함수 호출은 sfml-window-2.dll을 거치며 거기에서 VirtualAlloc을 호출하는 CreateAnyContext를 호출하는 wglCreateContext을 호출합니다. wglCreateContext은 Opengl32.dll에 있습니다. 내 userspace 코드에 메모리를 할당 할 수있는 권한이 없다고 생각합니다. 내 질문은, 왜 내가 그것을 할당하기 위해 메모리를 할당 할 수없는 경우 시스템 라이브러리가 동일한 스텁 (내가 훅)을 통해가는 것입니다? 그리고 어떻게 이러한 전화를 명확하게 할 수 있고 그런 일이 일어나지 않도록 할 수 있습니까?

내 특별한 경우에 나는 창문이 열릴 때까지 기다렸다가 그 후에 VirtualAlloc을 걸 수 있습니다. 그러나 이것은 임의의 프로그램이 아마도 메모리를 추적하기 위해 DLL을 삽입하는 것을 추적하기를 원하기 때문에 이것은 정말 나쁜 해결책이 될 것입니다.

편집 : 나는뿐만 아니라 나 또한 때문에 내 경우 프로그램 실행이 너무 많이 느려졌하지 않아야 모든 동안, 녹음 상태로 재설정 할 수하고자하는 프로그램 메모리를 추적 할 수 있지만, 게임이 될거야. 따라서 VirtualAlloc으로 시작하여 MEM_WRITE_WATCH 플래그를 설정하고 GetWriteWatch에 의해 반환 된 페이지를 수동으로 추적하려고했습니다. 이미이 방법으로 재설정 할 수있는 벡터를 작성했지만 좀 더 일반적이어야합니다. /EDIT

또 다른주의해야 할 점은 상기 함수에서 호출 된 HeapAlloc으로 시도했지만 메모리를 반환한다는 것입니다. 이것이 내가 두 개의 라이브러리를 시도한 이유입니다. 도움을 주시면 감사하겠습니다.

+0

UI에 표시하고 있습니까? wglCreateContext는 그래픽 장치 드라이버와 상호 작용하는 OpenGL init 용입니다. 그래픽 장치 드라이버가 VirtualAlloc을 연결하여 추가 값을 전달할 수도 있습니다. 나는 CPU 시간이 엄청난 페이지 폴트에 대해 1 초 이상 알려지지 않은 이유 때문에 200MB 버퍼에 대한 반환 된 메모리가 필요하다는 것을 알아 챘다. 이것은 몇 년 전에 이것을 측정했습니다. –

+0

어쨌든 VirtualAlloc을 연결할 필요가 없습니다. Windows Performance Toolkit, wpr -start VirtualAlloc을 다운로드하고, 유스 케이스를 실행하고, wpr -stop c : \ temp \ VirtualAllocTracing.etl을 실행하고 WPA (최고의 ETW 뷰어)로 데이터를 확인하여 거의 모든 누출을 찾습니다. https : // aloiskraus .wordpress.com/2017/12/13/the-case-of-ngen-exe-needing-50-gb-of-memory/ –

+0

@AloisKraus interessting을 읽어 주셔서 감사합니다. 네, OpenGL 창을 엽니 다. 이 함수는 연결되지 않은 것처럼 보였습니다. wglCreateContext에서 호출 된 것과 동일한 주소로 내 자신의 VirtualAlloc 호출을 추적했습니다. 그러나 나는 그것을 염두에두고 다시 추적 할 것입니다. 내 게시물에서 내 유스 케이스를 업데이트했습니다. – simonides

답변

0

나는 깃발을 바꿀 수 없다는 것을 알았다. 호출자가 합리적인 방법으로 누구인지 알 수 없기 때문에 내 해결 방법을, 나는 변경된 플래그로 할당하고 실패하면 다시 원래 플래그를 할당합니다.