codeheart 위치로그  |  태그  |  미디어로그  |  방명록
icon 분류 전체보기 에 해당하는 글74 개
2009.07.04   Visual Studio 2008 심볼 파일(pdb)로 디버깅을 보다 용이하게 하자!
2009.07.01   javascript 로 jquery 비슷한 구현
2009.06.26   쓸만한 북마크 관리 프로그램(익스플로러, 파이어폭스, 사파리 동시 지원)
2009.06.24   간만에 윈도우 웹 서버 셋팅 시작! (wamp + mod_python)


icon Visual Studio 2008 심볼 파일(pdb)로 디버깅을 보다 용이하게 하자!
개발/Windows 디버깅 | 2009. 7. 4. 00:33

심볼 파일(.pdb)이란?

심볼 파일이란 프로그램의 디버그 정보(함수 이름 등)이 담겨진 파일이다.
Visual Studio 에서는 2.0 부터 이러한 심볼 파일을 도입하였는데, 그 확장자는 .pdb 이다.
pdb 는 program database 의 약자로, 앞으로 심볼 파일이라 함은 .pdb 파일을 지칭한다.

Visual Studio 로 개발을 하다보면 .pdb 란 파일이 생기는 것을 알 수 있다.
이 것은 프로젝트 설정에 따라 생길 수 있다.
Debug / Release 에 상관없이 디버그 정보는 항시 들어가 있으며, 다만 얼마나 자세한 디버그 정보가 들어가나
정도의 차이가 있을 수는 있다. (정확히는 프로젝트 옵션에 의거하여 그 정도가 바뀌게 된다)

우리가 디버깅을 할 때 화면상에 나타나는 수많은 정보(디버깅 창의 함수명, 라인 등등)이 이 파일에 들어가는데,
만일 이 파일을 지우게 되면 그런 정보를 볼 수 없다.
물론, 우리는 우리가 작성한 프로그램은 당연히 소스를 가지고 있고, 이러한 .pdb 파일의 재생산이 가능하기 때문에
심볼 파일의 기능에 대해서 모르고 지나쳤을 수도 있다.

하지만, 우리가 작성한 부분이 아닌 수많은 Windows 기본 dll 내지 MFC dll 등은 이러한 디버깅 정보를 획득할 수가 없다.
당연히, 윈도우를 설치한다고 이러한 .pdb 파일까지 설치해주지는 않는다.
일반 사용자에게 이러한 .pdb 파일은 필요가 없는 것이다.
그렇다면, 왜 Visual Studio 는 이러한 심볼 파일을 설치해주지 않을까?
잘은 모르겠지만, 여러가지 이유가 있다고 본다.

우선, 심볼 파일들의 용량은 생각보다 만만치 않은데, microsoft 에서 일반적으로 사용되는 dll(혹은 개발에 연동되는 모든 모듈들)의 심볼파일들은 상당히 많을 뿐더러, 용량을 다 합치면 800mb 가 넘어버린다.

다음으로, 일반적인 개발에 있어 심볼 파일까지 필요한 경우는 드물다.
사실, 심볼 파일 없이도 충분히 프로그램을 작성할 수 있다.

또한, 윈도우 플랫폼별로 dll 도 형태도 조금씩 다를 수 있고(COM 방식의 경우 API 도 다소간의 차이가 있을 수 있으니까), 이러한 심볼파일을 Visual Studio 배포 CD 에 포함시킨다는 것은 무의미할 수도 있다.


심볼 파일의 필요성

하지만, 확실히 심볼 파일은 어느 정도 이상의 디버깅을 요구하는 개발자라면 심볼 파일은 상당히 필요하다고 본다.
어떤 API 에서 그러한 오류가 발생되었는지, 콜 스택을 확인하는데 무의미한 주소(심볼 파일을 가지고 있지 않다면, 디버깅 정보가 없어서 함수이름 대신 주소만이 나올 뿐이다)만 잔뜩 나온다면 상당히 골치 아플 것이다.

또한, 경험상 함수이름을 떠나서, 기본API 심볼 파일의 부재로 내가 만든 프로그램 자체의 콜스택 정보가 제한되는 현상을 목격하였다. 특히, 예외처리를 F5 로 캐치하였을 때 정확한 소스 위치(무슨 소스 파일의 몇번째 줄)을 알 수가 없었다.
이는 웬지 Visual Studio 버그일 수도 있다는 생각이 들었는데, 왜냐하면 항상 그런 것은 아니기 때문이다. 아주 가끔씩은(셋팅은 건드리지도 않았다) 정확한 소스 위치가 콜스택 상에 보일 때가 있었기 때문이다.


기본API 심볼 파일의 설치

그렇다면, 기본API 심볼 테이블은 어떻게 설치하는가?

두가지 방법이 있다.
하나는 심볼 파일들을 압축하나 파일을 microsoft 홈페이지에서 다운로드 하여 설치하고, 로컬 경로를 설정하는 방법이다.
다음은 Microsoft Symbol Server 사이트 url 을 심볼 파일 경로로 설정하는 방법이다.
후자가 가능하면서 심볼 파일 설치 / 사용이 상당히 간단해졌다.

1. Options 메뉴 - Debugging - Symbols 으로 들어가게 되면 다음과 같은 화면이 나온다.

위 화면에서 Symbol file (.pdb) locations: 밑에 심볼 파일 위치가 올 수 있다.
a. 위치 형식은 로컬(예 : c:\windows\symbols\),
b. 심볼 서버 URL(예 : http://msdl.microsoft.com/download/symbols/),
c. 윈도우 네트워크 경로(예 : //server2/where/symbols/)가 될 수 있다.
참고로, 심볼 서버 URL 중 디폴트 서버(http://msdl.microsoft.com/download/symbols/)는 굳이 입력하지 않아도 상관없다.
또한, 디폴트 서버에서만 심볼 파일을 가져올 생각이라면 어떠한 경로도 따로 지정하지 않아도 된다.

2. 그 밑에 Cache symbols from symbol servers to this directory: 가 보이고
여기에는 심볼을 캐쉬할 디렉토리이다. 아무 디렉토리도 상관없으니, 캐쉬 디렉토리를 지정한다.
지정하게 되면 지금까지 로드된 심볼을 캐쉬할 공간으로 사용되게 된다.
심볼 서버에서 가져오는 경우 인터넷 부하에 의해 개발 속도 저하가 될 수 있으니, 이 기능을 통해
캐쉬하는 것이다.

3. 밑에 체크박스가 있는데, 자세한 설명은 제하고 일단 체크하지 않는다.

4. 밑에 오면 두 버튼이 보인다.
Load symbols using above locations
Load symbols from Microsoft symbol servers
첫번째 버튼은 위 리스트 박스에 입력한 경로에서 심볼을 읽어오는 것이며,
두번째 버튼은 MS 디폴트 심볼 서버들에서 가져오는 것이다.
이 두 버튼은 평소에 활성화 되어 있지 않지만, Visual Studio 프로젝트를 열게 되면 활성화 된다.
따라서 이 버튼들을 누르게 되면, 현재 열린 프로젝트에 관련한 심볼 파일들을 확보하게 된다.
확보된 심볼 파일은 해당 프로젝트 디버깅시 유용하게 쓰일 수 있을 것이다.


실행 예제

다음과 같이 소스를 작성하고 F5 를 눌러보자.
오른쪽 밑에 Call Stack 을 보면 kernel32.dll! 뒤에 숫자(함수 주소)로 나왔던 정보가 이제는 심볼 파일에 의해 해석되어 함수명으로 나오는 것을 알 수 있다.
또한, 심볼 파일 적용 후 throw 부분의 위치를 Visual Studio 에서 더 정확하게 파악했다.
(뭔가 이상하지만, 심볼 파일이 적용되기 전에는 정확한 예외 발생 위치를 파악하지 못했다. 더욱 웃긴것은 10번에 한번 정도 확률적으로 파악될 때도 있었다는 것이다. 여하튼, 심폴 파일 적용 후 더 잘 파악된다는 것은 확실하다)


arrow 트랙백 | 댓글



icon javascript 로 jquery 비슷한 구현
개발/Web | 2009. 7. 1. 20:07

사실 웹 개발에 관심을 두고 있지 않지만, 취미차원에서 다루기에는 괜찮다.
자바스크립트 문법 역시 잘 알고 있지는 않지만, jquery 같은 심플한 예제를 만들어 보기로 했다.
하다보니까 이런 구현도 흥미있다.
주로 사용하는 C++ 에서는 이러한 식의 개발은 컴파일타임/런타임 문법 혼용해서 하지 못하는데,
스크립트 언어를 사용하게 되면 무언가 공중에서 자유를 만끽하는 느낌이랄까?

jquery 처럼 $(id) 로 객체를 갖고 오는 것이 가능하고, 실제로 Node 객체가 아닌 확장성을 위해 추상화한 객체를
반환한다. 또한 $.name(name) 으로 그룹으로 객체를 갖고오는 것도 가능하다.
이런 경우 .attr 메쏘드로 속성을 매길 때 내부 소유 객체에 모두 매겨질 수도 있다.
내가 jquery 를 직접 건들여본일은 몇번 없어서 함수명에 다소 차이는 있다.
라인수를 봐도 알겠지만, .attr, .css, .append(child) 정도밖에 구현을 해놓지 않았다. 기능이 몇개 없다 -_-;;
그리고 Node 생성하는 것은 $.text, $.element 정도만 구현해놓은 상태다.
이벤트 생성 이런 것등에 대한 고려는 되어있지 않다.
하지만, 다소 일반화를 고려하여 작성해서 확장시에 소스라인이 그다지 증가되지 않을 것이다.



>> 화면 결과


arrow 트랙백 | 댓글



icon 쓸만한 북마크 관리 프로그램(익스플로러, 파이어폭스, 사파리 동시 지원)
잡담 | 2009. 6. 26. 01:46


최근들어 가장 유용하게 사용하고 있는 플러그인은
Xmarks 라는 북마크 관리 프로그램이다.

Xmarks (beta) logo * 다운로드 페이지 - http://download.xmarks.com/download/all

원래는 foxmarks 라는 이름이었는데, 이름에서 알 수 있듯이 처음에는 파이어폭스 플러그인 형식으로 나온 듯 하다.
그러다가, 유명세를 타면서 xmarks 라는 이름으로 바꾸고 있는데,
이 북마크 프로그램의 강점은 다른 브라우저 번외 북마크 관리 프로그램과 달리,
브라우저의 북마크 정보를 이용한다는 점이다.
이 점은 사용자로서 번거롭게 별도로 북마크를 관리하지 않아도 된다는 면에서 괜찮다.

또한, 더 좋은 점은 Internet Explorer, Firefox(Win/Linux), Safari(Mac) 을 위한 Xmarks 가 제공된다.
즉, 여러 브라우저 상관없이 북마크를 공유할 수 있는 것이다 !
북마크 정보는 서버에 저장되는데, 독자적인 잘 일반화된 포맷을 갖고 있는 듯 하다.

나는 노트북, 데스크탑 왔다갔다 하면서 북마크를 따로 관리하기가 귀찮고, 가끔 애용하는 사이트들 주소가
기억이 안날때가 많은데, 이럴 때 Xmarks 를 상당히 유용하게 써먹고 있다.
가끔 버전마다 사소한 버그가 있긴 한데, 점점 나아지는 것 같다.
(처음쓸때는 인코딩 관련하여 심각한 버그들이 상당히 많았다. 북마크 중복 저장 및 한글 처리 등등. 지금은 거의 해결되었다)

설사, 버그가 발생할지라도 서버 상에 북마크 백업이 자동으로 관리되므로(버전 관리 형식이었던 것 같은데..)
안심하고 사용할 수 있다.

arrow 트랙백 | 댓글



icon 간만에 윈도우 웹 서버 셋팅 시작! (wamp + mod_python)
개발/Web | 2009. 6. 24. 22:08

오랜만에 윈도우 웹 서버를 구축할 계획이다. (블로그는 티스토리를 통해 계속 할 생각이지만)
본래 주 개발 분야가 C++ 로 게임 개발하는 것이지만, 웹 개발은 오래 전 부터 취미, 학습 차원에서 계속 해왔다.
주로 PHP 를 이용해서 개발했었지만, PHP 라는 언어가 워낙 마음에 들지 않았고, 쓰다보니
나쁜 성능 & 부족한 문법 & 보안 허점 등 나쁜 인식이 박히게 되었다.
그러다가 파이썬으로 웹 개발을 해보는 것이 어떨까 하는 생각이 들었다.

내가 굳이 웹개발을 다시 시작하게된 이유는 웹 개발 처럼 간편하면서도 GUI API 프레임워크를
내 맛깔대로 구축하는게 용이한 분야가 없다고 생각하기 때문이다. 한 마디로 취미차원으로 넘어서 공부차원으로도 유용하다.
비록 HTML, XHTML 등 웹포맷이 표준화 과정중이라지만, 다른 개발 분야 GUI 포맷보다 표준화가 잘 되었고, 포맷의 유연성이 뛰어난 면이 있다. 그리고 웹개발에 다시 관심을 가진 계기는 얼마전 유행하기 시작 OpenAPI 때문이다.
솔직히 C/C++ 부류의 언어로 개발한 프로그램은 웹 프로그램에 비해 유포하거나 공유하기가 힘들다.
(최소한 우리나라에서는 한정된 범주 때문에 그러한 문화가 정착되기 힘든 것 같다)
여러 가지 이유가 있지만, 대충 이런 저런 이유로 파이썬을 이용한 웹 개발을 시작하고자 한다.
(루비라는 언어도 좋다고 생각하지만, 이왕이면 더 알려지고 발전 지속 가능성이 높은 파이썬을 선택했다.)

여하튼, 나는 C/C++ 윈도우 게임 개발자라서 리눅스 개발 환경을 마음에 들어하면서도 쉽사리 윈도우에서 리눅스 환경으로
넘어가기가 쉽지가 않다. 이러한 점은 웹개발에 있어서 다소간 아쉬운 점인데 여하튼 그럴지라도 환경만 구축된다면
큰 문제는 없어 보인다.

Apache 웹서버, PHP, MySQL 을 동시에 깔아주고 어느 정도 모니터링을 해주는 APM 설치 프로그램들이 많이 존재한다.
그 중에서 그나마 좀 써봤던 WampServer 2.0h 버전을 깔아보기로 했다.
APM_Setup, AutoSet, xampp 도 써봤지만, 사실상 비슷하다고 본다.
내게 중요한 것은 에러 대응 능력 및 좋은 초기 셋팅 환경이라고 본다.
역시 큰 차이는 없다고 생각이 드나, 가장 익숙하고 개인적으로 마음에 들었다.

그리고 python 을 사용하기 위해서 python 2.5.4 mod_python 3.3.1 을 다운로드 받았다.
하지만 나는 python 3.x 를 사용하고 싶다.
그냥 CGI 쓰면 3.x 도 가능하겠지만, psp 를 쓸 수 없고 FastCGI 는 될 것도 같은데 잘 모르겠다.


1. 중간에 다음 한 줄을 추가했다.
LoadModule python_module modules/mod_python.so


2. 마지막에 다음을 추가했다.
# WARNING:
# 보안상 IfModule 없는게 나을지도 모르겠다.
# python 모듈이 로딩되지 않는다면
# 소스 파일이 화면상에 그냥 유출될 수 있기 때문이다.
<IfModule python_module>
#    <Directory "C:/wamp/www/">
#        Options Indexes FollowSymLinks ExecCGI
#        SetHandler python-program
#        PythonHandler mod_python.publisher
#        PythonDebug On
#    </Directory>
    <Directory "C:/wamp/www/">
        Options Indexes FollowSymLinks ExecCGI
        AddHandler python-program .psp .psp_ .py
        PythonHandler mod_python.psp | .psp .psp_
        PythonHandler mod_python.cgihandler | .py
        PythonDebug On
    </Directory>
</IfModule>


3.1. 다음은 mod_python.cgihandler 테스트이다. CGI 와 같은 방법을 mod_python 에서 handler 차원으로 제공해준다.
#-*-coding:utf-8-*-
import cgi
print("Content-Type: text/html\n\n")
print("<b>hello, world</b>")


3.2. 다음은 mod_python.psp 테스트이다.
<%
import time
%>
<html>
    <body>
<%
for i in range(3):
%>
        <span>world</span>
<%
%>
        korea
    </body>
</html>

'개발 > Web' 카테고리의 다른 글

윈도우 아파치 설치 빌드  (0) 2015.11.29
cURL을 이용해 HTTP 요청하는 법  (0) 2014.01.17
javascript 로 jquery 비슷한 구현  (0) 2009.07.01

arrow 트랙백 | 댓글



[PREV] [1][···][5][6][7][8] [NEXT]
관리자  |   글쓰기
BLOG main image
code heart story
분류 전체보기 (74)
생활 (0)
잡담 (8)
컴퓨터 (11)
개발 (52)
Total :
Today :
Yesterday :
rss
위치로그 : 태그 : 방명록 : 관리자
코드하트's Blog is powered by Daum / Designed by plyfly.net