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
Debug2010. 8. 20. 18:35

제목이 좀 거창하게 길긴한데별거 없는 내용이다;;

 

아래와 코드를 보자1 때문에 뭐가 비었으면 그냥 리턴이다.

그런데, 이렇게 1에서 true를 반환해서 3으로 가버리도록 짠 로직이 실수라고 하자.

그러면, 지금 Shift+F5를 눌러서 2으로 가도록 코드 수정 후에 재시작 해야만 하나?

Instruction Pointer를 실시간에 바꿀 수만 있다면 어디서든지 로직의 흐름을 제어할 수 있지 않을까?

해서 알아보았다



일단 코드를 디스어셈블리로 보자


1에서, When Brakpoint Is Hit 다이얼로그를 열어 아래와 같이 설정하면 가능할까?


불행히도, 1에서 IP를 바꿔봤자 소용이 없었다. -_-

하지만, 2에서 EAX의 값을 바꾸면

1번 조건 검사를 무시하면서, 원하는 위치인 3으로 이동 가능하다.


참고로, WBIH는 매우 유용하다. 기본적인 기능이 막강한 것도 있지만

변수에 값을 대입하는 기능 외에도 함수호출도 가능하다는 사실을 아시는지??

반드시 MSDN을 참고해보길 바란다…^^;

 

'Debug' 카테고리의 다른 글

Magic debug values  (0) 2011.09.03
Debug variables about STL  (0) 2011.08.18
Posted by codevania
Code Snippets/Boost2010. 8. 20. 12:54

boost example codes 
  - http://www.kmonos.net/alang/boost/classes/

boost thread examples
  - http://aszt.inf.elte.hu/~gsd/klagenfurt/material/ch03s06.html

The Boost.Threads Library
  Dr.Dobb's의 아티클
  - http://www.drdobbs.com/cpp/184401518;jsessionid=XOBCWNJJ0HSSJQE1GHOSKH4ATMY32JVN

Threading with Boost
  좀 간단한 예제지만, 설명이 자세하다.
  - http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html

Multithreading in C++0x
  tr1에 대한 사용법이지만, std를 boost 네임스페이스로 바꿔서 보면 됨ㅋ
  - http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-1-starting-threads.html

Mutithreading tutorial
  boost::thread 라이브러리에 관한 내용만 있는 것이 아님
  boost::thread 라이브러리를 사용하면서 멀티스레드에 대해 정말 자세히 설명해주고 있다.
  - http://www.paulbridger.com/multithreading_tutorial/

EmptyCrate Software
  thread에 관한 팁 모음
  - http://blog.emptycrate.com/taxonomy/term/38

'Code Snippets > Boost' 카테고리의 다른 글

함수 호출 연기 & 함수 타입 캐스팅  (0) 2010.09.17
Nested Bind  (0) 2010.09.09
Generalized Function Pointers  (0) 2010.09.06
boost::bind 활용  (0) 2010.09.03
Boost Thread  (0) 2010.08.20
Posted by codevania