gdb가 backtrace 명령을 실행할 때 호출 스택을 작성하는 방법을 알고 싶습니다. 이것은 인터뷰에서 물었고 나는 콜 스택과 스택 프레임에 대한 나의 지식에 기초하여 대답했다. 나는 이것이 스택 포인터, 호출자의 리턴 어드레스/명령어를 사용하고 실행 가능/어셈블리 명령어에 매핑하는 것으로 생각된다. 나는 그것이 실제로 어떻게 행해지는지 또는이 스택 워크에 대한 좋은 설명을 찾고 있었다. 인터넷 검색에서 찾은 모든 정보는 프로그래밍 방식으로이 워크샵에 대한 Microsoft API와 관련이 있었으며 호출 스택 작성에 접근하는 방법에 대한 일반적인 설명을 찾고 있습니다.gdb로 표시된대로 호출 스택을 생성
1
A
답변
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
명령어와 대상 주소를 스택에 보관할 수 있다면 언제든지 전체 호출 추적을 얻을 수 있습니다.
관련 문제
- 1. 호출 스택을 빠르게 캡처하십시오.
- 2. 호출 스택을 보유한 개인 메서드 호출
- 3. Control.EndInvoke는 예외를위한 호출 스택을 재설정합니다.
- 4. Visual Studio에서 호출 스택을 기록합니다.
- 5. 아래에 표시된대로 어떻게 포맷합니까?
- 6. gdb로 디버깅
- 7. 호출 스택을 캡처하여 다른 스레드에서 실행하도록하십시오.
- 8. 메서드 수정없이 호출 스택을 통해 데이터 전달
- 9. Valgrind에서 전체 호출 스택을 얻는 방법은 무엇입니까?
- 10. FaultException의 전체 호출 스택을 얻는 방법
- 11. UI 스레드에서 호출/스택을 추적하려면 어떻게해야합니까?
- 12. 호출 스택을 로깅 형식으로 사용할 수 있습니다.
- 13. Javascript에서 최대 호출 스택을 늘리는 방법은 무엇입니까?
- 14. gdb로 디버깅 pthreads
- 15. gdb로 여러 응용 프로그램에서 생성 된 코어 덤프 분석
- 16. WinDBG를 사용하여 모든 관리되는 스레드의 호출 스택을 나열하는 방법은 무엇입니까?
- 17. gdb로 qemu 디버그
- 18. 여러 프로세스에서 GDB로 디버깅
- 19. gdb로 디버깅 : 이유 = 0x0?
- 20. gdb로 여러 파일 디버깅
- 21. Emacs 리모트에서 GDB로 디버그하기
- 22. GDB로 디버깅 템플릿
- 23. xdebug와 gdb로 원격 디버깅
- 24. gdb로 라이브 편집 코드
- 25. Go : gdb로 변수 인쇄
- 26. gdb로 C 프로그램을 디버그
- 27. GDB로 아이폰 디버깅
- 28. PInvoke를 스택을
- 29. 호출 Asynctask 지연 생성
- 30. gdb로 명령 줄 인수에 액세스