🕷lldb 디버거 사용법, 명령어 정리

    반응형

    # 디버깅은 왜 해야하나요?

    디버깅(Debugging)은 자신이 작성한 코드가 어디서 어떻게 돌아가는지, 어디에서 문제가 발생하는지, 알 수 있는 아주 좋은 방법입니다. 코드를 짰을 때 한번에 바로 잘 작동하면 좋겠지만 어디 그러기가 쉽나요? 코드를 잘 작성하는 것도 물론 중요하다고 생각합니다만, 코드의 문제점을 찾는 능력도 못지 않게 중요하다고 생각합니다. 코드만보고 눈으로, 머릿속으로 디버깅이 되는 천재들도 있지만, 저는 디버거의 힘을 빌리도록 합니다.

    흔히들 디버깅의 방법으로 프린트로 찍어보는 방법을 많이 선택하곤 합니다. 저도 마찬가지였습니다. 하지만, printf()로 일일이 출력해보는 건 디버깅이라고 할 수 없습니다. 단순히 찍어보는건 간단한 코드에서는 디버깅의 수단으로 가능할지 모르지만, 복잡하고 긴 코드에서 단순히 프린트로 찍어본다는건 겉핥기식이라고 생각합니다.

    따라서 우리는 디버깅을 해야합니다! 디버깅은 프로그래밍의 생산성을 높여주죠. 생산성은 매우 중요하고, 전부입니다.

     

     

    # lldb 디버거?

    저는 VSCode에서도 디버거를 제공합니다만, 저는 주로 lldb 디버거를 사용합니다. lldb는 Low-Level Debugger의 약자로 LLVM의 디버거 컴포넌트를 개발하는 애플의 서브 프로젝트라고 하네요! lldb는 Xcode의 기본 디버거로 내장되어있습니다.

    lldb 디버거는 로우레벨 컨트롤이 가능한 모듈로 이루어져 있고, 기계어에 가까운 영역까지 사용자가 볼 수 있도록 하기 때문에 로우 레벨 언어를 사용할 때 매우 좋다고 생각합니다. 

    오늘은 lldb 디버거 사용법을 알아보도록 하겠습니다.

     

     

    # lldb 디버거 사용법(명령어)

    0. 컴파일 시 옵션주기 (-g)

    gcc [파일 이름] -g

    컴파일을 할 때 우리는 매우 다양한 많은 옵션을 줄 수 있는데, 이때 -g옵션은 디버거를 사용할 수 있도록 디버깅 정보들을 생성해주는 옵션입니다.

    gcc 컴파일 옵션 주기

     

    1. lldb 디버거 실행하기

    lldb [executable file name]

    lldb 디버거를 실행하는 방법은 아주 간단합니다. lldb와 실행파일이름을 함께 입력해줍니다. 그러면 디버거가 실행됩니다.

    자, lldb 디버거가 실행된 것을 보실 수 있습니다.

     

     

    2. 프로그램 실행하기 runr

    lldb 실행 후, 바로 r을 입력하면 breakpoint없이 바로 실행됩니다. 따라서 그냥 실행파일을 실행했을 때와 볼 수 있는 결과가 같겠죠.

    debugger를 제대로 사용하기 위해서 breakpoint를 걸어주는 것이 필요합니다.

     

     

    3. breakpoint 걸기 b [breakpoint]

    b라는 명령어와 breakpoint를 걸고 싶은 지점을 입력해줍니다. breakpoint는 함수명이 될 수 도 있고, 줄번호 값이 될 수 도 있습니다.

    예를 들면, b main 은 main함수에 들어가자마자 break될 거고, b 10은 열번째 줄에서 멈추게 될 것입니다.

    main에 break 포인트를 걸고 다시 run시켜보았습니다.

    프로세스 아이디와 thread, stop reason가 표시되고 현재 실행된 지점을 화살표로 보여줍니다.

     

     

    4. 다음 줄 실행하기 next, n

    짠 다음 줄이 실행됩니다. 앞으로는 계속 return키만 입력하면서 다음 줄을 실행할 수 있습니다. (return 키는 앞에서 입력한 명령어를 그대로 실행시켜 줍니다.)

     

     

    5. 함수 안으로 들어가기 step, s

    대부분의 프로그램에서 main함수에서 또다른 함수를 사용할 텐데, 당연히 내가 작성한 함수의 코드도 한 줄 한 줄 디버깅할 수 있어야겠죠? 함수 안으로 들어가서 보는(step in) 명령어는 해당 함수를 실행하는 코드에서 step 또는 s를 입력하는 것입니다.

    저는 여기서 main함수에서 get_next_line이라는 함수로 들어가기 위해 15번째 줄에서 s 명령어를 입력해주었습니다. 그러면 main.c가 아닌 다른 파일의 해당 함수의 코드로 와서 디버깅을 진행합니다.

    여기서 또 다음줄로 넘어가려면 n을 입력하고 return 키를 쭉쭉 치면서 디버깅 되는 걸 보면 되겠죠?

     

     

    6. 변수 값보기 print [variable name], p [variable name]

    디버깅의 꽃입니다. 현재 변수에 어떤 값이 들어가 있는지를 보아야겠죠. print나 p를 입력 후 보고싶은 변수 이름을 입력해주면 됩니다.

    이런식으로 위의 예시에서는 fd에 3이 들어가 있음을 확인할 수 있습니다.

     

     

    7.  변수 값 띄워놓기 display [variable name]

    변수 값이 어떻게 변화하는지 보고싶을 때마다 매번 변수값을 print해서 보려면 세상 귀찮겠죠. 변수 값을 고정적으로 계속 띄워놓고 어떻게 변하는지 볼 수 있는 방법은 display입니다.

    보이시나요? 맨 위에서 temp와 buff라는 변수를 display해주었더니 그 밑에서 다음 코드를 실행할 때마다 temp와 buff의 값이 표시되고 있습니다.

     

     

    8. breakpoint설정하고 건너뛰어가기 c

    다시 breakpoint를 설정해주고 설정해준 breakpoint로 건너뛰어가는 명령어입니다. 

    예시에서는 b 123으로 breakpoint를 다시 set하고 c를 입력하여 바로 설정해준 breakpoint로 넘어갈 수 있는 것을 확인할 수 있습니다.

     

    lldb 명령어는 정말정말 많지만, 디버깅할 때 꼭 알아야 할 필수적인 명령어는 이정도인 것 같습니다.

    아래 링크에서 lldb debugger 명령어 tutorial도 있으니 참고하면 좋을 것 같습니다.

     

     

    +) reference

     

    Tutorial — The LLDB Debugger

    Tutorial Here’s a short precis of how to run lldb if you are familiar with the gdb command set. We will start with some details on lldb command structure and syntax to help orient you. Unlike gdb’s command set, which is rather free-form, we tried to ma

    lldb.llvm.org

     

    반응형

    댓글