2016-10-09 8 views
1

gdb에서 함수 내에서 디버깅 할 때 "finish"명령을 사용하여 함수의 끝까지 실행할 수 있습니다.gdb는 함수 호출을 "끝내는"방법을 알기 위해 어떤 메커니즘을 사용합니까?

제 질문은 : gdb가 함수의 끝 위치를 어떻게 알 수 있습니까? 특히 "{}"소스 코드와 일치하는 디버깅 기호가없는 경우 어떻게해야합니까?

gdb는 기능이 끝났는지 여부를 판단하기 위해 x86에서 "leave"또는 "mov % rbp, % rsp, pop % rbp"를 찾습니다.

그러나 문제는,

(1) 소스 코드와 ABI의 구조에 따라, 함수 호출의 시작/끝/팝업을 밀어 필요가 몇 가지 추가 레지스터가 여전히있어.

(2) 컴파일하는 동안 레지스터 수를 결정해야합니다.이 "number"정보를 사용할 수없는 경우 바이너리 실행 파일을 throw하는 것이 좋습니다.

그렇다면 "끝내기"명령으로 점프 할 수 있도록 gdb가 어떻게 함수 호출의 끝을 결정합니까?

감사합니다.

답변

3

gdb가 기계어 코드를 분석하지 않습니다. 대신 스택을 풀고 호출자의 PC를 찾고 거기에 임시 중단 점을 설정합니다. 그런 다음 중단 점이 발생할 때까지 하위 실행을 허용합니다.

gdb의 풀기가 설계된 방식으로 인하여 인라인 된 함수에서 finish을 자동으로 처리합니다 (이로 인해 코드에는 몇 가지 특수한 경우가 있지만).