2008-10-03 2 views
3

누군가가 현재 스택을 덤프하기 위해 호출되는 C 함수의 구현을 제공 할 수 있습니까? 이것은 x86 리눅스 시스템을위한 것입니다. 이것은 다른 함수에 의해 명시 적으로 또는 충돌 후 (아마도 트랩/int 핸들러로서)의 두 가지 방법으로 호출 될 수 있습니다. 출력은 매개 변수 (핸들)로 표시된 것처럼 화면이나 파일 중 하나 일 수 있습니다. 스택이 푸는 방법에 대한 명확한 설명/설명은 분명히 매우 도움이 될 것입니다. 고맙습니다.C에서 스택 덤프를 호출하는 함수가 있습니까?

+0

직접 호출 스택의 텍스트 출력을 찾고 있습니까, 아니면 바이너리 코어 덤프도 사용할 수 있습니까? –

+0

나는 텍스트 출력을 생각하고 있었다. gnu의 libc의 경우 backtrace()가 bin 출력을 제공하고 backtrace_symbols()가 텍스트 출력을 제공하는 것으로 보입니다. –

답변

0

함수 호출이 중첩되면 스택은 아래쪽으로 커지고 스택 프레임 체인을 만듭니다. 프로그램의 특정 지점에서 이론적으로 스택 프레임 시퀀스를 원래 호출 지점으로 역 추적 할 수 있습니다. backtrace() 함수는 스택 프레임을 호출 지점에서 프로그램 시작 부분으로 이동하고 반환 주소 배열을 제공합니다. glibc 라이브러리에 backtrace()을 구현하면 각 플랫폼에 대한 플랫폼 별 코드가 포함됩니다.

x86 플랫폼의 경우, 현재 스택 프레임의 주소와 주어진 함수에 대한 스택 포인터의 주소를 저장하는 ebp (기본 포인터) 및 esp (스택 포인터) CPU 레지스터의 내용은 다음과 같습니다. 포인터의 체인을 따라 이동하여 초기 스택 프레임으로 이동하는 데 사용됩니다. 이렇게하면 반송 주소 시퀀스를 수집하여 백 트레이스를 작성할 수 있습니다.

당신이 backtrace() 작품과 그것을 사용하는 방법을, 나는 Stack Backtracing Inside Your Program (LINUX 저널)를 읽고 추천 할 것입니다 방법에 대한 자세한 내용을 알고 싶다면.


당신은 x86 플랫폼에 대한 신호 처리기에서 역 추적을 실행 한 이후, 나는이 질문에 my response 당신을 Adam's answer에 추가하고 직접 싶습니다 그가 백 트레이스를 확인하는 방법에 대한 자세한 내용은 링크 신호 처리기의 실제 위치를 가리 킵니다.

관련 문제