VirtualAlloc
에 의한 메모리 할당을 추적하고 싶습니다. 이를 위해 mhook과 easyhook을 사용하려고했습니다. 내가 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
으로 시도했지만 메모리를 반환한다는 것입니다. 이것이 내가 두 개의 라이브러리를 시도한 이유입니다. 도움을 주시면 감사하겠습니다.
UI에 표시하고 있습니까? wglCreateContext는 그래픽 장치 드라이버와 상호 작용하는 OpenGL init 용입니다. 그래픽 장치 드라이버가 VirtualAlloc을 연결하여 추가 값을 전달할 수도 있습니다. 나는 CPU 시간이 엄청난 페이지 폴트에 대해 1 초 이상 알려지지 않은 이유 때문에 200MB 버퍼에 대한 반환 된 메모리가 필요하다는 것을 알아 챘다. 이것은 몇 년 전에 이것을 측정했습니다. –
어쨌든 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/ –
@AloisKraus interessting을 읽어 주셔서 감사합니다. 네, OpenGL 창을 엽니 다. 이 함수는 연결되지 않은 것처럼 보였습니다. wglCreateContext에서 호출 된 것과 동일한 주소로 내 자신의 VirtualAlloc 호출을 추적했습니다. 그러나 나는 그것을 염두에두고 다시 추적 할 것입니다. 내 게시물에서 내 유스 케이스를 업데이트했습니다. – simonides