이 글은 David Millington이 작성한 엠바카데로 블로그 글을 번역(및 일부의역)한 것입니다


 

10.4에서 C++빌더는 완전히 새로운 윈도우 64비트용 디버거가 들어갔다. 그 결과, STL과 기타 타입의 내용 검사 능력 뿐만 아니라 안정성도 크게 향상되었다.

새로운 디버거

자세히 보기에 앞서, 10.4에 들어간 새 디버거는 위 그림처럼 생겼다. C++빌더의 64비트용 새 디버거는 현대식 LLDB 기반이며, STL과 기타 복잡한 타입을 조사할 수 있으며, 충분히 확장할 수 있다. 따라서 직접 작성한 복잡한 데이터 구조로 인해 여러분이 고생할 때에도 유용하게 쓸 수 있다. 새 디버거는, 디버거 차제의 안정성 측면과 디버깅 시 데이터 활용 측면 모두에서, 생산성을 크게 향상시킨다.

윈도우즈에서 C++ 디버깅의 역사

애플리케이션 개발에 사용된 언어와 앱이 배포될 타겟 플랫폼과 그 비트값(Bitness)에 따라, RAD스튜디오는 내장된 여러가지 디버거 중 알맞은 디버거가 무엇인지, 그리고 디버깅 정보용 파일 포맷이 무엇인지를 알아서 결정한다. 플랫폼 중 특별한 주의가 필요한 것은 Win64 C++이다. 디버거 기술과 Clang 컴파일러 부작용 때문이다.

이슈

10.4 이전에는, Win64 C++에서 DWARF v2 디버그 포맷과 커스텀 디버거가 사용되었다.

블로그에서 문제점에 집중하는 경우는 거의 없지만, 예전 디버거에는 이슈가 있었다. ‘disconnected session’ 오류를 경험한 사용자들이 있을 텐데, 이 오류는 디버거에서 (가끔은 애플리케이션 자체에서, 이 경우에는 디버거가 처리할 수 없다) 오류나 충돌이 발생했음을 알리는 것이다. 가끔 IDE가 한동안 멈춘듯 보이기도 했는데, 실제로는 IDE가 디버거의 제한 시간이 끝나기를 기다리는 것이었다.

복잡한 타입을 검사하고(Inspecting), 파악하기(Evaluating)

게다가, 디버그 모드에서도 주로 최적화로 인해, STL 타입 같은 구조의 내용을 검사하기가 어려웠다. c_str()과 같은 문자열 파악을 위한 메소드를 호출해도, 링크되어있지 않으면 해당 메소드가 작동하지 않았고, 디버거에서도 사용할 수 없었다.

그 결과, 툴팁, Local Variables, Evaluate/Modify, Watches 등등의 화면에서 컨테이너 요소를 파악하기가 어려웠다. 데이터를 파악하기와 그것을 시각적으로 보여주기 모두 항상 쉬운 것은 아니라는 최종 결론에 이르렀다.

이 문제는 C++빌더에만 국한된 것이 아니었다. 다른 IDE들 역시 겪고 있는, C++의 공통 문제였다.

10.4에서, 우리는 새 C++ 디버거를 도입하여 이 두가지 이슈를 모두 해소했다. 새 디버거는 현대식 LLDB 기반이며, 최신 디버그 포맷을 사용한다. 그 결과 안정적이고, (특히, 공통 STL 타입 등) 복잡한 타입을 다룰 수 있고, 충분히 확장될 수 있다.

새 C++ 디버거

기술 스팩을 먼저 보자. 10.4에서, C++빌더는 윈도우 64비트 디버깅용 LLDB v9을 커스터마이징하여 사용한다. 내가 아는 한, 윈도우용으로 LLDB를 지원하는 것은 우리가 가장 처음이다. - 다른 플랫폼용으로는 사실상 공통 표준이 있지만, 윈도우용으로는 아직 없었다. (윈도우용으로 Clang 컴파일러를 제품에 넣고 지원한 것도 우리가 최초였다. 2012년 C++빌더 XE3 버전에 Clang 3.1이 들어갔다)

우리는 LLDB와  DWARF v4를 조합했다. DWARF v5가 아니라 v4를 사용한 것은 Clang 컴파일러와 관련된 다양한 기술적 이유 때문이다. 그 결과,  ("표시하고" 디버그 할 대상 등) 유효한 디버그 정보 측면에서 향상되었다.

안정성 측면에서, 우리의 목적은 LLDB가 예전의 Win64용 디버거보다 훨씬 안정적인 디버거가 되도록 하는 것이었다. (우리가 조사하고 파악한 바에 따르면) 예전 디버거를 불안정하게 했던 가장 흔한 원인들은 더이상 새 디버거에 존재하지 않는다. IDE와 디버거의 상호작용 또한 개선했다. 그 결과 오류 메시지에 더 풍부한 정보가 표시된다.

복잡한 타입을 디버깅하기

여기까지 꽤 좋다 - 새 디버거이고, 현대적이고, 안정적이다. 하지만, 가장 신나는 기능은 디버깅 능력이 향상되어 STL과기타 복잡한 타입을 지원한다는 점이다. C++빌더 10.4를 사용하면, 벡터, 맵, 문자열 등의 내용을 쉽게 파악하고 확인할 수 있다.

요약하면, 몇가지 이유 때문에 복잡한 타입을 조사하고 파악하는 것이 C++와 모든 C++ 툴체인에서 어렵다. 하나는 데이터 구조가 복잡하다는 점이다. std::map 안에 있는 요소 하나를 찾기가 만만치 않다. 심지어 문자열 하나에서도 데이터가 다른 두 곳에 나누어져 있을 수 있다. 즉 수동으로 데이터의 위치를 찾기가 쉽지 않다는 뜻이다. 또 다른 하나는, 요소에 접근하기 위해 사용되는 메소드가 디버거에서 사용될 수 있어야 한다는 점이다. 메소드가 전혀 호출되지 않으면 최적화 과정에서 배제되고, 호출이 된다면 인라인 처리가 되는 경우가 발생할 수도 있다. 디버깅용으로 빌드를 해도 헤더 전용이라는 STL의 특성 상 그렇다. 링크되어 있지 않거나, 인라인 처리가 된 메소드는 (별도로 독립된 메소드가 존재하지 않기 때문에 )호출할 수 없고 따라서 디버거가 사용하지 못한다. 최종 결론은 디버거가 문자열 하나 안에 들어있는 내용이나 벡터 하나 안에 있는 N번째 요소를 파악하는 것이 항상 쉽지만은 않다는 것이다. 왜냐하면 데이터 레이아웃과 그 데이터를 둘러싼 메소드가 있는 곳을 몰라서 이해하지 못하기 때문이다.

C++빌더 10.4는 LLDB 포맷터를 사용하여 이 문제를 해결한다. 복잡한 데이터 타입의 경우, 해당 데이터 구조를 파악할 수 있는 파이썬으로된 짧은 스크립트가 있다. 디버거는 이 스크립트를 작동시켜서 툴팁, Watches, Evaluate/Modify, Inspect, Local Variables 화면에 표시할 데이터를 얻어낸다.

위 화면에서, 10.4의 Win64 C++ 디버거는 여러가지 다른 문자열 타입(STL Narrow String, Wide String, UniCode String, Delphi UTF8 String)의 내용을 보여주고, shared_ptr에서 포인터가 가리키는 항목의 내용과 (Weak Reference 등) RefCount를 모두 보여준. 그리고 가장 복잡한 컨테이너인 std::map의 내용을 보여주고 있다.

10.4에서 제공되는 포맷터의 전체 목록:

  • std::string
  • std::wstring
  • std::vector
  • std::deque
  • std::map
  • std::shared_ptr
  • UTF8String을 포함한 AnsiString 타입
  • String/UnicodeString
  • WideString

이 타입들은 가장 보편적으로 사용되는 STL 컨테이너와 STL 문자열 타입이다. 너무나 흔하게 사용되는 것들이고, 예전에는 값을 파악할 때 문제를 일으켰던 것들이다. 여기에 더해, 포인터가 가리키는 오브젝트만이 아닌 더 많은 정보를 위한 스마트 포인터도 유용하다. 델파이 스트링 타입도 있다. 요컨데, 시각적으로 표시해야 할 필요가 있는 타입 중 꼭 필요한 것들이라고 볼 수 있다. (모든 타입에서 포맷터가 필요한 것은 아니다. - 평균적인 구조체나 클래스는 괜찮다. 타입 대부분은 포맷터가 없어도 향상된 디버그 포맷과 디버거 만으로도 충분하다. 포맷터가 유용한 상황은, 메모리 레이아웃이나 디버그 메소드를 이해할 필요가 있는 복잡한 타입인 경우이다.)

직접 이 스크립트를 작성할 수도 있다. 만약 여러분의 애플리케이션이 복잡한 데이터 타입을 가지고 있고, 그것을 파악하는데 어려움이 있다면, 짧은 스크립트를 작성하여 여러분의 데이터 타입 안에 있는 데이터를 여러분이 원하는 방식으로 표현하게 만들 수 있다. 충분히 이 디버거를 확장할 수 있다.

정리

C++빌더 10.4는 새 Win64 디버거를 도입했다. LLDB의 최근 버전 기반이고, 안정적이고 현대적이다. 또한 주요 STL 데이터 타입 등 복잡한 타입을 파악할 수 있는 포맷터가 들어있다. 우리의 목표는 10.4에서 훨씬 더 안정적이고 강력한 디버깅 경험을 제공하고, 디버깅 데이터를 물흐르듯이 제공하여 생산성을 현격하게 높이고 여러분이 보고 싶을 것을 화면에 보여주는 것이다.

 

 

10.4 무료 평가판으로 지금 경험해보세요!   [전체보기] 10.4 새기능들!

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 14395
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13029
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15537
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21071
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22304
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17941
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38232
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173749
1398 N 윈도우와 맥 개발 시작을 위한 파이어몽키 코스북: 무료 다운로드 제공(385페이지) 관리자 2013.04.05 152319
1397 ComPort(시리얼 통신) 컴포넌트 설치안내 [11] file 험프리 2013.12.04 106669
1396 [REST API] REST 기반 파일 업로드와 다운로드 구현하기 험프리 2020.08.31 82868
1395 델파이 튜토리얼 자습서 이용 안내 관리자 2014.09.01 71931
1394 이 달의 기술자료 - 2014년 11월 험프리 2014.10.13 54111
1393 이 달의 기술자료 - 2014년 6월 file 험프리 2014.06.05 50343
1392 Find the O/S Language Type c2design 2014.07.30 47677
1391 RAD Studio Resource Center 박병일 2012.01.26 46441
1390 CD-ROM 열고 닫기 박병일 2011.12.22 44760
1389 [Android] 폰번호 가져오기 [1] 타락천사 2014.09.05 38518
1388 이 달의 기술자료 - 2014년 12월 file 험프리 2014.11.26 32446
1387 RAD Studio XE6 Update1 발표 [1] Humphery 2014.06.20 29459
1386 델파이XE2 파이어몽키 기반 아이폰앱 개발에서 제스춰를 인식시키는 방법 박병일 2012.01.25 23241
1385 [10.4 시드니 신기능] 새로운 VCL TEdgeBrowser 컴포넌트 험프리 2020.05.18 22880
1384 SendMessage 함수를 이용한 메세지 전송 관리자 2012.01.05 18248