Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Visual Studio 디버깅 경고 창 - You are debugging a Release build of ...

Visual Studio로 디버깅 중 특정 DLL에 대해 다음과 같은 경고 창이 뜹니다.

dbg_stop_continue_dlg_1.png

You are debugging a Release build of ....dll. Using Just My Code with Release builds using compiler optimizations results in a degraded debugging experience (e.g. breakpoints will not be hit).


로딩된 DLL이 정말 디버그 모드로 빌드가 안된 것인지 우선 확인이 필요한데요. 이를 위해 "Ctrl + Alt + U"를 눌러 Modules 창을 띄우면 다음과 같이 문제가 되는 DLL의 정확한 위치를 알 수 있습니다.

Test.Deployment.dll C:\Users\...\AppData\Local\Temp\Temporary ASP.NET Files\root\e340c117\16ede91d\assembly\dl3\4f9f32bc\3dfbd40c_939fd201\Test.Deployment.dll

그런데... Modules 창에는 분명히 "Symbols loaded."라는 메시지와 함께 "C:\...\Test.Deployment.pdb" 파일이 선택되었다고 합니다. 즉, 디버거를 위한 PDB 파일은 정상적으로 제공된 상태입니다.

다음 단계로, 해당 DLL을 .NET Reflector로 로딩한 후 assembly 수준의 Debuggable 특성을 확인한 결과 2로 나왔습니다.

[assembly: System.Diagnostics.Debuggable(0x02)]

이 값의 의미는,

DebuggableAttribute Class
; https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.debuggableattribute

[ComVisible(true)]
[Flags]
public enum DebuggingModes
{
    None = 0,
    Default = 1,
    IgnoreSymbolStoreSequencePoints = 2,
    EnableEditAndContinue = 4,
    DisableOptimizations = 256
}

단지 IgnoreSymbolStoreSequencePoints가 지정된 것에 불과합니다. 대개의 경우, Release 모드로 빌드하면 Debuggable(2)로 뜨고, Debug 모드로 빌드하면 다음과 같은 구성의,

0x107 = 263
        DisableOptimizations | EnableEditAndContinue | IgnoreSymbolStoreSequencePoints | Default

Debuggable(0x107)로 나오기 때문에 분명히 Release 빌드로 된 것이 맞습니다. 음... 정말 이상하군요. ^^

문제를 밝혀내기 위해 DLL을 참조하는 프로젝트의 .csproj 파일에서 참조 대상을 살펴봤습니다.

<ProjectReference Include="..\Externals\Test.Deployment\Test.Deployment.csproj">
    <Project>{ac0d50da-96df-4395-87d4-de04c2c232ae}</Project>
    <Name>Test.Deployment</Name>
</ProjectReference>

분명히 프로젝트 참조로 되어 있고, Test.Deployment.csproj의 속성 창을 띄워도 Debug 빌드로 명시가 되어 있습니다. 오호~~~ 정말 신기한 경우입니다. ^^;



그래도 우여곡절 끝에 다행히 원인이 밝혀졌습니다. ^^ 해당 프로젝트에 포함된 AssemblyInfo.cs 파일에 다음과 같이 Debuggable 특성의 값이 명시되어 있던 것이 문제였습니다.

[assembly: System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

위의 특성 값이 명시된 사연은 이러합니다. 해당 소스 코드는 .NET Reflector를 통해 DLL로부터 "Export Source Code..." 기능으로 얻은 것이었는데, 마침 그 원본 DLL의 빌드 상태가 Release 빌드였기 때문에 그 특성이 그대로 소스 코드로 출력된 것이었습니다.

정리하자면, .NET Reflector와 같은 역 어셈블 도구로 구한 소스 코드의 경우 지정된 Debuggable 특성의 값을 지워주는 것이 권장됩니다. ^^





[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/17/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)
13768정성태10/15/20245397C/C++: 179. C++ - _O_WTEXT, _O_U16TEXT, _O_U8TEXT의 Unicode stream 모드파일 다운로드2
13767정성태10/14/20244774오류 유형: 929. bpftrace 수행 시 "ERROR: Could not resolve symbol: /proc/self/exe:BEGIN_trigger"
13766정성태10/14/20244555C/C++: 178. C++ - 파일에 대한 Text 모드의 "translated" 동작파일 다운로드1
13765정성태10/12/20245267오류 유형: 928. go build 시 "package maps is not in GOROOT" 오류
13764정성태10/11/20245632Linux: 85. Ubuntu - 원하는 golang 버전 설치
13763정성태10/11/20244988Linux: 84. WSL / Ubuntu 20.04 - bpftool 설치
13762정성태10/11/20245010Linux: 83. WSL / Ubuntu 22.04 - bpftool 설치
13761정성태10/11/20244917오류 유형: 927. WSL / Ubuntu - /usr/include/linux/types.h:5:10: fatal error: 'asm/types.h' file not found
13760정성태10/11/20245452Linux: 82. Ubuntu - clang 최신(stable) 버전 설치
13759정성태10/10/20246367C/C++: 177. C++ - 자유 함수(free function) 및 주소 지정 가능한 함수(addressable function) [6]
13758정성태10/8/20245579오류 유형: 926. dotnet tools를 sudo로 실행하는 경우 command not found
13757정성태10/8/20245523닷넷: 2306. Linux - dotnet tool의 설치 디렉터리가 PATH 환경변수에 자동 등록이 되는 이유
13756정성태10/8/20245630오류 유형: 925. ssh로 docker 접근을 할 때 "... malformed HTTP status code ..." 오류 발생
13755정성태10/7/20246029닷넷: 2305. C# 13 - (9) 메서드 바인딩의 우선순위를 지정하는 OverloadResolutionPriority 특성 도입 (Overload resolution priority)파일 다운로드1
13754정성태10/4/20245579닷넷: 2304. C# 13 - (8) 부분 메서드 정의를 속성 및 인덱서에도 확대파일 다운로드1
13753정성태10/4/20245596Linux: 81. Linux - PATH 환경변수의 적용 규칙
13752정성태10/2/20246282닷넷: 2303. C# 13 - (7) ref struct의 interface 상속 및 제네릭 제약으로 사용 가능 [6]파일 다운로드1
13751정성태10/2/20245410C/C++: 176. C/C++ - ARM64로 포팅할 때 유의할 점
13750정성태10/1/20245294C/C++: 175. C++ - WinMain/wWinMain 호출 전의 CRT 초기화 단계
13749정성태9/30/20245537닷넷: 2302. C# - ssh-keygen으로 생성한 Private Key와 Public Key 연동파일 다운로드1
13748정성태9/29/20245744닷넷: 2301. C# - BigInteger 타입이 byte 배열로 직렬화하는 방식
13747정성태9/28/20245597닷넷: 2300. C# - OpenSSH의 공개키 파일에 대한 "BEGIN OPENSSH PUBLIC KEY" / "END OPENSSH PUBLIC KEY" PEM 포맷파일 다운로드1
13746정성태9/28/20245691오류 유형: 924. Python - LocalProtocolError("Illegal header value ...")
13745정성태9/28/20245552Linux: 80. 리눅스 - 실행 중인 프로세스 내부의 환경변수 설정을 구하는 방법 (lldb)
13744정성태9/27/20245983닷넷: 2299. C# - Windows Hello 사용자 인증 다이얼로그 표시하기파일 다운로드1
13743정성태9/26/20246430닷넷: 2298. C# - Console 프로젝트에서의 await 대상으로 Main 스레드 활용하는 방법 [1]
1  2  3  4  5  6  [7]  8  9  10  11  12  13  14  15  ...