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.