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)
13917정성태4/30/202528VS.NET IDE: 199. Directory.Build.props에 정의한 속성에 대해 Condition 제약으로 값을 변경하는 방법
13916정성태4/23/2025428디버깅 기술: 221. WinDbg 분석 사례 - ASP.NET HttpCookieCollection을 다중 스레드에서 사용할 경우 무한 루프 현상 - 두 번째 이야기
13915정성태4/13/20251636닷넷: 2331. C# - 실행 시에 메서드 가로채기 (.NET 9)파일 다운로드1
13914정성태4/11/20251964디버깅 기술: 220. windbg 분석 사례 - x86 ASP.NET 웹 응용 프로그램의 CPU 100% 현상 (4)
13913정성태4/10/20251187오류 유형: 950. Process Explorer - 64비트 윈도우에서 32비트 프로세스의 덤프를 뜰 때 "Error writing dump file: Access is denied." 오류
13912정성태4/9/2025848닷넷: 2330. C# - 실행 시에 메서드 가로채기 (.NET 5 ~ .NET 8)파일 다운로드1
13911정성태4/8/20251075오류 유형: 949. WinDbg - .NET Core/5+ 응용 프로그램 디버깅 시 sos 확장을 자동으로 로드하지 못하는 문제
13910정성태4/8/20251240디버깅 기술: 219. WinDbg - 명령어 내에서 환경 변수 사용법
13909정성태4/7/20251710닷넷: 2329. C# - 실행 시에 메서드 가로채기 (.NET Framework 4.8)파일 다운로드1
13908정성태4/2/20252105닷넷: 2328. C# - MailKit: SMTP, POP3, IMAP 지원 라이브러리
13907정성태3/29/20251898VS.NET IDE: 198. (OneDrive, Dropbox 등의 공유 디렉터리에 있는) C# 프로젝트의 출력 경로 변경하기
13906정성태3/27/20252149닷넷: 2327. C# - 초기화되지 않은 메모리에 접근하는 버그?파일 다운로드1
13905정성태3/26/20252175Windows: 281. C++ - Windows / Critical Section의 안정화를 위해 도입된 "Keyed Event"파일 다운로드1
13904정성태3/25/20251877디버깅 기술: 218. Windbg로 살펴보는 Win32 Critical Section파일 다운로드1
13903정성태3/24/20251508VS.NET IDE: 197. (OneDrive, Dropbox 등의 공유 디렉터리에 있는) C++ 프로젝트의 출력 경로 변경하기
13902정성태3/24/20251717개발 환경 구성: 742. Oracle - 테스트용 hr 계정 및 데이터 생성파일 다운로드1
13901정성태3/9/20252096Windows: 280. Hyper-V의 3가지 Thread Scheduler (Classic, Core, Root)
13900정성태3/8/20252331스크립트: 72. 파이썬 - SQLAlchemy + oracledb 연동
13899정성태3/7/20251790스크립트: 71. 파이썬 - asyncio의 ContextVar 전달
13898정성태3/5/20252109오류 유형: 948. Visual Studio - Proxy Authentication Required: dotnetfeed.blob.core.windows.net
13897정성태3/5/20252337닷넷: 2326. C# - PowerShell과 연동하는 방법 (두 번째 이야기)파일 다운로드1
13896정성태3/5/20252161Windows: 279. Hyper-V Manager - VM 목록의 CPU Usage 항목이 항상 0%로 나오는 문제
13895정성태3/4/20252204Linux: 117. eBPF / bpf2go - Map에 추가된 요소의 개수를 확인하는 방법
13894정성태2/28/20252231Linux: 116. eBPF / bpf2go - BTF Style Maps 정의 구문과 데이터 정렬 문제
13893정성태2/27/20252179Linux: 115. eBPF (bpf2go) - ARRAY / HASH map 기본 사용법
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...