2014-03-12 11 views
4

gdb 디버거를 배우는 중 하나의 질문에 대답 할 수 없습니다. 새로운 함수 호출로 인해 스택 프레임이 할당되고 호출 스택이 아래쪽으로 커집니다. 스택 프레임은 할당이 해제되고 사용되지 않는 메모리로 반환됩니다. 스택 중간의 프레임을 삭제하고 메모리로 반환 할 수 있습니까? 명령문 또는 longjmp 함수로 갈 수 있습니까?스택 중간에서 스택 해체

감사합니다.

답변

3

아니요, 호출 스택이 스택이므로 중간의 프레임을 삭제할 수 없습니다. 스택의 최상위를 가리키는 스택 포인터 (그리고 선택적으로 마지막 프레임의 시작을 가리키는 프레임 포인터) 만 유지됩니다. 프레임이 "삭제됨"(함수에서 반환)이므로이 포인터 만 이동되고 다음에 할당 된 프레임이이 포인터를 덮어 씁니다.

This thread (기타 소수)은 longjmp가이 동작을 위반할 수없는 이유를 설명합니다. 즉, setjmp는 프레임 위치를 저장하지만, 프레임 자체가 덮어 쓰여진 경우에는 실패합니다. 그리고 goto는 다른 기능으로 건너 뛸 수 없습니다.

+0

답장과 longjmp에 대한 참고 사항을 보내 주셔서 감사합니다. –