Troubleshooting2011. 8. 3. 00:17

다음과 같은 상황을 의심해 보자.
숫자가 낮을 수록 발생 확률이 높을 것으로 예상한다.


1. map/set의 iterator를 그 map/set의 복사본의 begin()/end()와 비교한 것은 아닌가?
2. const iterator 와 iterator를 비교하고 있나?
3. 공유자원인 map/set의 스레드간 동기화가 잘 되고 있나?
Posted by codevania
Troubleshooting2011. 3. 15. 15:41


VS2010 SP1이 나와서 깔았더니 왠 -_-;;;
아래 링크의 내용을 참조하자~

Tim Odell's Blog
Mike Kaufman's reply


Odell의 블로그 내용은 너무 말이 많다ㅋ
Mike가 시키는 데로 하면된다.

... 하지만 왜 언인스톨을 해야하지 -_-;;;
MS 밉다 -_ㅜ
Posted by codevania
Troubleshooting2011. 1. 11. 12:26
비쥬얼 스튜디오 실행시, IDE는 뜨지도 않고 에러 다이얼로그 박스만 뜨는 경우가 생겼다.
아래와 같은 메세지의 에러 다이얼로그 박스가 뜨는데...

[ KOR ]
- devenv.exe - 시작 지점 없음
- 프로시저 시작 지점 wmemcpy_s을(를) DLL MSVCR100.dll에서 찾을 수 없습니다.

[ ENG ]
- devenv.exe - No entry point
- The procedure entry point Wmemcpy_s could not be located in msvcr100.dll

발생 원인은 다음과 같은 것들이 있었다.
- DVD설치가 아닌 '제어판/프로그램/프로그램 가져오기'에서 설치 -> (Install SP1) -> execute 'devenv'
- Install Ultimate -> Uninstall Ultimate -> Install Premium(or Professional) -> (Install SP1) -> execute 'devenv'

해결방법은...
- 괜히 다른 것들 삭제할 필요없다. 프로그램 제거에서 'VS 2010'만 삭제 후 -> 리붓 -> VS 2010 재설치
- 재설치 해도 안 될 때, C:/windows/system32/MSVCR100.dll을 $(VSInstallDir)/Common7/IDE에 복사

'Troubleshooting' 카테고리의 다른 글

map/set iterators incompatible  (0) 2011.08.03
Resolving BootstrapPackage Load Error: Visual Studio 2010  (0) 2011.03.15
Conversion from VS2005 to VS2010  (0) 2010.12.14
Break when an exception is  (0) 2010.12.03
마일스 사운드 버그  (3) 2010.11.17
Posted by codevania
Troubleshooting2010. 12. 14. 12:24
발생했던 문제점들에 대한 해결 방법들을 공유합니다.

- boost
    - 1_44_0으로 갈아탐

- 변환시 vcproj 패스 설정 오류
    - Property Manager > Common Properties > User Macro의 경로중 하나가 잘못 컨버팅되서 재조정.
    - Ex) D:XXX/YYY/ZZZ/ZZZ 처럼... 2010으로의 자동 변환 후에 ZZZ가 두번 들어가 있었음.

- vs2010 error C2039: 'back_insert_iterator'
    - 인클루드 코드 삽입: #include <iterator>
    - PCH에 넣어도 되고, 에러가 난 파일의 헤더에 넣어도 되고~
   
- warning MSB8012: TargetPath does not match the Library's OutputFile property value
    - 이름을 맞춰줌
        - Property Page > Configuration Properties > General - Target Name과 Target Extension
        - Property Page > Configuration Properties > Librarian > General - Output File
    - http://blog.kalmbach-software.de/2010/04/27/converting-vc-projects-to-vc2010-warning-msb8012/
   
- Constructor for class 'Foo' is declared 'explicit'
    - 참조나 포인터가 아닌 객체로 함수의 인자가 되는 경우, 복사 생성이 암시적으로 발생하는데...
    - 복사생성자가 explicit으로 되어있을 경우, 2010에서는 error처리를 해준다. 땡큐!
    - 2010전에는 이것을 error로 처리 안 해줘서 그냥 넘어갔었고, 그래서 잘못된 것인지도 몰랐던거임. -_-;
   
- queue
    - queItems.c.clear()를 사용하고 있는 코드 발견 -_-;;;
    - Queue에 swap이 없긴 하지만, 저런식의 사용은 안 좋다고 본다.
    - 다른 방식으로 clear 할 수 있다
        - queItems.swap( queue<int>() ); 
        - std::swap( m_InfoQue, queue<int>() );

- warning MSB4011:
    "D:\XXX\XXX-Props\KUF2_PhysicalPath.props" cannot be imported again.
    It was already imported at
    "D:\XXX\XXX-Props\KUF2_Paths.props (4,5)".
    This is most likely a build authoring error. This subsequent import will be ignored.
    - Property Manger를 열어서 경고가 뜬 프로젝트의 Property Sheet 참조를 확인 해본다.
    - 이 경우는 임포트가 두 번 되어서 무시하겠다는 건데, 삭제 해주니 해결되었음.

- error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL’: value ‘0′ doesn’t match value ‘2′
    - http://stackoverflow.com/questions/4130044/what-does-iterator-debug-level-1-mean
         _ITERATOR_DEBUG_LEVEL = 0 (in release mode)
        _ITERATOR_DEBUG_LEVEL = 1 (in release mode if _SECURE_SCL is defined)
        _ITERATOR_DEBUG_LEVEL = 2 (in debug mode)        
    - http://blogs.msdn.com/b/vcblog/archive/2009/06/23/stl-performance.aspx
   
- #error _ITERATOR_DEBUG_LEVEL == 2 must imply _HAS_ITERATOR_DEBUGGING == 1 .
    - 코드가 아닌 곳에 디파인 되어 있을 수 있는데, 다음 2가지 경우가 있음.
      텍스트 검색으로 _HAS_ITERATOR_DEBUGGING을 찾아서 수동으로 변경.
        - 프로젝트 파일에 _HAS_ITERATOR_DEBUGGING이 0으로 디파인되어 있는 경우.
          Property Page > Configuration Properties > C/C++ > Preprocessor - Preprocessor Definitions
        - *.props 파일에 디파인되어 있을 수 있음.
        - Runtime Library가 일치하지 않는 프로젝트가 존재할 수 있음.
   
- XXX.lib(xxx.obj) : error LNK2019: unresolved external symbol
    - Menu > Project > Project Dependencies - 여기서 체크박스만 해주면 안되네;;
    - Menu > Project > Properties > Common Properties - Framework and References에서 Add New Reference... 눌러서 추가해 줘야함.
   
- 외부 라이브러리 2010으로 리빌드하면서 MSB8012 경고 잡아주기
    - yaml
    - loki
    - squirrel
    - sqplus

- libcpmtd.lib(xdebug.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
    - Ignore Specific Default Libraries에 libcmt.lib 추가
    - 지금까진 libcmt를 무시하라는 에러메세지가 뜬다고 해도 다른 방법으로 해결했었는데, 이번엔 잘 모르겠음;; 그냥 추가;;
    - Properties > Configuration Properties > Linker > Input - Ignore Specific Default Libraries
   
- warning C4717: 'SquirrelObject::Set<SquirrelObject>' : recursive on all control paths, function will cause runtime stack overflow   
    - 템플릿 매치 우선순위에 대한 문제였습니다.        
        - http://stackoverflow.com/questions/4427683/template-functions-priority-is-diferent-between-vs2005-and-vs2010
        - VS2005와 VS2010에서의 결과가 다릅니다.
        - Foo(const Foo&); ? Foo(Foo&) 로 변경해서 해결
    - 어쨌든 좀 혼란스러운 점이 있는데, 이를 C++ committee에서 곧 결정할 것이고, VS2010에서 이를 바로 반영한다고 합니다.

- :VCEnd" exited with code 1.
    - Exit code 1 indicates ~~~ path is not correct.
    - Post-Build Event에서 copy 명령이 있는데, 거기서 문제 발생.
    - 1이라는 말은 경로가 잘 못되어 있다는 말임. 경로 바꿔주고 해결.
    - 위에 기술된 warning MSB8012을 해결하기 위해서 경로들을 바꾸다 보니 발생했음.   

- LINK : fatal error C1047: The object or library file 'D:\XXX\YYY\ZZZ.lib' was created with an older compiler than other objects; rebuild old objects and libraries
    - ZZZ.lib 또는 ZZZ.lib가 쓰는 xxx.lib가 2010에서 빌드된 lib이 아니란 말.
    - 해당 라이브러리 빌드하면 해결됨.


[ 참조 ]

- Visual Studio 2010 C++ Project Upgrade Guide
    - http://blogs.msdn.com/b/vcblog/archive/2010/03/02/visual-studio-2010-c-project-upgrade-guide.aspx

- VS2010의 새로운 기능
    - 한: http://msdn.microsoft.com/ko-kr/library/dd465215.aspx
    - 영: http://msdn.microsoft.com/en-us/library/dd465215.aspx

- auto 사용
    - 추가 옵션 창에서 설정해 줘야함
    - Menu > Project > Properties > Configuration Properties > C/C++ > Command Line
        - Additional Options에서 다음을 입력 ( /Zc:auto )
    - ...하지만 설정 안 해줘도 됨 -_-; /Zc:auto- 하기 위해서는 설정해야할 것 같음.
    - http://msdn.microsoft.com/en-us/library/dd293615.aspx

- XP를 지원하기 위해 _WIN32_WINNT는 0X0501으로 정의
    - http://msdn.microsoft.com/en-us/library/aa383745(v=vs.85).aspx

- Tools > Options > Projects and Solutions > VC++ Project Settings - Build Timinig의 정보가 좀 더 자세하게 변경되었음
Posted by codevania
Troubleshooting2010. 12. 3. 16:05
프로그램 실행중 갑자기 아래와 같은 에러 메세지를 내뱉는다면?
This Application has requested the Runtime to terminate it in an unusual way.
즉, 이런 다이얼로그 박스 말이다.


이 때 아마 난감할 것이다. 왜냐면 콜스택이 깨져있으니 말이다.


이런 상황은 십중팔구 abort() 때문인데, 왜 이렇게 되는지는 여기(날개의 기억)를 참조하도록 하자.


이때는 "Exception" Dialog에서 설정을 하면 예외 발생의 First chance에서 바로 잡을 수 있다.

- Menu > Debug > Exceptions... (Ctrl + Alt + E)
   아래 C++ Exceptions를 체크해 준다


- 이제부터는 그냥 디버깅 하다보면, 예외 발생시 브레이크 할 수 있다.
  그리고 우리가 원하는 예외 발생 시점에서의 콜스택을 얻을 수 있다.
  문제 해결 후에는 꺼주자... 아무래도 이게 활성화 되어있으면 좀 더 느려지겠지 ㅎ




'Troubleshooting' 카테고리의 다른 글

The procedure entry point Wmemcpy_s could not be located in msvcr100.dll  (0) 2011.01.11
Conversion from VS2005 to VS2010  (0) 2010.12.14
마일스 사운드 버그  (3) 2010.11.17
intrin.h errors  (0) 2010.10.28
using namespace std;  (0) 2010.10.27
Posted by codevania
Troubleshooting2010. 11. 17. 23:37
일주일 전쯤...
게임 실행중 알 수 없는 문제로 크래쉬가 발생했다. 100%재현이 안되고 특정 컴터에서만 발생하는 것도 아니었다.
어떻게 재현해야할까 고민하는 중에 내 PC에서 동일하게 보이는 문제로 크래쉬 발생!!
하지만 콜스택은 이미 깨져버린지 오래되었는지, assert가 여러번 누적 되어있었다. assert의 파일명 변수의 값은 파일명이 아니라 이상한 메모리를 참조하고 있는것이 아닌가?
VS의 Ctrl+Alt+E(How To: Break When an Exception is Thrown)도 소용없었고, Application Verifier(고객지원|댜운로드)도 First chance에서 잡아내진 못했다. 사운드 프로그램 담당자에게 부탁해 빠알리 마일즈쪽에 문의 메일을 보내라고 했다...
이것이 내가 잘못한 부분이다. 문제가 되는 부분은 찾았지만, 문제를 어떻게 해결할지는 생각하지 않았다. 간헐적으로 터지는 문제라 다른 더 중요한 크래쉬들을 해결하면서 이 문제를 잊어버렸다.

마감이 임박해지자 이 문제의크래쉬가 계속 터지는 것이다;;; 마일즈 쪽에서의 답은 없고, 마냥 기다릴 수도 없는 상황이었다. 울팀의 실력 좋은 sonee가 자기 이슈를 모두 처리하고 다른 사람들 여럿과 같이 플레이하여 이 사운드 문제를 잡아버렸다. 혼자 조용히 해결해 버리는 나 같은 스타일과는 다르게 그리고 빠르게 문제를 해결했다.

우선, 문제의 원인은 동시에 처리 가능한 사운드의 수였다. 64개를 넘어가는 상황이었고, 이때 버퍼 오버런이 된 것이라 조심히 추측해본다.

해결과정은 간단하지는 않았다. 사운드 재생 요청마다 어떤 파일에 대한 것인지 로그를 남기자 그 유명한 하이젠버그가 발생했다. 아무리 테스트를해도 크래쉬가 발생하지 않는 것이었다ㅋㅋㅋ 이사님께서 "한번 요청오면 백번으로 요청해봐" 라고 하셨다. ㅋㅋ정말 괜찮은 방법 아닌가?! 물론 백번대신 열번으로 요청했었다. 동시간대에 재생된 사운드의 수를 세아려봤고, 64개라고 가정한 뒤에는, 64개 초과 요청이 문제라는 것을 밝히는데 전력을 다했다. 그리곤 현재 재생중인 사운드의 카운트를 얻어와서 64개 초과 요청에 대해서는 무시를 했고, 그렇게 이 골치 아팠던 문제는 해결되었다.

재현이 잘 안되는 버그는 재현 횟수를 늘리면된다. 두명이서 플레이하면 같은 시간동안 혼자로 플레이 하는 것보다 두배로 태스트 할 수 있다. 그리고 혼자 보다는 여럿이 도움이 된다. 단 사공은 하나야하겠지...

'Troubleshooting' 카테고리의 다른 글

Conversion from VS2005 to VS2010  (0) 2010.12.14
Break when an exception is  (0) 2010.12.03
intrin.h errors  (0) 2010.10.28
using namespace std;  (0) 2010.10.27
#include <windows.h>  (0) 2010.10.26
Posted by codevania
Troubleshooting2010. 10. 28. 14:44
Windows SDK를 설치하고 나니 아래와 같은 컴파일 에러 발생 -_-;

2>D:\Program Files\Microsoft Visual Studio 8\VC\include\intrin.h(944) : error C2733: second C linkage of overloaded function '_interlockedbittestandset' not allowed
2>        D:\Program Files\Microsoft Visual Studio 8\VC\include\intrin.h(944) : see declaration of '_interlockedbittestandset'

error C2733: second C linkage of overloaded function '_interlockedbittestandset' not allowed
see declaration of '_interlockedbittestandset'

VS의 Directory설정에 Windows SDK가 추가되어 있길래 구글링을 해보니...
intrin.h 파일을 열어서 Comment Out 하란다...;;



'Troubleshooting' 카테고리의 다른 글

Break when an exception is  (0) 2010.12.03
마일스 사운드 버그  (3) 2010.11.17
using namespace std;  (0) 2010.10.27
#include <windows.h>  (0) 2010.10.26
numeric_limits problem with windows.h  (0) 2010.07.27
Posted by codevania
Troubleshooting2010. 10. 27. 16:21
누가 PCH에 using namespace std;를 해논 것이다;;;
개인적인 의견으로는 헤더에 using namespace를 사용하는 것 보다는
cpp 파일에 using 지시자를 사용하는 것이 맞다고 본다.
헤더에 using namespace를 사용하면 이름이 꼬일 수가 있기 때문이다.

코드로 보자면...
처럼 헤더 파일에서 사용하는 것이 아니라
로.. 그 cpp에서 딱 사용할 클래스 또는 함수만 using으로 사용하는 것이다.


정규식을 사용해서 std 넴스풰이스를 붙여보자.
Find what    : {[ \t]}{(list|vector|map)}\<{[^\>]+}\>
Replace with : \1std::\2<\3>


string의 경우 일반적인 STL 함수/클래스들과는 따로 하는 것이 좀 더 편하다.
Find what    : {[ \t]}string{[ \t]}
Replace with : \1std::string\2

결론: 제공되는 클래스 이름과 동일한 변수명은 쓰지 말자... =ㅁ=;;

'Troubleshooting' 카테고리의 다른 글

Break when an exception is  (0) 2010.12.03
마일스 사운드 버그  (3) 2010.11.17
intrin.h errors  (0) 2010.10.28
#include <windows.h>  (0) 2010.10.26
numeric_limits problem with windows.h  (0) 2010.07.27
Posted by codevania
Troubleshooting2010. 10. 26. 22:23

BOOL WINAPI IsDebuggerPresent();  를 사용하기 위해 windows헤더를 인클루드 했건만,
계속해서 C3861(identifier not found)에러가 나는 것이었다.

디파인도 잘 해줬고,

사용도 잘 해줬는데


도대체 머가 문제지??

... 서버팀 동료한테 헬프 요청해서 같이 보는데...앗!!
winsock2가 _WIN32_WINNT 선언보다 위에 선언되었던 것이었다.


적절히 고치면...


결론. 인클루드 전에 요구되는 디파인은 인클루드 전에 모두 해놓자.


[ 관련된 재미난 링크들 ]
IsDebuggerPresent MSDN
성태의 닷넷 이야기 - IsDebuggerPresent
Noenemy's Code Foolosophy - TIB와 IsDebuggerPresent

'Troubleshooting' 카테고리의 다른 글

Break when an exception is  (0) 2010.12.03
마일스 사운드 버그  (3) 2010.11.17
intrin.h errors  (0) 2010.10.28
using namespace std;  (0) 2010.10.27
numeric_limits problem with windows.h  (0) 2010.07.27
Posted by codevania
Troubleshooting2010. 7. 27. 11:50
define에 의한 문제를 해결할 때 참고할 만한 내용이다.

문제는... 아래 코드는 컴파일 되지 않는다는 것이다.
#include <limits>
#include <windows.h>
void main()
{
     std::numeric_limits< float >::max(); 
}
에러 메세지를 보면...
1>d:\programming\test\main.cpp(5) : warning C4003: not enough actual parameters for macro 'max'
1>d:\programming\test\main.cpp(5) : error C2589: '(' : illegal token on right side of '::'
1>d:\programming\test\main.cpp(5) : error C2143: syntax error : missing ';' before '::' 

이유는 windef.h에 정의된 다음과 같이 min, max 가 define되어 있기 때문이다.

#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#endif  /* NOMINMAX */


여기를 보면 3가지 해결 방안이 나온다.

1. 괄호로 싸버린다.
std::numeric_limits< float >::max();   ->  (std::numeric_limits< float >::max)();

2. undefine 해버린다.
#include <limits>
#include <windows.h>
#undef max
void main()
{
    std::numeric_limits< float >::max(); 
}

3. NOMINMAX를 define한다.
#define NOMINMAX
#include <limits>
#include <windows.h>
void main()
{
    std::numeric_limits< float >::max(); 
}


MS MVP님께서 추천하는 방법은 다음과 같다.
#define NOMINMAX
#include <windows.h>
#include <limits>
#include <algorithm>

template< typename T >
inline T max(const T & a, const T & b) { return std::max(a, b); }

template< typename T >
inline T min(const T & a, const T & b) { return std::min(a, b); }

void main()
{
    std::numeric_limits< float >::max(); 
}

'Troubleshooting' 카테고리의 다른 글

Break when an exception is  (0) 2010.12.03
마일스 사운드 버그  (3) 2010.11.17
intrin.h errors  (0) 2010.10.28
using namespace std;  (0) 2010.10.27
#include <windows.h>  (0) 2010.10.26
Posted by codevania