트레이스
mtracemtrace는 GNU C 라이브러리에 포함된 메모리 디버거입니다.
사용하다
주의:mtrace툴은 싱글 스레드 어플리케이션에서만 동작합니다.한 스레드는 일시적으로 후크를 제거하고 다른 스레드는 Sametime에서 메모리를 malloc하여 멀티스레드 응용 프로그램에서 할당이 누락될 수 있습니다.
함수mtrace의 핸들러를 인스톨 합니다.malloc,realloc그리고.free; 함수muntrace는, 이러한 핸들러를 디세블로 합니다.헤더 파일에 정의된 시제품mcheck.h,이다
무효mtrace(void);
무효muntrace(void);
핸들러는 모든 메모리 할당을 기록하고 환경변수 MALLOC_TRACE에 의해 정의된 파일에 해방합니다(변수가 설정되지 않은 경우, 비활성 파일 이름을 기술하거나 사용자에게 권한이 없는 파일 이름을 기술하는 경우 핸들러는 설치되지 않습니다).
라는 이름의 perl 스크립트mtrace는 같은 이름의 함수와 혼동하지 않도록 GNU C 라이브러리에도 배포됩니다.스크립트는 출력 파일을 해석하여 해방되지 않은 모든 할당을 보고합니다.
사용 예
잘못된 소스 코드
다음은 잘못된 소스 코드의 예입니다.이 프로그램의 문제는 메모리를 할당하지만 종료하기 전에 메모리를 확보하지 못한다는 것입니다.
#실패하다 <stdlib.h> 인트 주된(무효) { 인트 * a; a = 마로크(크기(인트)); /* 메모리를 할당하여 포인터에 할당합니다*/ 돌아가다 0; /* 메모리를 확보하지 않고 프로그램을 종료했습니다*/ /* "free (a)"라는 문구를 사용하여 할당된 메모리를 해제해야 합니다.*/ } MTrace 사용 현황
- 환경 변수 설정
MALLOC_TRACE원하는 출력 파일의 경로 이름을 지정합니다.환경변수 설정은 셸마다 조금씩 다릅니다.Bash와 같은 Bourne Shell 호환 셸에서는 명령어는 다음과 같습니다.$MALLOC_TRACE=/home/YourUserName/path/to/program/MallocTraceOutputFile.txt $ 내보내기 MALLOC_TRACE
- 포함하다
mcheck.h소스코드에 있습니다.예를 들어 다음과 같이 C 또는 C++ 파일의 맨 위에 다음 행을 추가합니다.#실패하다 <mcheck(확인.h>
- 함수를 호출하다
mtrace()메모리의 할당을 개시하기 전에, 을 참조해 주세요.보통 전화하는 것이 가장 쉽다.mtrace()의 맨 처음에main()기능:트레이스();
- 추적해야 할 코드의 끝을 기술하려면 함수를 호출합니다.
muntrace()이 작업은 보통 다음 작업 종료 시 실행됩니다.main()기능: 문트레이스();
- 프로그램을 정상적으로 컴파일하여 실행합니다.를 사용하여 컴파일해야 합니다.
-g옵션을 지정하여 유용한 출력을 가져옵니다.Linux 의 GCC 에서는, C 프로그램에 대해서 다음의 커맨드를 사용해 실행할 수 있습니다.$ gcc your Program . c - g $ / a . out
- 메모리 누전 정보는 에 의해 지정된 파일에 보고됩니다.
MALLOC_TRACE환경 변수입니다.문제는 이 파일이 컴퓨터로 읽을 수 있는 형식이라는 것입니다.대부분의 Linux 머신에는 다음과 같은 콘솔명령어가 포함되어 있습니다.mtrace는, 아래와 같이, 컴퓨터 판독 가능한 형식을 사람이 조작할 수 있는 텍스트로 변환합니다.이 콘솔 명령에 액세스할 수 없는 경우 동일한 작업을 수행하기 위해 다운로드할 수 있는 같은 이름의 Perl 스크립트가 있습니다.그mtrace구문은 다음과 같습니다.$ mtrace <exec_file_name> <syslogoc_syslogs>- 예를 들어 다음과 같습니다.
mtrace a.out MallocTraceOutputFile 。txt
mtrace병렬 컴퓨팅에서는 한 번에 한 프로세스씩 사용할 수 있으며 다음과 같은 등급의 조건을 사용할 수 있습니다.한다면 (my_랭크==0) 트레이스();
MTrace 출력
mtrace 명령어로 "No Memory Leaks"가 보고되면 해당 프로그램의 마지막 실행에서 할당된 모든 메모리도 해방됩니다.이렇게 해야 합니다.반면 mtrace가 다음과 같은 출력을 제공한다면 프로그래머가 아직 해야 할 일이 있다는 것을 의미합니다.
메모리가 해방되지 않음: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
정상적인 소스 코드
다음은 양호한 소스 코드의 예입니다.메모리 할당 후 메모리를 해방하고 메모리 누수가 있는 경우 mtrace를 사용하여 프로그래머에게 알립니다.
#실패하다 <stdlib.h> #실패하다 <mcheck(확인.h> 인트 주된(무효) { 트레이스(); /* 메모리 할당 및 릴리스 기록을 시작합니다.* / 인트* a = 특수한 순서; a = 마로크(크기(인트)); /* 메모리를 할당하여 포인터에 할당합니다*/ 한다면 (a == 특수한 순서) { 돌아가다 1; /* 오류 */ } 공짜(a); /* 할당한 메모리를 해방하여 누수가 발생하지 않도록 합니다.*/ 문트레이스(); 돌아가다 0; /* 종료 */ }