2012-10-27 4 views
1

gdb가 backtrace 명령을 실행할 때 호출 스택을 작성하는 방법을 알고 싶습니다. 이것은 인터뷰에서 물었고 나는 콜 스택과 스택 프레임에 대한 나의 지식에 기초하여 대답했다. 나는 이것이 스택 포인터, 호출자의 리턴 어드레스/명령어를 사용하고 실행 가능/어셈블리 명령어에 매핑하는 것으로 생각된다. 나는 그것이 실제로 어떻게 행해지는지 또는이 스택 워크에 대한 좋은 설명을 찾고 있었다. 인터넷 검색에서 찾은 모든 정보는 프로그래밍 방식으로이 워크샵에 대한 Microsoft API와 관련이 있었으며 호출 스택 작성에 접근하는 방법에 대한 일반적인 설명을 찾고 있습니다.gdb로 표시된대로 호출 스택을 생성

답변

1

Google 검색은 here입니다.

프레임 포인터가있는 매우 간단한 ix86 호출 규칙을 고려하십시오. 루틴을 호출 할 때마다 다음 명령어의 주소가 스택에 푸시됩니다. 진입 즉시 루틴이 호출되어 push %ebp; mov %esp,%ebp 명령을 실행합니다. 그런 다음 위 페이지의 레이아웃으로 끝납니다.

main에서 호출되는 에서 호출되고 baz에서 호출 된 루틴 foo에서 중지되었다고 가정 해 봅시다.

%ebp으로 표시된 두 단어를 검사합니다. , 명령 포인터 이제 두 단어가 prev_ebp가 가리키는 첫번째는 prev_prev_ebp 될 것입니다 검사 어딘가에 내부 bar

-.. 첫 번째 단어는 두 번째는 반환 주소, %ebp의 이전 값 (의이 prev_ebp를 호출 할 수있다 두 번째는 반환 주소가됩니다 -. baz 내부 어딘가에 명령 포인터를

를 반복 주요 도달, 당신은 GDB가 사용하는 약의 절차를 실행 한 때까지 같은 프레임 많은 실제적인 합병증이 있습니다

그. 프레임 포인터를 사용하지 말고 당신은 그것을 이해할 것으로 예상되지 않습니다 :-)

0

gdb에서 어떻게 이루어 졌는지는 모르겠지만 여기에 아이디어가 있습니다. jmp/call 명령어와 대상 주소를 스택에 보관할 수 있다면 언제든지 전체 호출 추적을 얻을 수 있습니다.

관련 문제