Visual Studio에서 디버그와 릴리스의 차이점은 무엇입니까?


답변:


114

가장 중요한 것은 디버그 모드에서는 최적화가없고 릴리스 모드에서는 최적화가 있다는 것입니다. 이것은 컴파일러가 매우 고급이고 코드를 매우 까다로운 저수준으로 개선 할 수 있기 때문에 중요합니다. 결과적으로 코드의 일부 행이 지침없이 남거나 일부가 모두 뒤섞 일 수 있습니다. 단계별 디버깅은 불가능합니다. 또한 지역 변수는 종종 신비한 방식으로 최적화되기 때문에 변수가 "최적화"되어 있기 때문에 Watches 및 QuickWatch가 작동하지 않는 경우가 많습니다. 그리고 다른 최적화도 많이 있습니다. 언젠가 최적화 된 .NET 코드를 디버깅 해보십시오.

또 다른 주요 차이점은 이로 인해 기본 릴리스 설정이 광범위한 디버그 기호 정보를 생성하는 데 신경 쓰지 않는다는 것입니다. 이 파일은 .PDB 파일이며 디버거가 어떤 어셈블리 명령이 어떤 코드 줄에 해당하는지 파악할 수 있도록합니다.


1
"결과적으로 코드의 일부 행이 지침없이 남거나 일부가 모두 뒤섞 일 수 있습니다." YUP, 현재 메소드 / 속성의 이름을 얻기 위해 스택 프레임을 사용하여이 문제를 해결했습니다. 릴리스에서 많은 속성이 인라인되었습니다 ...
kpollock

4
"가장 중요한 것은 디버그 모드에서 최적화가 없다는 것입니다."-그것은 논쟁의 여지가 있습니다. 가장 중요한 것은 디버그 할 수있는 디버그 정보가 있다는 것입니다. 릴리스에서도 존재할 수 있습니다.
shoosh

기본 모드 (디버그 / 릴리스)가 무엇인지 모르겠습니다. 일반적으로 내 경험상 모든 프로젝트는 디버그 모드에 있으며 설치 프로그램 팀은 pdb 파일을 피하고 최적화를 도입하기 위해이 릴리스를 처리 할 것입니다. 그러나 오늘 나는 모드가 릴리스로 변경되고 브레이크 포인트를 사용하여 코드를 깰 수없는 상황을 발견했습니다. 1 시간 동안 많은 작업을 시도했는데 마침내 현재 컴파일 모드의 문제로 인한 것임을 알았습니다. @ Vlix- 답변 주셔서 감사합니다.
kbvishnu

1
이것은 실제로 기본 릴리스 구성을 준수하는 응용 프로그램을 디버깅하는 동안 직접 창에서 기호를 분석하는 동안 발생한 " '변수'라는 이름이 현재 컨텍스트에 없습니다"문제를 해결하는 데 도움이되었습니다. 감사합니다!
M463

1) 다음 문제는 어떻습니까? ASP.NET MVC 프로젝트에는 기본 (웹), 디버그 (web.debug), 릴리스 (web.release)의 세 가지 구성이 있습니다. 해당 구성 (디버그 및 릴리스)으로 변환하여 디버그 및 릴리스 연결 문자열을 설정했다고 가정합니다. 게시 할 때 게시 대화 상자에서 선택한 내용에 따라 게시 할 수 있습니다. 그러나 응용 프로그램을 실행할 때 디버그를 선택했지만 릴리스 구성을 사용합니다 (기본 및 디버그 구성에서 디버그 구성을 설정했기 때문에), 정상입니까?
Jason

52

"Debug"와 "Release"는 실제로 빌드 및 디버깅에 영향을 줄 수있는 전체 설정에 대한 두 개의 레이블입니다.

"디버그"모드에서는 일반적으로 다음이 있습니다.

  • 프로그램 디버그 데이터베이스 파일-런타임 동안 소스에서 프로그램 실행을 매우 밀접하게 추적 할 수 있습니다.
  • 모든 최적화가 꺼져있어 변수 값을 검사하고 그렇지 않으면 최적화되었거나 인라인되었을 수있는 함수를 추적 할 수 있습니다.
  • 릴리스와 비교하여 디버그 모드에서 다르게 작동하는 코드를 작성할 수있는 _DEBUG 전 처리기 정의 (예 : 디버깅 중에 만 사용해야하는 ASSERT를 계측하는 경우)
  • 일반적으로 실제 고객에게 배포되지 않는 디버깅 옵션을 사용하여 컴파일 된 라이브러리에 연결 (크기 및 보안상의 이유로)

"Release"모드에서는 최적화가 켜져 있고 (사용 가능한 여러 옵션이 있지만) _DEBUG 전 처리기 정의가 정의되어 있지 않습니다. 일반적으로 PDB 파일을 생성하고 싶을 것입니다. 작업이 더 빨리 실행될 때 릴리스 모드에서 "디버그"할 수있는 것이 매우 유용하기 때문입니다.


5
"단지 두 개의 레이블"-실제로 Visual Studio는 더 많은 것을 만들 수있는 기능을 제공합니다 ! 이것은 프로그램을 테스트하는 동안 매우 유용 할 수 있습니다. 예를 들어, 저는 최근에 명령 줄에서 파일 이름을 허용하는 내 작업 프로그램을 작성했습니다. 명령 줄 구문 분석을 테스트했지만 일단 완료되면 매일 CMD와 파일 이름 목록을 엉망으로 만들고 싶지 않았습니다. 조건부 컴파일을 사용하여 더미 명령 줄 값을 제공하고 프로그램의 비즈니스 로직을 테스트 할 수있는 구성을 만들었습니다. 이로 인해 프로그램 개발에서 훨씬 더 빠른 반복주기가 가능해졌습니다.
Brian S

9

대부분 디버그에는 디버깅 할 때 유용한 추가 정보가 많이 포함되어 있습니다. 릴리스 모드에서는이 모든 것이 성능을 위해 잘리고 교환됩니다.


1) 다음 문제는 어떻습니까? ASP.NET MVC 프로젝트에는 기본 (웹), 디버그 (web.debug), 릴리스 (web.release)의 세 가지 구성이 있습니다. 해당 구성 (디버그 및 릴리스)으로 변환하여 디버그 및 릴리스 연결 문자열을 설정했다고 가정합니다. 게시 할 때 게시 대화 상자에서 선택한 내용에 따라 게시 할 수 있습니다. 그러나 응용 프로그램을 실행할 때 디버그를 선택했지만 릴리스 구성을 사용합니다 (기본 및 디버그 구성에서 디버그 구성을 설정했기 때문에), 정상입니까?
Jason

2) 디버그 또는 릴리스 모드에서 애플리케이션을 실행할 때 VS는 기본 웹 구성 또는 해당 웹 구성 (web.debug.confg 또는 web.release.config)을 사용합니까?
Jason

7

프로젝트 컴파일 옵션을 살펴보고 비교하면 차이점이 무엇인지 알 수 있습니다.

질문이 네이티브 / C ++ 코드에 관한 것이라고 가정합니다 (구문에서 완전히 명확하지 않음).

기본적으로 디버그에서 모든 코드 생성 최적화가 꺼져 있습니다. 일부 라이브러리 (예 : STL )는 기본적으로 더 엄격한 오류 검사 (예 : 디버그 반복기)를 사용합니다. 더 많은 디버깅 정보가 생성됩니다 (예 : "편집 및 계속"). 오류를 포착하기 위해 코드에서 더 많은 것들이 생성됩니다 (로컬 변수 값은 초기화되지 않은 패턴으로 설정되고 디버그 힙이 사용됨).


2
@Vilx : 내가 대답했을 때 아직 .net 태그가 없었고 visualstudio 만있었습니다. 그래서 저는 그것이 C ++라고 생각했습니다.
NeARAZ

6

또한 디버그 모드는 디버깅에 도움이되는 많은 추가 스레드를 생성합니다. 디버거 연결 여부에 관계없이 프로세스 수명 동안 활성 상태로 유지됩니다. 여기 내 관련 질문을 참조 하십시오 .


하지만 .NET (C ++ 아님)에만 해당합니까?
Peter Mortensen

6

빌드 플래그는 로깅 및 "콘솔"메시징을 변경하는 데만 사용해야 하는 다른 로직을 허용 하지만 남용 될 있으며 하위 수준뿐 아니라 실제 비즈니스 로직도 크게 변경 될 있다는 점은 매우 분명한 사실을 언급 할 가치 있습니다 .


"... 엄청난 변화 ... 실제 비즈니스 로직"-나에게 버그처럼 들린다! 조건부 코드가 많아서 이해하기가 정말 어렵습니다. 또한 조건부 코드 플래그의 각 조합 은 기본적으로 정확성과 기본 무결성을 보장하기 위해 테스트해야하는 소프트웨어 의 다른 버전입니다. 나의 소프트웨어 구축 성경 인 "Code Complete"에 따르면, 우리의 "Prime Directive"는 복잡성 관리입니다. (해결해야 할 # 1 문제입니다). 더 많은 조건부 플래그를 무차별 적으로 추가하기 전에 오래 열심히 생각하십시오!
MicroservicesOnDDD

위의 의견은 특히 마지막 문장이 진행되는 한이 답변을 겨냥한 것이 아닙니다 ... 이것은 여기에 오는 독자가 읽어야한다고 생각한 추가 사항이었습니다.
MicroservicesOnDDD

6

또한 예를 들어 MFC 를 사용할 때 디버그 프로젝트는 재배포 불가능한 DLL 버전 MFC90D.DLL에 대해 링크하는 반면 릴리스 빌드는 다음과 같은 재배포 가능 버전에 대해 링크합니다.MFC90.DLL . 이것은 아마도 다른 프레임 워크와 유사합니다.

따라서 개발되지 않은 컴퓨터에서는 디버그 빌드 응용 프로그램을 실행할 수 없습니다.


매우 사실입니다. 클라이언트에서 한 번 위반했습니다. 내 컴퓨터 (TM)에서 작동합니다.
Matt Jacobsen

배포 할 수 있습니다 .. (허용 여부를 모릅니다). 응용 프로그램의 하위 폴더에 적절하게 이름을 지정해야합니다.
Andreas Reiff 2012

@Andreas 제 예와 관련하여 "재배포 불가"는 Microsoft에서 배포를 허용 하지 않음을 의미 합니다.
foraidt jul.

4

기존 릴리스 빌드 구성에서 복사 한 애플리케이션을 개발했을 때도이 질문에 대해 궁금해했습니다.

디버그 모드에서 해당 응용 프로그램을 사용하는 데 관심이있는 개발자가 있으므로 Release 구성에서 복사 한 ReleaseMyBuild 이름으로 존재하는이 빌드 구성을 만들려면 어떻게해야하는지 궁금했습니다 (따라서 모든 설정이 릴리스 최적화에 맞게 조정되어야합니다). ) 혼란스러운 빌드 구성 이름에도 불구하고 갑자기 팀을 변경하고 디버그 빌드가됩니다.

저는 프로젝트 구성이 이름 일 뿐이며 Joris Timmermans가 언급 한 "모든 설정"을 선택하는 편리한 방법이라고 생각했습니다. "FOO"라는 빌드 구성이 최적화 된 릴리스 로 작동하도록하는 설정이 무엇인지에 대한 핵심을 알고 싶었습니다. 빌드 .

여기에 한 가지 엿볼 수 있습니다. Visual Studio 2010의 빈 프로젝트 템플릿에서 새 VCXPROJ를 만들었습니다. 그런 다음이를 복사하고 둘 다 편집했습니다. 첫 번째는 디버그 콘텐츠를 유지하고 두 번째는 릴리스 콘텐츠를 유지했습니다. 관련 차이점을 중심으로 한 차이점은 다음과 같습니다.

빈 VCXPROJ 디버그 대 릴리스 차이

해제

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

디버그

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

링크 섹션에서 둘 다 GenerateDebugInformationtrue로 설정 한 것이 흥미 롭습니다 .


3

분명한 차이점은 바이너리의 크기입니다. 디버그 빌드는 릴리스 빌드보다 더 큰 바이너리를 생성합니다.

디버그에서 컴파일 할 때 심볼 테이블이 코드 파일의 컴파일 된 개체에 추가되어 디버깅 프로그램이 이러한 바이너리를 활용하고 개체 및 변수의 값에 액세스 할 수 있습니다.

또 다른 눈에 띄는 차이점은 릴리스 모드에서 디버그 모드에있는 동안 바이너리가 치명적인 오류로 인해 충돌이 발생한다는 것입니다. Visual Studio에서 애플리케이션 디버깅을 시작하면 오류가있는 문의 정확한 위치를 알려주는 호출 스택을 확인할 수 있습니다. .


-15

실제로 쉽게 사용할 수있는 정보가 없기 때문에 정확한 차이점이 무엇인지 모르겠습니다.

그러나 관찰 된 주요 차이점은 릴리스 버전이 결과 DLL 파일을 손상시켜 응용 프로그램, 웹 응용 프로그램을 사용할 수 없게 만든다는 것입니다.

슬프게도 프로덕션에 디버그 빌드를 넣어야합니다. 그리고 예, 게시하려면 좋은 오래된 FTP를 사용해야합니다.


7
이것은 질문에 어떻게 대답합니까? 그리고 입력 할 때주의하십시오.
mmking

비슷한 문제가 있었고 코드는 디버그 모드에서 작동하지만 릴리스 모드에서는 문제가 있습니다. 내 코드에 문제가 있음이 밝혀졌습니다. 릴리스 버전의 일반적인 문제에 대한 훌륭한 기사 가 있는데 이것이 다른 사람들에게도 도움이되기를 바랍니다.
Weihui Guo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.