2008-11-05 5 views
4

vc2008에서 내 응용 프로그램을 빌드하고 컴퓨터 네트워크에서 테스트하고 있습니다.비 -deb 머신에서 vc2008 디버그 빌드 실행

Visual Studio 2008을 설치하는 것 외에 다른 컴퓨터에서 C++ 프로그램의 디버그 빌드를 실행하는 방법이 있습니까? (즉, vc2008이 설치되어 있지 않음)

redist 패키지를 설치하면 vc2008 프로그램 용 릴리스 모드 지원 DLL 만 설치됩니다. 현재 "이 응용 프로그램은 응용 프로그램 구성이 올바르지 않아 시작하지 못했습니다. 응용 프로그램을 다시 설치하면이 문제가 해결 될 수 있습니다."라는 문구가 있습니다. "DLL이 누락되었습니다."라는 코드가 있다고 가정합니다.

답변

8

디버그 런타임에 설치 프로그램을 다시 배포 할 필요가 없기 때문에 (사실상 소프트웨어 라이선스로 배포를 금지하므로 무언가를 함께 가져가더라도 EULA를 위반할 수는 없습니다.) 그러나 일반적으로 "디버그 빌드"에는 4 개의 개별 옵션이 포함되고 나머지 3 개는 앱 배포에 영향을 미치지 않습니다.

  1. 심볼릭 디버깅을 허용하는 .pdb 파일 (cl/Zi 및 link/DEBUG) 생성. 링커 옵션에/OPT : ref를 추가하려고합니다. 링커는 .pdb 파일을 만들지 않을 때 참조되지 않은 함수를 삭제하지만/DEBUG 모드를 사용하면이를 명시 적으로 추가하지 않는 한 디버그 기호가 참조하므로 모두 유지합니다.

    저는 일반적으로 모든 빌드, 심지어 프로덕션 환경에서도이 작업을 수행합니다. 링커 최적화를/OPT : ref로 다시 켜기 만하면 실제로 비용이 들지 않으며 크래시 덤프를 읽으려는 경우 기호를 사용하면 편리 할 수 ​​있습니다.

  2. C 런타임 라이브러리 (아마도 MSVCR * D.dll이지만 디버깅 버전을 사용하지만 사용중인 런타임에 따라 다름)를 사용하십시오. 이것은/MT 또는/MTd (또는 dll 런타임을 사용하지 않는 경우 다른 것)로 귀결됩니다.

    이것은 더 이상 재배포 할 수 없다는 것을 의미합니다. 또한 일부 라이브러리 기능의 성능, 특히 메모리 할당에 큰 영향을 미칩니다. 디버그 런타임 버전은 초기화되지 않은 데이터 버그를 없애기 위해 값을 사용하는 메모리를 "조심"하게 조심합니다. 릴리스 된 데이터는 일반적으로 이전 데이터를 그대로 두어 시간을 절약합니다. 나는 MSVCP * STL 구현에서 디버그 버전도 일반적으로 수행되는 모든 할당 풀을 생략하므로 누수 검사기가 생각할 블록을 정확하게 표시 할 수 있고 하위 할당 된 메모리의 큰 덩어리를 표시 할 수 없으므로, 하지만 그것은 malloc에 ​​대한 호출이 훨씬 더 느려지는 것을 의미합니다. 포인터 또는 반복자 처리 버그가있는 경우, 이는 사용자가 어떤 종류의 오작동을하는지 영향을 미칠 수 있습니다.

  3. 컴파일러 최적화 기능 (/ Od)을 해제합니다.

    이 것은 많은 작업을 수행하지만 (this question은 주제에 대해 좋은 토론을 가졌음) 기본적으로 성능이 떨어집니다. 많이. 불행히도, 단일 스텝핑이 원활하게 작동하기를 원한다면 필요합니다.

  4. 프리 프로세서 #defines DEBUG 또는 NDEBUG를 설정합니다.

    이것은 다양한 방법으로 많은 라이브러리에 영향을 미치지 만, 가장 주목할만한 것은 assert()와 친구들을 컴파일하거나 제거한다는 것입니다.

이러한 선택 사항 중 일부를 조합하여 빌드하는 것이 좋습니다.나는 기호 (/ Zi와 link/DEBUG)와 assert (/ DDEBUG)를 사용하지만 여전히 최적화 된 (/ O1 또는/O2 또는 어떤 플래그를 사용 하든지) 스택 프레임 포인터를 사용하는 빌드를 많이 사용한다. 백 트레이스 지우기 (/ Oy-) 및 일반 런타임 라이브러리 (/ MT) 사용. 이것은 내 릴리즈 빌드에 가깝게 수행되며 세미 디버깅이 가능합니다 (백 트래스는 좋지만 단일 단계는 소스 레벨에서 조금 엉뚱한 것입니다; 어셈블리 레벨은 물론 잘 작동합니다). 그러나 원하는 많은 구성을 가질 수 있습니다. 첫 번째 버전을 복제하고 디버깅의 모든 부분을 유용하게 설정하십시오. 다른 컴퓨터에서 디버깅하려는 경우 응용 프로그램을 재배포하는 것을 시도에 영향을해야

유일한 사람 2.

, 당신은 또한 msvsmon에 관심이있을 수 있습니다.

0

this blog post은 앱의 디버그 플레버를 실행할 수있는 파일과 그 파일을 가져올 위치를 읽습니다. 그러나 제 3 자에게 공식적으로 재배포 할 수는 없습니다.

응용 프로그램의 설치 관리자가있는 경우 Visual Studio가없는 컴퓨터에 디버그 런타임을 배포하기 위해 빌드 할 수있는 병합 모듈이 있습니다. 물론 테스트 목적으로 만 사용됩니다. 병합 모듈은 C:\Program Files\Common Files\Merge Modules에 있습니다.

+0

감사합니다. Microsoft의 블로그 정보조차도 VS 2008에서는 불완전하고 부정확합니다. –

1

물론 DLL을 사용하는 대신 CRT에서 정적으로 링크하도록 프로그램을 구성 할 수 있습니다.

그런 식으로 디버그 DLL이 제대로 설치되었는지 확인해야한다는 번거 로움을 피할 수 있습니다 (설정 및 재배포 라이센스 측면에서).

"런타임 라이브러리"의 코드 생성 설정을 "다중 스레드 디버그 (/ MTd)"로 변경하거나 명령 줄에서 "/ MTd"옵션을 사용하십시오.

+0

CRT를 동적으로 연결해야하는 MFC를 사용할 때를 제외하고는 ... – avakar

+0

이것은 정말 끔찍합니다. 오늘 내 인생을 지옥으로 만들어 주신 마이크로 소프트에게 감사드립니다. –