Stepping

 LLDB의 가장 중요한 Action중 하나인 Stepping에 대해 알아보겠습니다. Stepping은 프로세스를 단계별로 진행하면서 상태 변화를 관찰해 볼 수 있는 유용한 기능입니다.

Stepping Over


 (lldb) next Command를 이용하면, 현재 Break 걸려있는 지점에서 바로 다음 Statement로 Step Over 할 수 있습니다. 줄여서 (lldb) n으로 사용 가능합니다.

Stepping In


 Stepping In 은 다음 Statement가 Function Call 인경우 Debugger를 해당 함수 내부에 위치한 시작 지점으로 이동하게 해줍니다.
(lldb) step Command를 이용해 실행 할 수 있습니다. 줄여서 (lldb) s으로 사용 가능합니다.


### Stepping In 동작이 이상해요 💀

Stepping In은 주로 바로 위에서 소개된 Stepping Over와 비슷하게 동작하는 경우가 많습니다.
LLDB의 경우에는 기본적으로 Debug Symbol이 없는 함수에 대해서는 Stepping In을 무시하고, 프로그램을 진행하기 때문입니다.
Debug Symbol에 대한 내용이 궁금하다면, 아래 Image 파트를 참고해주세요. 😉


Stepping Out


 현재 진행중인 function이 return 될때까지 프로그램을 진행한 후 프로그램 Break걸어주는 Stepping Action을 Stepping Out 이라고 합니다. (lldb) finish Command로 실행해볼 수 있습니다. Stack Memory 관점에서 Stepping Out은 Stack Frame을 Pop하는 것과 동일합니다.


 위 동영상에서는 (lldb) next 명령을 통해 한 줄씩 진행하고, (lldb) step 명령을 통해 UIKit의 ViewDidLoad 함수 내부 Debug Symbol로 이동한 후, (lldb) finish 명령을 통해 함수 return 이후 지점까지 진행하는 모습을 볼 수 있습니다. 더해서, 왼쪽 Debug Navigator를 잘 살펴보면 Stepping-In과 Stepping-Out 시 StackFrame이 어떻게 달라지는 지 확인할 수 있죠!



 이미 눈치채셨겠지만, Stepping 명령들은 LLDB Console 상단에 위치한 다음 세개의 버튼과 같은 역할을 합니다. ? 왼쪽부터 차례대로 Step-Over, Step-In, Step-Out 을 의미합니다.

    lldb_stepping_button


위 동영상에서 첫번째로 확인할 수 있는 (lldb) run 명령은 말그대로 현재 프로그램을 중단하고, 새로운 Build/Run을 진행합니다.
또한, 마지막에 쓰인 (lldb) continue 명령은 다음 Breakpoint가 나타날때까지 프로그램을 진행합니다.
위 예시 코드에서는 더 이상 Breakpoint가 걸려있지 않기 때문에, 남은 프로그램을 마저 진행하고, LLDB Console이 비활성화 되었습니다.