2016-10-24 9 views
3

내 응용 프로그램 내에서 메모리 누수를 디버깅하려고합니다. 유출 된 객체는 (힙을 파괴하기 전에) 식별하기가 다소 어려우며 유사한 객체가 많이 생성됩니다. 각 세션마다 동일한 주소를 사용한다면 상당히 쉽게 할 수 있습니다. 따라서 실행 파일의 링커 속성에서 /FIXED/DYNAMICBASE:NO을 사용하여 ASLR을 사용하지 않으려 고합니다.MSVC2015의 고정 된 기본 주소

그러나 이것은 원하는 결과를 얻지 못하는 것 같습니다. 주소는 매번 다를 수 있습니다. 또한 main에있는 argv의 주소조차도 세션마다 다릅니다. 설정해야 할 몇 가지 추가 매개 변수가 있습니까, 아니면 어떻게 든이 깃발의 목적을 오해하고 있습니까?

+1

누수를 찾는 가장 좋은 방법은 예를 들어 Windows Crt 디버그 기능을 사용하는 것입니다. 여기에 소개 : https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx – BitTickler

+0

@BitTickler - 어떤 개체가 부검을 유출했는지 이미 알고 있습니다 (CRT 덤프가 알려줄 것 같이 - 비슷한 누수보고 시스템),하지만 할당 된 때 (그리고 차례로 참조 할 때) 객체를 식별하고 싶습니다. 따라서 할당 주소가 일정하게 유지되어야합니다. – MuertoExcobito

+1

Crt 디버그 기능을 사용하면 매우 편리 할 수 ​​있습니다. 마찬가지로 개체의 할당 번호에 중단 점을 설정하십시오. 그래서 crt를 사용하여 문제를 일으키는 할당을 확인한 후 다음 실행에서는 문제를 일으킬 수 있습니다. 그것은 대개 성공에 대한 나의 길입니다 .... 저, 그리고 단위 테스트 작성하기 ... 저는 실제 시스템에서 논리적 오류를 발견하는 것이 꽤 시간 낭비라고 생각하기 때문에 언급합니다. 스레딩 관련 문제가있는 경우 물론 때로는 그렇게 할 수 있습니다. – BitTickler

답변

4

데이터 주소를보고 있습니다. ASLR은 주로 코드 용입니다. EXE 및 DLL 코드 세그먼트가로드되는 위치를 결정합니다.

메모리 할당을 제어하기 위해 operator new을 무시하고 정의 된 기본 주소와 함께 VirtualAlloc을 사용하여 할당을보다 결정적으로 만들 수 있습니다 (여전히 멀티 스레드 경쟁 조건이있을 수 있음). 또는 MSVC 기본 힙 디버깅 기능을 사용하여 해당 주소 대신 시퀀스 번호로 블록을 식별 할 수 있습니다.