본 포스팅은 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