Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기
(연관된 글이 5개 있습니다.)
3.3. PDB 파일에 따른 Debug 정보 - .NET 2.0 Web Site Model 유형의 프로젝트

이제 남은 유형은 .NET 2.0에서만 제공되는 Web Site Model 유형의 프로젝트군요. 이번에도 역시 이전에 살펴본 BaseLibrary C# 라이브러리 프로젝트를 사용할 것입니다. Web Site 유형의 파일 시스템을 기반으로 하는 만큼 단순히 "Site"라는 폴더를 만들고 그 안에 "Default.aspx" 파일을 만들어서 cs 파일에 다음과 같은 코드를 추가합니다.

    protected void Page_Load(object sender, EventArgs e)
    {
        BaseLibrary.ThrowClass throwClass = new BaseLibrary.ThrowClass();
        throwClass.TestMethod();
    }

이야기는 이전의 것과 이어지기 때문에, 여기서는 Web Site 유형에서만 특화된 부분만을 부가적으로 설명을 해나가겠습니다.

우선, 아시는 것처럼 Web Site 유형의 프로젝트는 별도의 "프로젝트 파일"이 없다는 특징이 있지요. 즉, 이것은 곧 프로젝트 관련한 설정들을 저장할 공간이 딱히 없기 때문에 개발자 임의대로 수정할 만한 사항이 많지 않습니다. 실제로, Web Site 유형의 프로젝트 관련 속성들은 sln 파일에 얹혀서 지내고 있습니다. 음... 꽤 서럽겠군요. ^^;

이번에도 실제 서비스 하는 것을 염두에 두고 설명해 나갈텐데요. Web Site 모델이 유용한 것으로는 2가지 컴파일 유형이 있으며, 그 외에 Web Application Model과 비슷한 유형의 컴파일 유형까지 지원해 주고 있습니다. 각각의 경우에 대해서 PDB 파일의 의미를 살펴보겠습니다.

1. cs 소스 파일 및 aspx 까지 모두 웹 애플리케이션 프로젝트에 올려 놓고 서비스하는 경우.
Web Site 모델이 유용할 수 있는 컴파일 설정 모델입니다. 예를 들어, 예전의 asp 시절과 마찬가지로 cs 소스 파일도 런타임에 즉각적으로 수정해서 반영시킬 필요가 있는 상황에서 사용될 수 있습니다. 또는 개인용 웹 사이트 처럼 그다지 복잡하지 않은 사이트 유형에 적합할 수 있습니다. 이 단계는 별도의 publish 절차를 거치지 않고, Web Site 프로젝트가 있는 폴더 그대로를 가상 디렉토리로 만드는 것으로 바로 서비스가 되어질 수 있습니다.

이런 유형은, 현재 VS.NET 2005의 "Debug" / "Release" 빌드 설정과는 전혀 무관하게 compilation[@debug]의 값에만 전적으로 의존하게 됩니다. 이 값이 true이면 모든 소스는 debug 모드로 컴파일 되어지고 PDB 파일도 함께 생성되어집니다. 반면 false이면, 모든 파일들이 release 모드로 컴파일되고 PDB 파일도 생성되지 않습니다.

결과적으로, compilation[@debug] 설정에 따라서 aspx와 aspx.cs 파일의 빌드 유형과 pdb 유무가 한꺼번에 결정되기 때문에, 디버그 정보를 전혀 얻을 수 없는 release 유형의 DLL들을 얻느냐와 디버그 정보를 얻을 수는 있지만 전체적으로 debug로 컴파일되어 성능이 낮은 유형의 DLL들을 얻을 수 있는지만 결정될 수 있습니다.

말 그대로, 매우 동적인 유형의 웹 사이트 또는 소규모 웹 사이트에 적합한 설정입니다.

2. cs 소스 파일 및 aspx 모두 미리 컴파일 되어 (pre-compiled) 배치되는 서비스.
이것 역시 Web Site 유형에서만 가능한 모델입니다. aspx까지 컴파일 한 것을 직접 배포하기 때문에 사용자는 aspx 파일 조차도 수정할 수 없게 되어, 마치 WinForm 응용 프로그램을 배포하듯이 완전한 형태의 바이너리 파일만을 배포할 수 있습니다.
1번 사항과는 반대로 클라이언트로 하여금 어떠한 수정도 할 수 없게 하고 싶을 때 유용한 형태인데요.

이런 유형으로 배포하기 위해서는, 웹 사이트 프로젝트 속성 창을 띄우고, "MSBuild Options"에서 "Allow this precompiled site to be updatable" 옵션을 해제해야 합니다.

그런데, 이번 유형은 특이한 것이 반드시 publish를 한다는 점인데요. VS.NET 2005의 Solution Explorer에서 마우스 오른쪽 버튼을 이용하여 "Publish Web Site"를 하거나 명령행에서 aspnet_compiler를 이용하는 방법이 있습니다.
PDB 관점에서 바라본다면, "Publish Web Site" 메뉴를 이용해서 publish하는 경우에는 현재의 Build 설정 및 compilation[@debug] 값에 관계없이 무조건 Release 유형으로 PDB 파일 생성 없이 DLL들이 생성되어집니다. 따라서, 예외 발생시 변변한 스택 트레이스 메시지를 얻을 수 없습니다. 하지만, aspnet_compiler를 사용하신다면 다음과 같은 옵션을 통해서 PDB 파일을 생성할 수 있습니다.

aspnet_compiler.exe -d -v /Site -p "D:\temp2\PdbSample\AspNet\WebSiteModel\Site" "D:\temp2\PdbSample\AspNet\WebSiteModel\PrecompiledWeb\Site"

위와 같이 실행하고 나면, Pre-compiled된 바이너리 파일들이 Site 폴더 하위에 생성이 되어지는 데, 확인해 보시면 PDB 파일들이 같이 생성된 것을 볼 수 있습니다. 따라서 예외가 발생하면 소스 파일 및 라인 번호가 나오게 됩니다.

그런데, 다소 불편하지요. 명령행에서 aspnet_compiler를 통하는 것도 그렇고 아예 DLL 자체가 debug 컴파일 되는 것도 만족스럽지 않습니다. 이런 경우, 사용될 수 있는 방법이 web.config에 컴파일러 옵션을 지정하는 것입니다. 다음을 참조합니다.

<configuration>

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" 
               type="Microsoft.CSharp.CSharpCodeProvider, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
               compilerOptions="/debug- /debug:pdbonly" >
      </compiler>
    </compilers>
  </system.codedom>

</configuration>

보시는 것처럼, dll에 대해서는 release 빌드를 하고 pdb-only 유형의 PDB 파일만 생성하도록 하고 있습니다. 이렇게 설정하고 솔루션 탐색기에서 "Publish Web Site" 메뉴를 선택하면 PDB 파일이 포함된 바이너리가 생성되는 것을 확인할 수 있습니다.

그런데, 여기서 잠시 "aspnet_compiler -d"와 결과물을 비교해 볼 필요가 있는데요. dll 파일과 pdb 파일의 크기가 동일한 것을 볼 수 있습니다. 그럼 ^^ aspnet_compiler가 사용하는 "-d" 옵션은 결국 "/debug- /debug:pdbonly"로 풀이된다고 추측해 볼 수 있습니다.

3. aspx 파일은 보존하고, cs 파일만 컴파일하는 유형.

사실 Web Site 모델에서 이런 유형으로 빌드하는 것은, 이전에 설명드렸던 Web Application Model과 비교해서 전혀 장점이 없으므로 하지 않는 것을 권장합니다. Web Application Model의 출현으로 인해, Web Site Model에서의 이런 유형은 앞으로 점차로 없어질 것이므로 굳이 설명하지 않겠습니다. 설명하지 않는 또 다른 이유는, 이 유형의 PDB 생성은 Web Application Model의 상황과 유사합니다.



그럼, 결론을 내려볼까요? 만약 여러분들이 현재 "Web Site Model"로 프로젝트를 진행 중이시라면 위에서 설명한 system.codedom을 통한 빌드 옵션을 설정함으로써 PDB 파일 생성을 직접 제어할 것을 권장합니다.

단지, 여기에는 한 가지 예외 사항이 있는데요. "Publish Web Site"를 통해서 배포를 하지 않고, "Web Deployment Project"를 별도로 만들어서 배포를 하시는 경우에는 굳이 system.codedom을 지정하실 필요 없이 해당 "Web Deployment Project"에서 디버그 관련 옵션을 설정하실 수 있으므로 그것을 따르시면 됩니다.
[연관 글]






[최초 등록일: ]
[최종 수정일: 6/21/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  6  7  8  9  10  11  12  [13]  14  15  ...
NoWriterDateCnt.TitleFile(s)
13321정성태4/14/20234105개발 환경 구성: 676. WSL/Linux Octave - Python 스크립트 연동
13320정성태4/13/20233994개발 환경 구성: 675. Windows Octave 8.1.0 - Python 스크립트 연동
13319정성태4/12/20234501개발 환경 구성: 674. WSL 2 환경에서 GNU Octave 설치
13318정성태4/11/20234385개발 환경 구성: 673. JetBrains IDE에서 "Squash Commits..." 메뉴가 비활성화된 경우
13317정성태4/11/20234421오류 유형: 855. WSL 2 Ubuntu 20.04 - error: cannot communicate with server: Post http://localhost/v2/snaps/...
13316정성태4/10/20233690오류 유형: 854. docker-compose 시 "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)" 오류 발생
13315정성태4/10/20233992Windows: 245. Win32 - 시간 만료를 갖는 컨텍스트 메뉴와 윈도우 메시지의 영역별 정의파일 다운로드1
13314정성태4/9/20234132개발 환경 구성: 672. DosBox를 이용한 Turbo C, Windows 3.1 설치
13313정성태4/9/20234141개발 환경 구성: 671. Hyper-V VM에 Turbo C 2.0 설치 [2]
13312정성태4/8/20234211Windows: 244. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (개선된 버전)파일 다운로드1
13311정성태4/7/20234642C/C++: 163. Visual Studio 2022 - DirectShow 예제 컴파일(WAV Dest)
13310정성태4/6/20234301C/C++: 162. Visual Studio - /NODEFAULTLIB 옵션 설정 후 수동으로 추가해야 할 library
13309정성태4/5/20234419.NET Framework: 2107. .NET 6+ FileStream의 구조 변화
13308정성태4/4/20234336스크립트: 47. 파이썬의 time.time() 실숫값을 GoLang / C#에서 사용하는 방법
13307정성태4/4/20234095.NET Framework: 2106. C# - .NET Core/5+ 환경의 Windows Forms 응용 프로그램에서 HINSTANCE 구하는 방법
13306정성태4/3/20233983Windows: 243. Win32 - 윈도우(cbWndExtra) 및 윈도우 클래스(cbClsExtra) 저장소 사용 방법
13305정성태4/1/20234340Windows: 242. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (쉬운 버전)파일 다운로드1
13304정성태3/31/20234638VS.NET IDE: 181. Visual Studio - C/C++ 프로젝트에 application manifest 적용하는 방법
13303정성태3/30/20233984Windows: 241. 환경 변수 %PATH%에 DLL을 찾는 규칙
13302정성태3/30/20234588Windows: 240. RDP 환경에서 바뀌는 %TEMP% 디렉터리 경로
13301정성태3/29/20234699Windows: 239. C/C++ - Windows 10 Version 1607부터 지원하는 /DEPENDENTLOADFLAG 옵션파일 다운로드1
13300정성태3/28/20234423Windows: 238. Win32 - Modal UI 창에 올바른 Owner(HWND)를 설정해야 하는 이유
13299정성태3/27/20234164Windows: 237. Win32 - 모든 메시지 루프를 탈출하는 WM_QUIT 메시지
13298정성태3/27/20234136Windows: 236. Win32 - MessageBeep 소리가 안 들린다면?
13297정성태3/26/20234722Windows: 235. Win32 - Code Modal과 UI Modal
13296정성태3/25/20234103Windows: 234. IsDialogMessage와 협업하는 WM_GETDLGCODE Win32 메시지 [1]파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  12  [13]  14  15  ...