2012-02-23 2 views
0

현재 매우 특이한 문제를 다루고 있습니다. MSVC 환경에서 실행하든 빌드 된 실행 파일을 직접 실행하든 관계없이 Debug-Buildmode에서 완전히 작동하는 응용 프로그램이 있습니다. Release-Buildmode에서이 응용 프로그램을 빌드하면 MSVC 환경에서 실행할 때 완전히 작동하지만 직접 시작할 때 예기치 않은 동작을 보여줍니다.MSVC++ 디버그와 릴리스 환경의 차이점

디버그 모드와 릴리스 모드의 차이점은이 동작의 원인 일 수 있으며 실행 파일을 수동으로 시작할 때만 문제가 발생하는 이유는 무엇입니까?

코드를 작성하기가 어렵습니다. 상당히 큰 프로젝트이므로 문제의 원인이 될 수있는 단서가 전혀 없습니다. 프로그램 흐름은 기본적으로 : 파일에서

  • 읽기 설정 (안 문제가 두 번 읽기 값을 확인 및 ini-와 libconfig ++ 사용 - 확인하기 위해 라이브러리)
  • 클래스를 분리해서 값을 배포 (더블 릴리스 빌드를 수동으로 실행되면 이러한) 내가 힘을 상상할 수

뭔가를 트리거하지 않습니다 (전달 된 값)이 클래스의

  • 하나는 스레드 (boost::thread 시작)를 확인하고 특정 이벤트에 대한 콜백 함수를 트리거 문제를 일으키고, 하지만 확실하지 오전 : 클래스가 다른 사람에 의해 작성 되었기 때문에

    • , std::stringstd::wstring의 사용 사이의 불일치가있다. 나는 std::wstring(s.begin(), s.end())을 사용하여 하나에서 다른 것으로 변환하고 그 반대도 마찬가지입니다.

    내 문제의 원인이 될 수 있으며, 그렇다면 문제를 어떻게 해결할 수 있습니까? 나는 이것에 대한 도움을 정말로 바랄 것이다. 미리 감사드립니다.

    업데이트 :

    • 이 프로그램은 충돌하지 않고 변수 내가 (디버거 모든 것이 잘 밖으로 작동에 있기 때문에) 악명 높은 인쇄 디버그 방법을 사용할 때
    • 다른 값을 가질하지 않는 것 나는 unitialized 변수가이 문제를 일으킬 수 있고 나에 의해 사용되는 모든 변수를 세 번 검사하고 모든 변수가 제대로 초기화됨을 읽었습니다.
    • 단위 테스트에서 모든 모듈이 예상대로 작동합니다. 국경 사건은 매번 바뀌 었습니다. 모든 모듈을 직접 작성하지 않았습니다.)

    업데이트 2 :

    • 단계별로 최적화 단계를 해제 가까이 내가 문제를 좁힐 수 있었다 디버그 buildmode의 분리 buildmode을 가져 오는 동안 : ** 코드 생성 탭에서, 최적화 설정에 관계없이 내 프로그램은 Multithreaded-DLL이 아닌 Multithreaded-Debug-DLL으로 작동합니다.

    이것은 좋은 성과 인 것 같지만 아직이 문제에 대한 이해가 부족합니다.

  • +0

    정확히 무엇이 문제입니까? 프로그램이 충돌합니까? 이러한 이벤트를 트리거하는 코드를 찾으려고 했습니까? 문자열의 불일치를 완전히 수정 했습니까? –

    +0

    종종 이것은 프로그램 시작 방법에 따라 다른 임의의 값을 가져 오는 초기화되지 않은 변수입니다. –

    +0

    @Bojan Komazec "고정 문자열 완전하지 않음"이란 무엇을 의미합니까? 위에서 설명한 것처럼 std :: string을 std :: wstring으로 여러 번 변환해야합니다. – nijansen

    답변

    1

    로깅을 추가하거나 일부 코드 블록을 제거하십시오. 이렇게하면 문제가 발생한 부분을 찾을 수 있습니다. 차이를 들어 이쪽을 봐 :

    What is the difference between Debug and Release in Visual Studio?

    +0

    로깅을 구현했지만 불행히도 문제가 아직 어디에 있는지 알 수 없었습니다. 나는 당신이 그 순간에 권고하는대로 모든 것을 벗기려고 노력할 것이다. 디버그/릴리스 차이점을 보면 응용 프로그램이 MSVC 디버거가 아닌 수동으로 실행될 때만 문제가 발생하는 이유가 궁금합니다. 최적화로 인해 발생할 수 있습니까? – nijansen

    +0

    로깅을 사용할 때 문제의 원인이 무엇인지 모르거나 이진 검색 규칙을 사용하는 경우 : 코드 중간에 로깅을 추가하고 나타나는지 확인하십시오. 그렇다면 전반부에 로깅을 추가하십시오. 또한 릴리스 프로젝트에 디버깅 정보를 추가하고 디버거에서 시작하고 최적화를 비활성화 할 수도 있습니다. – marcinj

    1

    디버그 EXE 파일의 크기가 다른 이유 릴리스 모드에서 최적화가 최적화를 사용하지 않습니다. 또한 사용 된 라이브러리는 동일한 코드 외에도 다릅니다. 당신은 최적화 옵션을 해제하여 디버그와 같은 릴리즈를 만들 수 있습니다.