'codevania'에 해당되는 글 43건

  1. 2010.12.03 Set a Thread Name in Native Code
  2. 2010.12.03 Break when an exception is
  3. 2010.12.03 Visual Studio 2010 겨울밤 세미나 - 첫번째 밤
  4. 2010.11.23 Remote Debugging
  5. 2010.11.23 G-Star 후기
  6. 2010.11.17 마일스 사운드 버그 3
  7. 2010.11.02 IsNaN
  8. 2010.10.28 intrin.h errors
  9. 2010.10.27 using namespace std;
  10. 2010.10.26 #include <windows.h>
Tip2010. 12. 3. 16:14

방법은 이 곳을 참조
http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx


위 링크에서 만든 함수의 이름은 SetThreadName이다.
문제는 금방 생성한 스레드에 대해서 SetThreadName을 호출하면,
 스레드의 이름이 설정될 때도, 그렇지 못할 때도 있다는 것이다.

스레드의 이름을 설정하는 것에는 SetThreadName이 호출되는 시점이 매우 중요하다.
스레드가 정말 생성된 시점에서 SetThreadName을 호출하지 않으면 스레드 이름 설정이 안된다.
왜냐하면 스레드 생성 함수를 사용한다고 해서, 바로 스레드가 만들어 지는 것이 아니기 때문이다.


그래서 어떻게 해야된다는 말인고 하니...
이렇게 하면 안되고~

이렇게 해야 한다는 말이다.

'Tip' 카테고리의 다른 글

SEH  (0) 2011.03.31
Rvalue References and Perfect Forwarding  (0) 2011.01.12
Remote Debugging  (0) 2010.11.23
IsNaN  (0) 2010.11.02
Failed to create .NET Frameworks PropertyGrid component  (0) 2010.08.20
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
Review2010. 12. 3. 15:28

어제 세미나 갔다 왔습니다.
MS 세미나는 지식 공유는 거의 없고 뭘 계속 사라고만 해서 왠만해선 잘 안 갔었는데,
MS Visual C++ MVP에다가 온라인 상에서 활발한 활동을 펼치시고 계시는 최흥배님께서 마이크를 잡으셨다고 해서 한 번 가봤네요.

강연 주제는 크게 3가지로 나뉘어졌습니다.
- Visual Studio 2010으로의 IDE Upgrade시에 발생하는 문제점들
- Visual Studio 2010 IDE의 편리한 기능
- C++0x 추가된 키워드 및 라이브러리 소개

강의 내용은 꽤 좋았습니다. 두 번째 밤도 완전 기대됩니다!!

다음 세미나는 11월 16일 목요일에 있습니다. 관심 있으시면 참가해보는 것이 어떨까요?
https://msevents.microsoft.com/CUI/Register.aspx?culture=ko-KR&EventID=1032470468&CountryCode=KR&IsRedirect=false


자세한 내용은 최흥배님의 블로그와  VS2010 팀블로그 참조.
여기선 간단히 요약 정리만.

Visual Studio 2010으로의 IDE Uprade 시에 발생하는 문제점들

  1. WIN32_WINNT
    1. 디파인되어 있지 않다면 디파인 해주면 됨
    2. #ifndef ~ #endif 사용하란 말
  2. /MAPINFO:LINES
    1. 의미 없어진 컴파일 옵션
    2. 지우면 됨
  3. time_t
    1. 사이즈 변환: 4BYTE -> 8BYTE
    2. 포인터로 사용한다면 주의 요망
  4. MiniDump
    1. 예외 처리시 try/catch 구문 내에서의 MiniDump 남기는 루틴이 동작하지 않음
    2. Exception Translator 설정 관련 문제라고 함
    3. Google Breakpad 라는 것을 사용한다고 하심
    4. 근데 우리겜은 try/catch로 하진 않으니까 일단 패스
  5. TR1
    1. tuple관련 문제.
    2. 최신 버전 받아서 사용하세요

 

MSVS 2010 IDE의 편리한 기능

  1. Multi-Monitor 지원
    1. 파폭이나 크롬 웹 브라우저 처럼 파일 탭이 IDE에서 분리 가능
  2. Box Selection
    1. 이거 괜찮은 거 같음ㅋ
  3. Navigate To
    1. VA의 Alt + G와 동일
  4. Temp Project
    1. 저장할 필요없는 프로젝트 생성 가능
  5. 시작 페이지 설정 가능
    1. 나만의 시작 페이지 만들기
    2. 자주 여는 프로젝트 설정
    3. 보고 싶은 탭, 링크 설정
  6. VisualStuio Gallary
    1. Products and Extensions for Visual Studio
    2. 아 이거 대박. 마치 파폭의 플러그인 같음.
    3. 추천하신 것들
      1. PowerCommands
      2. ItaStartPage
      3. Productivity Power Tools
      4. Microsoft All-In-One code Framework

C++0X

 키워드  내용 
 auto  Iterator때 편리. But, unsigned/signed 구별 잘 못함
 decltype  편리함. Template시에...
 static_assert  정확성. 컴파일 단계 어서트. 부스트에 있는 것과 동일
 Rvalue Reference  성능
 Lambda  표현력. auto에 할당해서 사용. boost::bind보다 뛰어난 성능
 NullPtr  정확성
* 자세한 내용은 "Visual C++ 10과 C++0X"라는 단행본(최흥배) 참조


추가적인 내용들...

병렬 프로그래밍을 위한 Concurrency Runtime을 사용하자.
Concurrency Runtime (ConcRt)
    - Concurrent Collections
        - 큐랑 벡터 존재. 와우!
    - Concurrent Algorithms
        - 이미지 처리 같은거 아니면 잘 쓰이기 힘들다
    - Synchronous Agents Library
        - 범용적 사용 가능
ConcRt 사용하면
    - 추상화, not Thread but Task, avoid Lock, extendable memory allocator...


'Review' 카테고리의 다른 글

G-Star 후기  (0) 2010.11.23
프로그래머의 길, 멘토에게 묻다  (0) 2010.09.11
Posted by codevania
Tip2010. 11. 23. 18:10

봄공책에 적었던 내용을 옮겨 본다.

내 PC에서는 잘 되는데, 디자이너나 기획자의 PC에서는 비정상 동작을 할 경우가 있다.
무턱대고 로그를 기록하기도, 다른 사람의 PC에 비쥬얼 스튜디오를 설치하기도 부담스럽다.
이때 리모트 디버깅을 하면 편하게 원격 PC의 실행파일을 디버깅 할 수 있다.
리모트 디버깅에는 두 가지 타입이 있다. "실행중인 프로세스에 어태치"하는 것과
 "프로세스를 실행"하는 것인데, 보통 첫번째 방법이 많이 쓰이고 웹상에 설명도 많다. 두 가지 방법 모두 Remote-side와 Client-side에서 설정해 줘야할 몇가지가 있는데 그것들을 알아보자.


[ Remote-side ]
MSVS를 사용하든, WinDbg를 사용하든 아래의 설정을 해줘야 한다.

  1. 디버깅하고자 하는 원격 컴퓨터에 remote debugging을 위한 파일들을 준비한다.
    1. Microsoft Visual Studio 8/Common7/IDE/Remote Debugger/x86 또는,
    2. Microsoft Visual Studio 8/Common7/IDE/Remote Debugger/x64 중에
    3. Remote의 OS 맞는 폴더의 파일들을 원격 컴퓨터에 위치시킨다. 
  2. 폴더 안 파일 중에 msvsmon.exe라는 파일을 실행시킨다.
    1. 메뉴>도구>옵션
      1. 컨트롤 설정: 인증 안함 > 모든 사용자가 디버깅할 수 있도록 허용
        (인증 모드도 가능함. 여기선 인증 안함을 선택)
      2. 서버이름을 클라이언트에게 알려준다. 세미콜론(:) 앞에까지가 서버이름임.
  3. 디버깅하고자 하는 어플리케이션(이하 디버기)의 폴더를 공유시킨다
    1. 실행파일과 PDB의 공유 때문임
    2. Client-side 심볼 설정시 경로 필요
    3. 동일한 PDB를 가지고 있다면 폴더를 공유시킬 필요는 없음

[ Remote-side 2 ]
"CODEVANIA-DEV"가 Remote server name이다.



처음에 언급했던 두 가지 방법 모두를 설명한다. 원하는 방법 하나를 택하면 됨.

[ Client-side ]
공통으로 PDB파일의 경로를 설정해 줘야함

  1. MSVS 실행
  2. 메뉴>도구>옵션>디버깅>기호
    1. \\원격 컴퓨터 ip\디버기가 위치한 원격 컴퓨터의 공유 폴더 이름
      예) \\192.164.0.1\Play
    2. \\원격 컴퓨터 이름\디버기가 위치한 원격 컴퓨터의 공유 폴더 이름
      예)\\CODEVANIA-DEV\Play
    3. 동일한 PDB를 가지고 있다면, 꼭 Remote의 경로로 설정할 필요는 없다.




[ Client-side : 실행중인 프로세스에 어태치 ]

  1. 메뉴>디버그>프로세스에 연결
    1. 전송: 원격
    2. 한정자: [Remote-side 2.1.2]에서 획득한 서버이름
    3. '새로고침'하여 디버깅하고자 하는 어플리케이션에 Attach & 디버깅  :)




[ Client-side : 프로세스 실행 ]

  1. 프로젝트>프로퍼티>디버깅
  2. Debugger to launch -> Remote Windows Debugger
    1. Remote Command: Remote PC상의 디버깅하고자 하는 바이너리 경로
    2. Remote Server Name: 리모트 서버 이름
    3. Connection: 리모트 서버에서 설정한 것과 동일하게 맞춤
    4. Attach: Yes로 하면 바로 위의 [ Client-side : 실행중인 프로세스에 어태치 ]와 동일함
    5. 설정 저장 후 F5 눌러서 디버깅  :)




참조: Project Settings for a C++ Debug Configuration

'Tip' 카테고리의 다른 글

Rvalue References and Perfect Forwarding  (0) 2011.01.12
Set a Thread Name in Native Code  (0) 2010.12.03
IsNaN  (0) 2010.11.02
Failed to create .NET Frameworks PropertyGrid component  (0) 2010.08.20
Access Violation 발생시 무사히 빠져나오기  (2) 2010.08.20
Posted by codevania
Review2010. 11. 23. 18:07

스펙
◆ 파워 서플라이
- 10의 전력을 필요로 하는 스펙에 8의 전력을 제공하는 저급 서플라이를 맞춤
- 서플라이도 엄연히 컴터의 일부. 기본 스펙은 맞춰줘야 함.
- 때문에, 스킬 이펙트와 같이 많은 연산이 순식같에 필요해 지는 상황에서 셧다운

◆ 디스플레이 복제
- 디스플레이를 복제하여 외부장치에서 게임 플레이를 보여준 PC에서 렌더링 버그 발생
- G-Star에 대한 경험이 있었다면, 이런 상황에 대해서 미리 테스트를 해봤을 텐데.


인테리어
◆ 통풍
- 3 방향이 막힌 인테리어. 통풍불가.
- 너무 더워서 쾌적하지 못한 환경을 제공했습니다. 찾아주신 분들에게 죄송.
- 온도 문제로 그래픽카드에 문제가 생길 것을 염려(-_-;)해서 생쇼를 하기도...
- PC의 리붓, 환기, 휴식 등은 사실 쌩쑈가 아니었을까...
 
◆ 디스플레이
- 보이지 않는 곳에 비싼 디스플레이를 설치
- 모두 부스 밖에서 대기중. 부스 안에는 플레이중인 유저뿐.
- 존재하지도 않았던 "부스 안에서 대기중인 유저"를 위한 인테리어


운영
◆ 동영상 V.S. 플레이
- 게임 플레이 후에 동영상을 관람하는 방식의 진행
- 동영상을 먼저 봤다면, 게임에서 어떤 것들이 가능한지를 알 수 있었을 듯.
- 동영상에서 호기심을 유발하고 게임에서 그것을 해소하는 식의 진행이었다면 어땠을까?
 
◆ 게임 설명
- 게임 설명서 색상 선택 실패.
- 어두운 색상의 배경과 어두운 색상의 글로 된 설명서가 어두운 부스 안에 배치.
- 캐릭터 마다 분배되는 히어로 스킬과 부대 스킬이 다르지만, 모든 자리의 설명서는 동일했고 스킬 설명은 없었음.
- 인터페이스와 같은 설명들은 플레이메이트들이 구두로만 설명해 줘도 됨
- 게임 특유의 시스템은 뭔가 알기 쉽게 설명이 되어 있었어야 했음.


프로그램 
◆ 콜스택
- 어서트, 크래쉬 시에 콜스택 기록하는 기능은 이미 존재
- 하지만, G-Star용 빌드에서는 이 기능이 무효한 상태. ㅜㅜ왜?
- G-Star용이라고 하더라도, 실행파일과 PDB가 유출되지 않도록하고,
   G-Star동안의 어서트, 크래쉬 등의 소중한 정보들을 얻었으면 좋았을 듯.
 
◆ 플레이 로그
- 인기 스킬 카운트. 어떤 스킬이 어떤 상황에 유리한가?
- 부대 컨트롤 유무. 부대가 유용한가? 부대 컨트롤이 가능한가?
- 콤보 사용 유무. 콤보가 유용한가?
- 등등, 모든 컨트롤에 대해서 로그를 기록했다면 좋았을 듯.

'Review' 카테고리의 다른 글

Visual Studio 2010 겨울밤 세미나 - 첫번째 밤  (0) 2010.12.03
프로그래머의 길, 멘토에게 묻다  (0) 2010.09.11
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
Tip2010. 11. 2. 15:30

Not a Number인가?...를 검사하기 위해서 몇 가지 방법이 있다.

1번 방법의 경우 컴파일러 최적화를 피하기 위한 꽁수도 있다. (volatile 이용. Link1)

STL를 이용한다면 두가지 버전의 함수가 제공되는데, (Link2)
예외를 얻어야 할 땐 signaling_NaN, 예외를 무시하고 싶을 땐 quiet_NaN을 사용하면 된다.
(STL에는 throw() 가 둘 다 적혀있긴 한데... -_-)

Link1. Portable Functions to Check for NaN and Infinity
Link2. What is a NaN?
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