티스토리 뷰

이클립스 CDT 디버거를 통해 C++ STL 컨테이너의 내용을 보면 한눈에 봐서는 알 수 없는 난해한 구조와 값들로 가득차 있다. 하지만 pretty-printing을 통해 std::map, std::list, std::vector 등의 컨테이너 안에 있는 내용을 보다 가독성이 높은 형태로 볼 수 있다.


본 포스팅은 http://wiki.eclipse.org/CDT/User/FAQ#How_can_I_inspect_the_contents_of_STL_containers.3F 에서 제공하고 있는 내용을 한글로 간단하게 번역하고 적용하면서 겪었던 몇몇 참고 사항을 추가했다. 보다 정확한 정보를 원하시는 분은 위 링크를 직접 확인해 보시는 것도 좋은 방법이다.


Pretty-printing 요구사항 :

 - GDB 7.0 버젼 이상

 - python

 - pretty-print 소스 코드


Pretty-printing을 위해 GDB 설정하기


1. 파이썬이 설치 되어 있어야 한다.

svn을 통해 Python pretty-printers 를 체크아웃 받는다.

svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

개인적으로는 프로젝트 하위 폴더에 받아 각각 관리하는 것도 좋지만 /usr/local 과 같은 시스템 디렉토리에 받아 놓고 프로젝트에 참여 하는 모든 사람들이 같은 패스를 가지게 하는것도 괜찮은 방법이라 생각한다.


2. GDB에게 pretty-print의 위치를 알려주기 위해 아래와 같이 .gdbinit을 작성한다.

python

import sys

sys.path.insert(0, '/home/user_name/gdb_printers/python') #svn에서 체크아웃 받은 디렉토리를 적어준다

from libstdcxx.v6.printers import register_libstdcxx_printers

register_libstdcxx_printers (None)

end

참고적으로 sys.path에 등록되는 디렉토리 경로는 절대 경로여야 하며 프로젝트 마다 매번 경로를 설정해주는 번거로움을 줄이기 위해 다음(http://stackoverflow.com/questions/8663076/python-best-way-to-add-to-sys-path-relative-to-the-current-running-script) 과 같은 방법을 써봤지만 정상적으로 인식을 하지 못한다. 공동 프로젝트를 각 개인이 개발하는 형식이라면 각각 .gdbinit을 셋팅해야 한다(방법을 알면 가같이 공유 좀..)


3. CDT에게 .gdbinit 파일이 어디있는지 알려줘야 한다. 

기본 경로는 해당 프로젝트의 루트 경로지만 이클립스 메뉴의 Windows->Preferences->C/C++->Debug->GDB에서 경로를 수정 할수도 있다.


참고 :

gdb가 무한루프에 빠지며 hang 되는 상태가 발생하는 버그가 있다고 한다(https://sourceware.org/bugzilla/show_bug.cgi?id=12555)

이럴 땐 <pretty_print_root_dir>/libstdcxx/v6/printers.py 파일 StdStringPrinter 클래스 to_string 함수 내에서 len 변수의 값을 적절한 크기로 제한 해주면 된다.

if len > 100:

len = 100

 

댓글
댓글쓰기 폼