2012-01-04 6 views
-6

나는 몇 가지 질문이 있습니다역 추적은 Linux x86_64에서 어떻게 작동합니까?

  1. INT 백 트레이스 (무효 ** 버퍼, INT의 크기); 여기서 buffer는 포인터의 배열입니다. 스택의 각 프레임에 대한 리턴 포인트의 배열 요소는 리턴합니다. 그래서 backtrace()는 내부적으로 프레임 수만큼 malloc()을 호출합니까? 왜 이것이 목적입니까?
  2. 위의 할당 된 메모리는 backtrace()에서 해제되지 않으므로 누가이 메모리를 해제합니까?
  3. backtrace() 내부에서 malloc()을 피할 수있는 방법이 있습니까?
  4. 어디에서 backtrace() 소스 코드를 찾을 수 있습니까?
  5. 어셈블리에서 백 트레이스에 코드를 작성하려면 어떻게해야합니까?
+3

-1 : 내 2008-06-14 맨 (너무 이전 버전)를 명시 적으로 질문 1과 2에 응답 . 설명, 2 단락 : "발신자가 해방해야합니다." – thiton

+0

"내 2008-06-14 맨 페이지"를 어디에서 어떻게 찾을 수 있는지 알려주십시오. – sandeep

+2

'man backtrace'를 모든 리눅스 시스템의 셸 (터미널)에서 실행하십시오. 매뉴얼 페이지는 모든 시스템 및 코어 C 라이브러리 함수에 대한 권위있는 정보 소스입니다. – thiton

답변

4

역 추적을 위해 manual page을 조금 더주의 깊게 읽으십시오. 당신은 기초의 일부에 대한 잘못된 것 같다 :

  1. 아니, array이다 채워진하는 backtrace()하여 스택 프레임을 가리 키도록 포인터의 당신의 버퍼. malloc()으로 전화하지 않습니다.
  2. 당신의 기억 때문입니다.
  3. 해당 사항 없음 backtrace()malloc()을 호출하지 않습니다.
  4. GNU libc의 일부입니다. Here은 구현의 일부입니다.
  5. 아마도 스택 포인터를 복사하고 수동으로 스택을 걷는 것입니다.

backtrace()backtrace_symbols()을 혼동하는 것 같습니다. 후자는 메모리 할당을 포함합니다.

64 개 레벨의 최대 현재의 역 추적을 읽어하려면 바로 수행

void *stack[64]; 
const int depth = backtrace(stack, sizeof stack/sizeof *stack); 
+0

@backtrace()는 malloc(). - backtrace 호출 전에 malloc()에 후크를 추가했고 backtrace()를 호출했을 때 malloc에 ​​대한 후크가 호출되었습니다. 백 트레이스가 스택을 다시하지 못했습니다. 하지만 특히 HOOCK 함수에서 malloc을 호출하고 할당 된 메모리를 반환 할 때 백 트레이스는 Successfull이었습니다 .. 다시 말해서 내가 후크를 무료로 추가했을 때 호출되지 않았습니다 .. 위의 결론을 내릴 수 있습니다. 내가 설명서를 읽을 때, 나는 또한 당신으로 추측하고 있었고 이제는 직접 확인했습니다. – sandeep