• Tour debug console

    • OSLog 출력시 메타 데이터가 보이는 정도를 조절할 수 있는 옵션 제공
    • OSLog의 중요성에 따라서 배경색이 달라진다. 중요한 게 더 눈에 잘 띄도록
    • 개별 로그를 클릭한 뒤 space를 누르면 개별적으로 자세하게 볼 수도 있다.
      • 로그가 호출된 함수 정보 등도 포함된다.
    • 필터링 기능 강화
      • 복잡한 필터링 지원
      • 특정 타입의 로그만 모아보기 지원
      • 자동완성 지원
  • Live debugging

    • 카테고리로 관심사 좁히기
    • 원하는 로그를 찾아서 해당 로그를 보내는 소스코드로 점프
  • LLDB improvements

    • po를 했을 때
      • 실행이 너무 오래 걸린다거나

      • 달랑 주소만 뜨는 경우

        • 이는 CustomStringConvertible을 구현하지 않았을 때 일어난다.
      • 다른 명령어들이 있어서 다른 걸로 하면 잘 나올 수도 있다.

        • p
        • expression
        • v
        • vo
        • frame variable
        • 등등…
      • 근데 너무 많아서 외우기 힘들다.

        스크린샷 2023-06-19 오후 12.04.40.png

      • 그래서 쉽게 쓸 수 있는 새로운 커맨드가 추가됐다.

        • 한번에 여러가지 커맨드를 평가해준다
        dwim-print // do-what-I-mean
        
      • 기존 p 명령어가 dwim-print의 typealias로 바뀌었다.

      • po도 dwim-print에 Object description 옵션을 주는 것의 typealias로 바뀌었다.

        스크린샷 2023-06-19 오후 12.08.15.png

  • Tips for logging

    • 로그는 특정 작업의 전후로 넣어야 한다.

    • stdio는 커맨드라인 UI용이고, OSLog는 디버깅 용이다.

      • print를 로그용으로 쓰지 말아야하고, OSLog를 쓰는게 디버깅 뿐 아니라 최종 사용자에게서 구조화된 로그를 뽑아내기도 좋다.
      • ex. print를 OSLog로 대체하기
        • ver1.

          func login(password: String) -> Error? {
              var error: Error? = nil
              print("Logging in user '\\(username)'...")
          
              …
          
              if let error {
                  print("User '\\(username)' failed to log in. Error: \\(error)")
              } else {
                  loggedIn = true
                  print("User '\\(username)' logged in successfully.")
              }
              return error
          }
          
        • 위치 파악이 잘 안된다. ver2.

          func login(password: String) -> Error? {
              var error: Error? = nil
              print("🤖 Logging in user '\\(username)'... (\\(#file):\\(#line))")
          
              //...
          
              if let error {
                  print("🤖 User '\\(username)' failed to log in. Error: \\(error) (\\(#file):\\(#line))")
              } else {
                  loggedIn = true
                  print("🤖 User '\\(username)' logged in successfully. (\\(#file):\\(#line))")
              }
              return error
          }
          
        • OSLog ver.

          import OSLog
          
          let logger = Logger(subsystem: "BackyardBirdsData", category: "Account")
          
          func login(password: String) -> Error? {
              var error: Error? = nil
              logger.info("Logging in user '\\(username)'...")
          
              //...
          
              if let error {
                  logger.error("User '\\(username)' failed to log in. Error: \\(error)")
              } else {
                  loggedIn = true
                  logger.notice("User '\\(username)' logged in successfully.")
              }
              return error
          }
          

          스크린샷 2023-06-19 오후 12.40.44.png

    • OSLog로 수집되는 정보

      • 로그 작성 지점: message, level
      • 로그 핸들 생성 시점: subsystem, category
      • 백그라운드에서 수집: timestamp, library name, process ID, thread ID, source location 등
        • 사실상 디버깅에 필요한 정보를 자동으로 다 수집해주는 격
      • 이 모든 게 다 출력되면 콘솔이 어지러울텐데, 콘솔에서 이를 필터링할 수 있는 옵션을 제공한다.
    • 컴포넌트마다 로그 핸들을 만들어서 사용하라.

    • OSLogStore를 사용해서 실제 사용중인 앱의 이슈 정보를 수집하기

    • OSLog는 추적 도구기 때문에 instrument 등을 사용해서 성능 측정용으로도 쓸 수 있다.