2016-10-21 4 views
2

내 프로그램에 메모리 누수가 있습니다. malloc (및 new)에 대한 모든 호출을 할당 된 내용을 추적하는 자체 함수 호출로 바 꾸었습니다. 프로그램이 끝나면 처음에 할당 된 것들과 마지막에있는 것들을 비교하여 "유출"되는 모든 것을 나열합니다.숫자가 끝나는 지 테스트하는 방법은 무엇입니까?

최종 목표는 "새는"위치의 목록을 가져 와서 배열에 넣는 것입니다. 무언가가 할당 될 때마다 "누설"주소 목록과 대조하여 일치하는 항목이 있으면 특별한 기능을 호출하여 중단 점을 설정할 수 있습니다 (여기서 어떤 개체가 유출되는지 알아낼 수 있습니다. 그들과 적절하게 대처한다.)

문제는 프로그램을 실행할 때마다 주소의 처음 몇 부분이 변경된다는 것입니다. 예를 들어, 처음으로 하나의 "누출"주소는 ​​0x10c10이고 다음 번에는 0x20c10 일 수 있습니다. 마지막 몇 자릿수는 항상 동일하지만 처음 몇 자릿수는 동일하지 않습니다.

마지막 몇 자릿수 만 비교할 수있는 방법이 있습니까? 내가 모드를 사용하여 생각하고 있었지만, 나는 효과가있는 것을 고를 수 없었다. 이것들은 문자열이 아닌 정규의 정수입니다.

+0

'mod' ('%'을 의미한다고 생각하십니까?)가 작동하지 않는 이유는 무엇입니까? 그것은 간단한 수학입니다. 어떻게 작동하지 않을 수 있습니까? –

+0

마스크 :'addr = number & 0x0000FF; ' –

+1

다른 프로세스가 동일한 실행 파일을 실행하고 있어도 다른 프로세스의 메모리 맵은 동일하지 않을 수 있습니다. 어떤 주소의 마지막 비트도 아닙니다. –

답변

4

16 진수의 마지막 N 자릿수는 비교하려는 자릿수를 나타내는 마스크와 함께 & 비트 연산자를 적용하여 비교할 수 있습니다. 예를 들어, 다음과 같이 적용, 세 F s의 마스크를 마지막 세 자리의 16 진수를 비교 :

uintptr_t a = ... 
uintptr_t b = ... 
if ((a&0xFFF) == (b&0xFFF)) { 
    ... 
} 

또한 마지막 N의 자리에 제로를위한 숫자의 XOR을 확인할 수 있습니다, 다음과 같이 :

if ((a^b)&0xFFF == 0) { 
    ... 
} 

valgrind과 같은 메모리 프로파일 러는 주소 조작으로 농구대를 뛰어 넘지 않고도 메모리 누수를 감지 할 수 있기 때문에 전반적인 접근 방식이 최적 이하일 수 있습니다.

자체 제작 프로파일 링이 유일한 방법 인 경우 special macros for retrieving source file locations을 사용하여 누출 된 위치의 주소와 함께 해시 테이블에 저장할 수 있습니다. 이렇게하면 주소를 전혀 조작하지 않고 할당을 담당하는 소스 코드로 돌아갈 수 있습니다.

+0

감사! valgrind를 잊어 버렸습니다. 지금 사용하고 있습니다. 위대한 작품! –

+0

표준은'uintptr_t' (그리고 단지'void *'만)에 대한 /로부터의 변환만을 보장하며, 값에 대한 연산은 없습니다. 그것이 XY 문제와 같은 냄새라고 말했다. – Olaf

+0

@Olaf이 문제의 XY 특성화에 동의합니다. 그것이 대답의 후반부에 관한 것입니다. 감사! – dasblinkenlight

관련 문제