디버깅 심볼이란 무엇일까요?
우선 이것부터 집고 가야겠네요.
확장자는 pdb이며 디버깅에 필요한 정보들이 들어가있습니다.
좀 구체적으로 말씀을 소스코드레벨에서 디버깅이 가능하도록 소스코드의 파일명이나 라인넘버등이 들어갈 수 있죠.
우선 디버깅에 필요한 정보들이 들어가는 파일이구나.. 하는 정도로 알아두면 되겠습니다.
그리고 제가 알기론 pdb파일의 포맷은 비공개되어있는 걸로 알고 있습니다.
(그렇지만 Dbghelp.dll 파일을 이용해서 pdb를 다룰수는 있습니다.)
실제로 Visual Studio 혹은 Visual C++ 에서 프로그램을 빌드하게 되면 EXE, DLL 혹은 OCX로 출력파일이 생성이 되는데
PDB를 만들건지를 설정할 수 있습니다.
Debug 빌드모드에서는 기본적으로 선택되어있고 Release 모드에서는 일반적으로 선택되어 있지 않죠.
우리가 이렇게 pdb파일을 생성할 수 있듯이 MS에서도 운영체제에 포함되어있는 dll이나 sys같은 모듈에 대한 pdb파일을 제공하고 있습니다.
이것들은 웹에 공개되어 있어서 특정 커널심볼을 다운로드해서 설치할 수도 있죠.
그러나 직적 다운로드하는 것보다 더 좋은 방법이 있습니다.
환경변수로 설정해두는 거죠.
한번 설정해 두면 디버깅시 필요한 디버깅심볼들을 알아서 받아주니 참 편합니다.
환경변수 등록하는 방법은 내컴퓨터속성 -> 고급탭 -> 환경변수버튼을 눌러 등록하면 됩니다.
등록할 이름 : _NT_SYMBOL_PATH
등록해야할 값 : SRV*E:\OSSymbols*http://msdl.microsoft.com/download/symbols
E:\OSSymbols 경로는 심볼이 저장될 경로입니다. 즉, 심볼스토어가 생성되는 곳이죠.
심볼스토어라고 하면 좀 거창해보이는데 그냥 심볼이 저장되는 곳이라고 보시면 됩니다.
이 폴더를 파일서버에 공유폴더로 지정해두고 여러 사람이 같이사용하면 좋습니다.
예를 들어, \\dev_server\OSSymbols 와 같이 지정할 수가 있다는 것이죠.
이렇게 하면 좋은점이 다른 누군가가 심볼파일을 이미 받았다면 다시 받을 필요없이 그 심볼을 사용하면 좋은 거죠.
용량을 허비할 필요도 없어지고 다운로드받는 시간도 줄어드니까요.
그리고 환경변수로 등록해놓으면 어떤 효과가 있는지 좀 더 구체적으로 설명을 드려보겠습니다.
환경변수로 _NT_SYMBOL_PATH 를 등록해놓으면 다음 프로그램에서 해당 환경변수를 참조에서 필요할때 심볼을 로드합니다.
* Visual Studio 제품군 (2003, 2005, 2008, 2010.. 뭐 다 되죠^^. 그런데 VC++6 은 안되는것같더군요.)
* WinDbg 도 됩니다..( WinDbg를 사용하시는 분들은 많이 안더군요. 확실히 배워둘 필요는 있습니다.)
* Process Explorer
( 헉.. 이것도요? 라고 하시는 분들도 있을거라 생각되는 군요.. Process Explorer는 정말 막강한것같아요. 프로세스 속성에 스레드탭이 있는데요. 이 때 심볼이 존재하면 해당 심볼을 찾아 적절한 함수이름을 보여줍니다. 좋죠?)
* IDA (리버싱하시는 분들이라면 다 아시는 툴이죠. 이것도 됩니다.)
제가 아는건 여기까지구요. 더 있을 것 같다는 생각이 드는군요.. 델파이같은 것은 어떨지 모르겠네요..
환경변수하나 등록해놓은것 뿐이지만 디버깅할때 콜스택을 보면 KERNEL32!7c7e7077 와 같은 것들이 정확한 함수이름으로 보여주게 됩니다. 이 장점 하나로도 충분히 등록해줄만 하겠죠?(참고로 저는 콜스택볼때 많은 도움이 되고 있습니다.)
* 다음 포스트에서는 직접 빌드해서 만든 pdb를 어떻게 관리할 것인지에 대해 다뤄보겠습니다.
- 2010/07/02 18:03
- nyolong.egloos.com/777649
- 덧글수 : 4




덧글
붕어 2012/02/07 16:11 # 삭제 답글
뇨릉님 안녕하세요~덕분에 소스서버와 심볼서버를 구성하였습니당^^
근데 아직 한가지 문제가 있어서요
환경변수에 _NT_SYMBOL_PATH를 등록하고 경로를 적어주었는데
다른 컴퓨터에서는 심볼을 읽지를 못해용;
경로는 SRV*\\DONGHWA-PC\SYMBOLS\PRODUCT_SYMBOLS 이렇게 해주였구여
(DONGHWA-PC는 네트워크 컴퓨터 이름입니다)
http://blog.naver.com/donghwajjang/150131041112
보시면 이 디렉토리의 기호캐쉬에 _NT_SYMBOL_PATH에 적어준 경로를 그대로 적어주면
심볼을 읽구요 뭐가 문제일깡요 ㅜㅜ
뇨릉 2012/02/10 11:25 #
넵 안녕하세요^^해당 PC에서는 심볼이 읽혀지는데 다른 PC에서 안된다면 네트워크 권한문제가 아닐까요?
나그네 2012/05/14 22:56 # 삭제 답글
아주 좋은 정보입니다~덕분에 디버깅이 수월해졌습니다. ^^
고맙습니다!
뇨릉 2012/05/16 17:02 #
도움이 되셨다니 저 또한 기쁩니다 ^^