Tip2011. 3. 31. 03:25

SEH

Structured Exception Handling

자세한 설명은 아래 링크들을 참조.
여기서는 Windows Exception이 발생했을 때...
등록된 콜백함수의 파라미터를 이용해서 예외가 발생한 지점의 파일과 라인을 출력하는 예제를 보여준다.
말 그대로 그냥 예제... -_-;

예제


출력
[ main - 1 ]
[ TranslateSEHtoCE - 1 ]
Symbol name: main
FileName:d:\programming\mytest2010\mytest2010\mytest2010.cpp (Line:125)
[ main - 4 Access Violationn ]


링크
* serious-code: SEH
* 엘키님 블로그: 여기 예제 코드의 전신
* MSDN: Initializing the Symbol Handler
* MSDN: Retrieving Symbol Information by Address

'Tip' 카테고리의 다른 글

Rvalue References and Perfect Forwarding  (0) 2011.01.12
Set a Thread Name in Native Code  (0) 2010.12.03
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
Tip2011. 1. 12. 12:29


자세한 건...
http://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html

링크 내용중 일부

X x;
X& lref = x;
          // bind lvalue reference to object: fine
X&& rref = x;       // bind rvalue reference to object: fine too.
X&& rref2 = lref;  // bind rvalue reference to lvalue ref: fine
X& lref2 = X();     // bind lvalue reference to temporary (rvalue): error
X&& rref3 = X();  // bind rvalue reference to temporary (rvalue): fine, extends lifetime of temporary

'Tip' 카테고리의 다른 글

SEH  (0) 2011.03.31
Set a Thread Name in Native Code  (0) 2010.12.03
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
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
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
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
Tip2010. 8. 20. 19:36

프로젝트 속성창을 열면 이런 에러가 날 때가 있다.


몇 가지 방법이 나오는데...
Visual Studio와 관계된 문제라면 다음이 답이다.
http://social.msdn.microsoft.com/Forums/en-US/vssetup/thread/7fb640d4-919e-4f43-8c78-bbb90e4544e3



devenv.exe /ResetSkipPkgs

'Tip' 카테고리의 다른 글

Set a Thread Name in Native Code  (0) 2010.12.03
Remote Debugging  (0) 2010.11.23
IsNaN  (0) 2010.11.02
Access Violation 발생시 무사히 빠져나오기  (2) 2010.08.20
코딩 도우미 Visual Basic Macro  (0) 2009.10.13
Posted by codevania
Tip2010. 8. 20. 18:47

디버깅을 하다보면 Access Violation이 가끔 일어나곤 하는데,

디버깅을 종료하지 않고 벗어나는 방법이 있다.

Line1] Player* pPlayer = GetPlayerMgr()->GetPlayer( Id );
Line2] pPlayer->GetOwnPlayer();

만약 Line1에서 pPlayerNULL이라면 Line2에서는…

이렇게 First Chance Exception 경고창이 뜨게 된다.



디스어셈블리창으로 보면 (0 + 0E78h)주소에 접근하기 때문임을 알 수 있다

접근을 하지 않고, 이 함수를 호출하기 전으로 돌아가면 Access Violation을 피할 수 있다.

그럼 어떻게 호출전으로 돌아갈까?


아래 빨간 박스는 모든 함수마다 존재하는 구문이다. (노란화살표 바로 아래 부분: 016A75F5~016A75FB)

콜스택을 초기화 하고, 각종 레지스터를 함수 호출 전의 상태로 돌린다.

Instruction Pointer를 변경하면 문제끝!!



IP를 바꾸는 것은 Menu>Debug>Windows>Registers에서 쉽게 변경 가능하다.



IP를 바꾸는 더 쉬운 방법은...

마우스 우클릭>Go To Disassembly> Set Next Statement

'Tip' 카테고리의 다른 글

Set a Thread Name in Native Code  (0) 2010.12.03
Remote Debugging  (0) 2010.11.23
IsNaN  (0) 2010.11.02
Failed to create .NET Frameworks PropertyGrid component  (0) 2010.08.20
코딩 도우미 Visual Basic Macro  (0) 2009.10.13
Posted by codevania
Tip2009. 10. 13. 11:44
Main Feature
- rtEnvMgr
클래스, 헤더 등의 파일을 생성하고 기초 코드 삽입
Solution Explorer- Track Current File,  Collapse All Files
Scroll Half Page
Vertical Tab Management
- rtMetaClass
클래스, 헤더 등의 파일을 생성하고 기본 코드 삽입
- rtMetaCode
정렬: 대입문, enum문, Function, FunctionCall, 변수
생성: Getter/Setter, InitializeList
- rtConvert
Enum을 문자열로
Enum을 케이스문으로
/ <-> \ 간의 변환
#include "aaa.h" <-> #include <aaa.h> 간의 변환
다운로드 (Programming/Macro.vsmacros를 다운 받으세요)



[ Figure1. BeautifyAssignment ] Ctrl+Alt+B, Ctrl+Alt+A


[ Figure2. EnumToString ] Ctrl+Alt+V, Ctrl+Alt+E
 
% 단축키는 VS옵션의 '키보드'에서 원하는 단축키를 할당해야 합니다.


See Also

제가 작성한 매크로는 아래 두 분의 매크로를 참조했습니다.

serious-code
Oranze

'Tip' 카테고리의 다른 글

Set a Thread Name in Native Code  (0) 2010.12.03
Remote Debugging  (0) 2010.11.23
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