블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2738)
Unity3D (817)
Programming (475)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
04-29 11:53

일전에 Dependency에 대한 고찰이라는 글로, Dependency의 종류와 xDepend 툴들을 소개한 적이 있습니다.

이번 POST는 윗 글의 연장선상으로 Dependency 를 해결하기 위한 올바른 설계 방법 몇가지를 소개하고자 합니다.

물론 재미난(?) 그래프로 여러분의 시스템의 Depedency를 파악하는 것을 보여드리고 싶지만..  모든 일에는 순서가 있는 법.  여러분이 와 닿는 그림과 코드로 간단히 설명드리도록 하겠습니다.

Dependency가 없는 상태로 시스템을 구축한다는 것은 불가능합니다. 재사용의 미덕이 바로 Dependency의 또다른 이름이기도 하죠.

어떻게 하면 Dependency를 잘 관리할수 있을까?  그 해답을 제시해주신  아키텍트를 소개하고자 합니다.

그 분은 바로 Object Mentor의 Robert C. Martin 입니다.  Clean Code의 저자로써 알려져 있지만, 사실 이것보다  이름을 더 크게 알리게 한 주역은 패턴의 5가지 법칙(OCP, DIP, LIP, ISP, SRP)입니다.

그런데 이 5원칙의 빛에 가려 숨겨진 Principle이 하나 있는데요.  이름하여 패키지 구조의 원칙들(Principles of Package Architecture) 입니다.

이 논문에서 Dependency를 깨거나 완화하는 방법들을 여러분에게 소개하고자 합니다.

1단계: Circular Depedency를 무너 뜨려라

Circular Dependency는 패키지 소프트웨어를 만드는 구조에서 꼭 피해야 되는 구조입니다. 바로 Change Propagation (변화 전파)이 체인을 이루어 구성될수 있기 때문입니다.

여러분의 모듈중 일부분에 변화를 가하면, 다른 것들이 연쇄적으로 체인과 같이 묶여 변화를 한다면 어떻게 될까요?   생각만 해도 무시무시한 일이죠. 결국 그래프를 이루는 모든 모듈에 대해서 검증(테스팅)을 해야 하는 문제가 발생합니다.

Robert C. Martin은 Circular Dependency를 끊는 방법으로 완충작용을 해줄 새로운 Package 생성 또는  Interface 를 통해 변화를 상쇄시키는 방법을권하고 있습니다.

개발자라면 누구나, Try.. Catch문을 걸어서 발생한 오류를 화면에 MessageBox로 뛰워 본 경험이 있을 겁니다.  이렇게 되면 바로 위 그림과 같은 Circular Dependency가 발생하게 됩니다.

이 그림은 통신 모듈에 필요한 에러사항들을 GUI 관련 모듈을 통해 출력하다 보니, 이 세가지가 연관성을 갖게 되는 것입니다.   이러한 관계를 끊기 위해서 Robert C. Martin은 아래와 같이 새로운 Package를 만드는 것을 권고하고 있습니다.

시스템에서 사용하는 모든 메세지(Error 메세지를 포함)를 관리하는 Manager를 별도로 두어,  GUI와 통신 모듈이 한 방향으로 Dependency를 구성해 Circular Dependency를 끊어 버린 경우입니다.

이런 상황에서는  Log4X (NET, J)처럼 Attribute(AOP) 이용해 기존 모듈에 영향을 최소화하거나,  Listener를 이용해 IoC를 구성하는 것도 좋은 방법입니다. (IoC는 뒷부분에서 언급하도록 하죠)

또 다른 형태의  Circular Dependency를 보도록 합시다.

이 것은  두 패키지를 구성하는 내부 모듈들간에  간접적인 Circular Dependency가 생겼습니다.  하지만 Interface를 통해서 완충 장치를 두어 해결한 경우입니다. 이건 그림을 보니 다 아실것이라 생각이 들어서 패스하도록 하죠 :)

2 단계: 무거운 Dependency를 깨뜨리는 무기, IoC (Inversion of Control)

무거운 Dependency라고 해서 읽으신 분이 의아해 하셨을 겁니다.  이 의미는 모듈간에 강력한 결합으로 인하여  쉽게 테스트하거나 확장하기 어려운  상황에 무거운(Heavy) Dependency라고 합니다.

또는 전에 언급했던 Implementation Dependency에서 특정 모듈이 없으면 아예 돌아가지도 않는 상황을 말하는 Hard Dependency라고 봐도 무방합니다.

01 // your API
02 public class Tracer {
03     MessageQueue mq = new MessageQueue(…);
04     public void Trace(string message){
05         mq.Send(message);
06     }
07 }
08  
09 // your customer’s program that is hard to test
10 Tracer tracer = new Tracer();
11 public void ProcessOrder(Order order){
12     tracer.Trace(order.Id);
13     
14 }

이 소스 코드는 Tracer를 MessageQueue 로만 데이터를 추적할수 있기 때문에, Tracing이 어렵고 확장성 역시 떨어집니다.  MessageQueue에서 다른 형태로 출력을 하기 위해서는 결국 Tracer를 수정해야 되는 문제가 발생하죠.

그래서 IoC (Inversion of Control)을 적용하여, 다양한 방법으로 데이터를 추적할수 잇는 TraceListner를 아래와 같이 설계를 해봅시다.

01 // your better API using IoC (Inversion Of Control)
02 public abstract class TraceListener {
03     public abstract void Trace(string message);
04 }
05  
06 public class Tracer {
07     TraceListener listener;
08  
09     public Tracer(TraceListener listener){
10         this.listener = listener;
11     }
12  
13     public void Trace(string message){
14         listener.Trace(message);
15     }
16 }
17  
18 // Dependency Injection
19 Tracer tracer = new Tracer(new FileListener());
20  
21 public void ProcessOrder(Order order){
22     tracer.Trace(order.Id);
23     
24 }

소스에서 보이는 IoC의 핵심 키워드인 XXXListenr(TraceListener)를 통해서 MessageQueue외에도 File, XML과 같은 다양한 형태로 출력을 할수 있을뿐만 아니라, 확장성과 테스팅이 좀더 용이 하게 되었습니다.

3단계: NINJA가 도와 드려요! 한발더 Dependency Injection (NInject)

IoC를 이용하여 좀더 변화에 유연하며 확장 가능한 소스코드가  생성되었습니다.

하지만 FileListener를 XXXListener로 변경을 위해서는 소스 코드를 변경하거나 Metadata 형식 (Component Configurator)를 직접 구축해야 합니다.

이러한 문제점들을 한방에 해결해 줄수 있는 정보들을 실시간을 삽입,삭제 변경할수 있는 Dependency Injection Container가 나왔습니다.

Container를 통해서 이제 우리는 Dependency의 제어가 한결 더 쉬워졌습니다.

위 의 예를 잠시 이용해 볼까요?


출처 : http://arload.wordpress.com/2008/12/07/dependency_managment/

반응형
Posted by blueasa
, |
C함수 정의
extern unsigned int image_decode_header(const unsigned char *in, unsigned char *frames, unsigned char *bpp, unsigned short *width, unsigned short *height);

extern unsigned int image_decompress(const unsigned char *in, void *out);

extern int image_configure(const unsigned char *in, int start_x, int start_y, int lcd_type, int lcd_color);

C#함수 정의
[DllImport("lite_dll.lib")] static extern int image_configure([In] byte[] input, int start_x, int start_y, int lcd_type, int lcd_rotate , int lcd_color);
[DllImport("lite_dll.lib")] static extern int image_decode_header([In] byte[] input, ref byte frames, ref byte bpp, ref short width, ref short height);
[DllImport("lite_dll.lib")] static extern int image_decompress([In,Out] byte[] input, [In,Out] byte[] output);

아래는 사용법입니다.
image_configure(byImgArray , 0 , 0 , 0 , 0 , 0);
image_decode_header(byImgArray , ref rlsData.byFrame, ref rlsData.bitdepth , ref rlsData.width , ref rlsData.height);
image_decompress(byImgArray , rlsData.byRlsArray);
반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

필자는임베디드 시스템 분야에서의 10여 년 간 개발자로 일하였으며개발 프로세스 개선 활동을 해 왔다.(소속 프로젝트의 SW-CMM Lv.2 달성 및 Panasonic Software Forum 2008에서 해외DC 대표로 사례 발표지금은게임 개발사의 품질보증부서의 프로세스 개선 파트에 근무 중이다.

 

게임 개발사에 입사한 직후 몸소 느낀 자유 분방한 분위기는 쇼크였다게임 개발사는 엔터테인먼트사업이라는 간판 아래 개인의 자유와 창의성을 중시하였다프로젝트 관리게임 디자인소프트웨어 개발아트 등의 분야가 집결되어  50여명이 넘는 개발 인력이 3년 이상의 개발 기간을 갖고 진행하는 게임 개발은프로젝트의 규모가 거대했다.

 

하지만필자가 1년 넘게 개발 프로세스 개선 활동을 느낀 점을 한 마디로 표현하면, '아쉽다였다이 말은개발 프로젝트(게임)의 성공 여부와 관계 없이 안타깝다라는 말이다.  더 쉽게 얘기하겠다개발비가 줄줄 센다는 것이다.

 

대규모의 개발조직에서, 10명 내외의 인원만이 게임 서버와 클라이언트의 개발을 담당한다종합 엔터테인먼트 제작 조직의 10여명이 IT개발자라는 얘기다. 10여명의 개발자의 손에서 만들어지는 제품(게임)컨텐츠의 양과 스케일에 비해서 영세적인 것이 일반적이다일반적인 벤처기업의 프로젝트 개발 조직의 규모와 비슷하고개발 성숙도 또한, 1인 중심적인 체제이다카네기 멜론 대학에서 창안한 개발 성숙도 레벨을 빌어서 표현하자면, CMM Lv.1에 해당할 것이다모든 개발 노하우는 개발자의 머리 속에 있으며소스코드설계문서요구사항의 이력 및 변경점의 관리가 되고 있지 않다그로 인해핵심 개발자가 전직을 하거나불의의 사정으로 조직에서 이탈할 경우이를 매울 수 있는 조직의 프로세스가 준비되어 있지 않는 것이다신규 프로젝트를 준비함에 있어서도재활용 가능한 개발 자원이 없음으로 인해맨 땅에 헤딩을 하는 상황도 발생하게 된다.

 

이에 필자는 다음의 해결책을 제안한다.

 

 

"개발방법론스크럼기본에 충실하자"

 

많은 개발 조직이저명한 외부의 개발방법론을 적용하고 있다. NC소프트의 모 개발팀도 스크럼의 변형 적용을 하여 효과를 봤다는 얘기도 있다스크럼과 같은 익스트림 프로그래밍 류의 개발방법론은불필요한 문서화를 없애고여러 번의 반복(iteration)을 통해서 항시 실행 가능한 버전을 보완해나가는 방법이다작은 스프린터를 뛰면서 백로그를 활용함으로써 설계 변화에 재빠르게 대응할 수 있는 이 방법들은한 순간에 설계(게임 디자인)이 확 뒤 엎어 지기도 하는 기도 하는 게임 개발에 알맞을 것이다하지만여기서 간과되는 것이 있다필수 불가결의 문서는 반드시 작성하고 관리해야 하며소스코드 리뷰 및 모든 문제점의 관리되어야 한다는 것이다그리고모든 것은 조직의 프로세스라는 전제가 필요하다는 것이다.

 

 

(1) 조직 프로세스의 정의 및 적용

 

업무를 진행함에 있어서어떤 표준을 따르며단계 별로 필요한 행위 및 산출물을 정의하는 것을 말한다명확한 조직의 프로세스는구성원 개개인이자신의 지금 어떤 위치에서 어떤 업무를 해야 하는지를 상시 파악하고 인지할 수 있게 도와준다.

 

 

(2) 문서화

 

시스템 아키텍쳐게임 서버-클라이언트의 설계서기능 설계서버그 대응서리뷰/회의록요구사항 관리서 등이소프트웨어 개발자로써 반드시 작성을 해야 하는 필수 문서이다모든 문서는 최신 상황으로 갱신되고 이력이 관리되어야 한다간혹간단한 버그를 대응하는 경우담당자 만이 이해할 수 있는 단순한 수치 조절을 했다고 하자당사자가 아닌 다른 멤버가 관련 부분과 연관된 기능 개선을 하는 경우소스코드 만으로 시스템 구조를 파악해야 하는 난감하고 짜증나는 상황이 발생한다자신의 머리 속에 있는 지식을 모두 문서화할 수는 없겠지만구현된 시스템의 소스코드를 보다 값진 개발자원으로 만들고 활용하기 위해서는 문서화가 반드시 필요하다문서화가 되지 않는 소스코드는 자칫 아무짝에도 쓸모 없게 될 수 있다.

 

(3) 소스코드의 변경 관리

 

형상관리왜 갑자기 이 단어를 꺼냈는지 알 사람은 알 것이다많은 개발자들이 Visual Source Safe, SVN, CVS등의 형상관리 툴을 통해서 소스코드를 관리한다멤버가 수정한 파일변경 내용 등이 이 형상관리 툴을 통해서 알 수 있다하지만 요점은 단지 '알 수 있다'라는 것이다특정 부분(예를 들어게임 클라이언트로부터 수신한 네트워크 패킷의 파싱 처리를 하는 부분)의 변경 의도 및최적화 되어 있는 소스코드의 이력을 파악하려면각 리비전 마다의 변경 내용을 하나하나 체크하면서때로는 수정 후 원복 되는 부분과관련 수정 부분의 모든 소스코드를 하나하나 찾아가야 할 것이다대응을 했던 당사자라면 모를까3자가 이런 작업을 하려면 많은 공수가 필요하다.

한 마디로 정리하겠다형상관리 툴은 단순히 버전을 관리하기 위한 툴이다파일의 변경 내용 비교 및 커멘트는 보너스이며 제한적으로 제공되는 것이다특정 시점의 버전을 취득하고때로는 버전의 롤백과 브랜치 관리를 한다소스코드의 변경점은소스코드 자체로 해야 한다한번 추가한 소스코드는 #ifdef 등으로 무효화는 할 수 있으나 절대로 삭제할 수 없다잘못된 소스코드도 소중한 이력이다변경된 소스코드는조직 프로세스에서 규정된 일정 표준에 의해서 누가언제어떤 문제점으로 인해서 수정을 했는가를 명기 해야 한다해당 수정 부분과 Problem List가 연계되면 더 없이 좋다.

 

(4) 변화 관리

 

변화관리는소스코드의 변경관리하고는 다른 말이다.  어떠한 수정을 함에 있어서그에 영향을 받는 부분을 사전에 분석해서 확인 및 관리를 하는 것을 말한다변화관리의 가장 쉬운 적용 예로대응 내용의 리뷰 시 파급 범위를 한정하고 확인하는 방법이 있다자신 외의 멤버에 의한 동료리뷰에서미처 발견 치 못한 사항을 부작용을 발견하기도 한다.

 

(5) Problem List

 

제품의 버그를 관리하는 Problem List로써, BTS(Bug Tracking System)  사용이 정착화 되었다여러분은 BTS를 통해서버그를 등록하고 폐쇄까지를 관리하고 있다하지만이것은 제한적인 활용이다시스템 설계를 리뷰 할 때대응된 소스코드를 리뷰 할 때버그 대응서를 리뷰 할 때 발생한 지적 사항 또한발생부터 폐쇄까지 누락 없이 관리를 해야 한다이른바 리뷰 지적 사항이 그것이다이에개발과 관련된 모든 이슈를 Problem List에 등록하여 관리하는 적을 추천한다. BTS라는 이름에 얽매이지 말고 활용하자.

 

 

이상게임 개발 조직의 소프트웨어 개발자가 지켜야 하는 기본 사항들을 설명하였다.

 

이 다섯 가지 사항의 준수가 도저히 불가능하다고 어렵게 느껴진다면여러분은 너무 편하게 개발에 임했다고 말할 수 있다지금 여러분이 여러분의 조직의 개발활동이 편할 지라도후임자후임프로젝트조직회사는 그로 인해 공수를 할애하고 개발비를 쏟아 붇게 되는 것이다여러분이 개발한 자원은 다른 프로젝트에 도움을 주지 못하고 그 자체로써 똥이 될 수도 있다.

 

"나는 창의적인 게임 개발자니까자원의 재활용프로세스그런 거 신경 쓰지 않고 내 방식대로 할거야"라고 생각한다면 어쩔 수 없지만개발자로써 개발 프로세스의 적용 및 개선 활동을 리드 하였으며 그로 인해서 개선사항을 경험한 필자의 제안을 귀담아 들어 줬으면 한다.

 

게임 개발사의 소프트웨어 개발자 여러분여러분은 엔터테인먼트의 제작자가 아니다개발자로서 지킬 것을 지키자.

 

 

 

                                                  Actoz Soft Co., Ltd. > Quality Assurance > Process Improvement 김남훈


출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=70&MAEULNo=28&no=246

반응형
Posted by blueasa
, |

원문 : http://support.microsoft.com/default.aspx?scid=kb%3Bko%3BKR601474 )

 

 

기술 자료 ID : 601474
마지막 검토 : 2000년 1월 9일 일요일
수정 : 1.0
이 문서는 이전에 다음 ID로 출판되었음: KR601474

요약

어플리케이션을 릴리즈 모드로 Build 할 때 디버깅 정보를 남기어서 VC++ Debugging Tool에서 디버깅을 가능하게 합니다. 이 방법을 사용하는 경우, 실제 릴리즈 실행 파일은 거의 영향 받지 않으면서, Debugger 에서 Break Pointer를 잡거나, Trace를 가능하게 하므로, Release mode에서만 발생하는 Bug를 추적할 때 용이하게 사용할 수 있습니다.

추가 정보

이 방법을 사용하게 되면 _DEBUG free define으로 포함되는 디버깅 매크로는 포함되지 않으나, Source code안으로 Step in 가능하게 하는 디버깅 정보들은 OBJ와 PDB file에 남게 됩니다. 이를 이용하게 되면 VC++ IDE 환경에서 source level 까지의 step in이 가능해 집니다.
다음은 VC++ 6.0의 프로젝트에서 Debugging Information를 Enable하는 방법입니다.
1. Project를 open 한 뒤 menu Project/Settings 를 선택합니다.
2. Settings For를 Win32 Release로 선택합니다.
3. C/C++ tab에서 category를 General로 선택하고 Debug info를 Program Database로 선택합니다.
4. Link tab에서 category를 General로 선택하고 Generate debug info를 check합니다.
5.

Rebuild All를 실행하여서 프로그램을 다시 Build 합니다. 이제 디버깅 하고자 하는 위치에 Break Pointer 를 잡고Go를 실행하면, 디버깅을 진행할 수 있습니다.

 

 

 

*********************************************************************************************

자자.. 위에꺼는 2000년도에 마소에서 나온 문서이다. 2000년도라면 VC++ 6.0을 사용하던 시기..

지금은 몇 년도? 2007년도.. VC++은 얼마? 2005.. 흠.. 상당한 시간이 흐르고, VC++도 엄청난 변화를

격었기에 위와같이 설정을 해주면 컴파일이 안 된다. 그래서 2005에 맞게 수정하겠다. ^^

 

 

위 그림과 같이 "메뉴 -> 프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 일반" 으로 이동을 한다. 그리고 맨위 왼쪽 구성은 Release로 한다.

그리고 디버깅 정보 형식은 "편집하며 계속하기를 위한 프로그램 데이터베이스(/ZI)" 로 변경한다.

그리고 "메뉴 -> 프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 최적화"로 가서 "속도 최대화(/O2)"에서 "사용 안 함"으로 설정.

그리고 "메뉴 -> 프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 전체 프로그램 최적화"로 가서 "링크 타임 코드 생성 사용(/GL)""사용 안 함"으로 설정한다.

 

저렇게 설정하고 다시 컴파일 한 후 릴리즈 모드로 디버깅을 하거나 덤프 파일을 읽으면 일반 디버깅과 똑같이 파일 정보를 읽을 수 있다.


출처 : http://nsjokt.springnote.com/pages/3539747

반응형
Posted by blueasa
, |

 작성자 : 정동헌

 작성일 : 02.03.21


 주요 내용

 1. 디버깅 옵션의 의미.

 2. 디버깅 런타임 라이브러리 사용시의 특징.

 3. 릴리즈 모드에서 디버깅하기.

 4. Watch 윈도우에서 "Register", "Pseudo-register"값 확인하기.

 5. Watch 윈도우에서 변수값을 변수 타입을 구체적으로 정하여 값 확인하기.


Compiler options for finding Bugs

Compiler Options

의미

/W4

Warning Level을 최대로 하여 컴파일

( 모든 빌드 타입에 가능 )

/D "_DEBUG"

Assetion, Trace 같은 디버깅용 코드가 컴파일시 포함되록 만든다.

 ( 디버그 빌드에서만 )

/GZ

생성시에 초기화 되지 않는 변수를 특정 값으로 채워 놓아서 흔히 디버그에서는 나타나지 않고 릴리즈 빌드에서 나타나는 에러를 사전에 검사할 수 있게 하여 디버그에 도움이 되게 함. ( 디버그 빌드에서만 )

/Od

최적화하지 않는다. 코드를 디버그에 적합하게 만든다.

( 디버그 빌드에서만 )

/GF

실행 파일에 들어갈 스트링이 중복될 경우 이를 제거, 공동으로 사용되는 이 스트링이 할당된 메모리를 읽기 전용으로 설정하여 우발적인 메모리 쓰임으로 부터 보호함.

 char *s = "This is a character buffer";

 char *t = "This is a character buffer";

 위와 같은 경우 같은 스트링이므로 스트링을 서로 공유 함.

( 릴리즈 모드에서 명시적으로 사용시 )

/Gf

실행파일에 들어갈 스트링을 공유하는 것은 위와 같으나 우발적인 메모리 쓰임으로 부터 보호 하지 않음.

/ZI

디버깅 심벌용 프로그램 데이터베이스를 만듬.

디버그로 실행시에 코드를 편집후 연속해서 디버깅이 가능하게 정보를 관리.

( 디버그 빌드에서만 )

/Zi

디버깅 심벌용 프로그램 데이터베이스를 만듬.

( 릴리즈 빌드에서만 )

Compiler options for a debug build

Linker Options

의미

/MDd, /MLd, /MTd

디버그 실시간 라이브러리 사용.

/Od

최적화하지 않는다.

/D "_DEBUG"

디버그용 코드가 컴파일 되게 한다.

/ZI

편집, 연속 디버깅이 가능하게 디버그용 데이터배이스를 만듬.

/GZ

디버그 빌드에서의 흔한 실수로 릴리즈에서 나타나는 에러를 디버그모드에서 검출.

/Gm

빌드 시간을 재빌드시에 감축시키기.

Compiler options for a release build

Linker Options

의미

/MD, /ML, /MT

릴리즈 실시간 라이브러리 사용.

/O1 or /O2

속도 최적화나 사이즈 작게 최적화 같은 것을 가능하게.

/D "NDEBUG"

디버그용 코드가 컴파일되지 않게 함.

/GF

중복된 문자열을 방지, 읽기 전용으로 데이터를 보호함.

디버그 런타임 라이브러리 사용.


 - 디버그 런타임 라이브러리는 메모리 할당을 추적하고 메모리 누수를 점검한다.

 - 새로이 메모리 할당되어 초기화 되지 않은 데이터에 "0XCD"의 바이트 패턴으로 써놓는다.

 - 메모리 할당이 해제될 경우에 “0XDD"의 바이트 패턴으로 표시를 하여 해제된 메모리라고 알 수 있도록 표시한다.

 - 할당된 메모리 버퍼의 양쪽 끝 부분에 DWORD 사이즈로 “0XFD"의 바이트 패턴으로 표시를 해둬서 memory overwrite나 memory underwrite를 체크할 수 있게 한다. ( 즉 디버그 모드에서는 메모리 할당시에 양쪽에 각각 DWORD의 공간이 마킹하기 위해서 추가적으로 할당이 된다. )

 - 메모리 할당시 소스코드 상에서의 위치를 알아 내는데 도움이 되도록 소스코드의 파일 이름과 해당줄을 추적을 위해서 넣어 놓는다.


디버그 빌드에서 릴리즈 빌드 에러를 검출하기.

 “/GZ" 컴파일러 옵션을 삽입시,

 1. 초기화되지 않은 포인터에 대한 접근 위반을 검출하기 위해 "0XCC“ 패턴으로 자동적으로 변수를 초기화 함.

 2. 비주얼 C++은 디버그 모드에서는 모든 변수를 자동적으로 0로 초기화하고 릴리즈 모드에서는 그렇지 않는다. 이것은 컴파일러가 하는 일중에 가장 허접한 것이다. 이것으로 릴리즈 모드에서 예상하지 못한 에러를 만날 수 있다. 그러나 “/GZ"라는 컴파일 옵션을 주면 모든 변수를 ”0XCC"로 초기화 함으로써 이를 방지할 수 있다.



 릴리즈 모드에서 디버깅하기


 1. “Project/Settings/"을 선택하여 프로젝트 세팅 다이알로그를 띠운다.


 2. ”C/C++“ 탭에서 ”General" 카테고리를 선택해서 "Optimizations"을 “Disable(Debug)"로 선택하고 “Debug info" 항목을 ”Program Database“로 바꾼다.

3. "Link" 탭에서 “Debug" 카테고리를 선택하면 ”Debug info" 항목이 있는데 여기서 "Microsoft format"을 선택한다.

4. “Link" 탭에있는 ”Project Options" 박스에 들어 있는 내용의 맨 끝에 "/OPT:REF"를 추가 한다.

5, 반드시 “Rebuild All"로 제 컴파일을 한다.


Note : Vs 7.0 (.Net )에서의 설정 방법.. (한글판 기준)

 1. C/C++에서 일반 항목중에서, 디버깅 정보 형식을 “사용안함"에서 “편집하며 계속하기를 위한 프로그램 데이터베이스(/ZI)"로 변경.

 2. C/C++에서 최적화 항목중에서, 최적화를 “속도최대화(/O2)”에서 “사용안함(/Od)"로 변경.

 3. C/C++에서 최적화 항목중에서, 인라인 함수 확장을 “__inline(/Ob1)" 에서              사용 안함으로 변경.

 4. 링커에서 디버그 항목중에서, 디버그 정보 생성을 “아니요”에서 “예(/DEBUG)"로 변경. 


 ** 디버깅 후에는 꼭 설정을 되돌려놔야 한다.


Registers And Pseudo-registers

Register값은 “Registers" 윈도우에서 확인이 가능하지만 단순하고 값만을 알수 있다. 이 값들을 ”Address(Watch)" 박스에서도 확인이 가능하며 여러 부가 기능과 같이 쓸수 있다.

 예를 들어 EAX의 값을 확인 해볼려고 하면 Watch 항목에 “@EAX"혹은 ”@eax"와 같이 대소문자를 구분하지 않고 넣으면 이 래지스터의 값을 확인 할 수 있다.

 또한 Pseudo-register"의 값또한 확인 할수 있는데. "@ERR"의 Pseudo-register 값은 매우 유용하게 사용할 수 있는데 이 값이 GetLastError의 값을 나타내기 때문이다. 만약 “@ERR,hr"이라고 입력한다면 Win32의 에러코드에 해당하는 택스트를 보여 줄것이다.

Pseudo-register

의미

@ERR

GetLastError API로 알 수 있는 가장 최근에 반환된 에러 코드를 보여줌

@CLK

누적시간(MicroSecond)을 보여줌.

@TIB

TIB의 주소를 보여줌.

Registers that Watch and Memory windows support




Pseudo-registers that the Watch window supports

Register

사용(용도)

@EAX

일반 용도, 함수의 return 값으로 사용

@EBX

일반 용도

@ECX

일반 용도, 오브젝트의 this 포인터로 사용.

@EDX

일반 용도, 64비트의 return값의 경우 상위 값의 반환에 사용.

@ESI

메모리 이동과 비교 연산시의 원본 메모리

@EDI

메모리 이동과 비교 연산시에 대상 메모리

@EIP

명령 포인터 ( 코드의 현제 위치 )

@ESP

스텍 포인터 ( 스텍의 현제 위치 )

@EBP

스텍 배이스 포인터 ( 현제 스텍 프레임의 바닥 )

@EFL

비교나 수학 연산을 위한 플래그 비트

@CS

Code segment

@SS

Stack segment

@DS

Data segment

@ES

Extra segment

@FS

Another extra segment, used to point to the TIB

@GS

Yet another extra segment

Watch Window Formatting Symbols

이 윈도우는 변수의 값을 볼수 있게 해주는데, 값을 십진수나 16진수로서 확인할 수 있다. 16진수는 팝업 메뉴에서 “Hexadecimal Display"를 선택하면 볼수 있다. 이 이외에도 여러 가지 옵션을 주어서 사용할 수 있는데 이들은 Watch Window에 등록되는 변수명 뒤에 ","를 삽입하고 그뒤에 옵션을 주어 사용할 수 있다.


Symbol

Format

Example

Output

d, i

부호있는 10진 정수

-42,d

-42

u

부호없는 10진 정수

42,u

42

o

부호없는 8진 정수

42,o

052

x

16진 정수

42,x

0x0000002a

X

16진 정수

42,X

0x0000002A

h

Short prefix for d,i,u,o,x

42,hx

0x002a

f

실수

1.5,f

1.500000

e

부호 있는 과학용 표기

1.5,e

1.500000e+000

g

Compact float

1.5,g

1.5

c

문자

42,c

'*'

s

ANSI 문자열

"bugs",s

"bugs"

su

UNICODE 문자열

"bugs",su

"bugs"

st

기본 문자열형 ( s, su중에서 )

"bugs",st

"bugs"

hr

HRESULT, Win32 error code

0x06,hr

The handle is invaid

wm

Wndows message number

0x01,wm

WM_CREATE

[digits]

배열

s,5

배열 5개의 항목 표시



반응형
Posted by blueasa
, |
프로세스와 스레드에 대한 개념은 어떤 프로그래밍 언어라 하더라두 공통으로 적용이 되는 부분입니다. C#에서 스레드를 사용하는 방식은 파라미터(Parameter)가 있냐 없냐에 따라서 달라집니다. 

파라미터(Parameter)가 없는 경우 
파라미터가 없는 경우에는 간단합니다. Thread 객체를 선언해 주고, 정의하는 과정에서 ThreadStart 를 만들어주면서 스레드가 동작시킬 함수명을 적어주면 됩니다. 

자 한번 볼까요?

Thread th = new Thread(new ThreadStart(test));
th.Start();

test 함수의 경우 void test() 가 생성되어 있어야 합니다. 위와 같이 적으면 스레드 객체를 생성하고 동작시킬 함수를 연결하고 바로 시작(Start()) 됩니다. 물론, 선언 따로, 정의 따로 시작따로 할수도 있겠죠. 



파라미터(Parameter)가 있는 경우 
파라미터가 있는 경우도 크게 어렵지는 않습니다만 Thread 객체를 정의할때, 조금 달라집니다. ThreadStart 대신에 ParameterizedThreadStart를 사용해서 Thread 객체와 동작시킬 파라미터가 있는 함수를 연결시킵니다. 

Thread th = new Thread(new ParameterizedThreadStart(test));
th.Start("Hello World");

public void test(string s)
{
...
}

위의 소스코드에서 보는것 처럼, 자신이 전달 하려는 파라미터 값에 대해서는 Start() 함수를 통해서 전달할 수가 있습니다. Start() 함수는 Overload되어있기 때문에 파라미터가 없이 Start()를 할수도 있지만, object 으로 파라미터를 전달해 주기도 합니다. 

참고로 .NET 1.1 Version 에서는 파라미터가 있는 경우에 대해서는 스레드의 지원이 안되었다고 합니다. 참고하세요^^ 

반응형
Posted by blueasa
, |

KGC2010문서들이 올라왔네요. 

<KGC2010 최종 강연자료> 웹하드(http://webhard.co.kr)를 통해 2010.09.16일 부터 프리젠테이션 파일 다운로드 가능. 아이디(KGC10TH) 비밀번호(kgc2010)

KGC 2010 후기와 발표자료를 모으고 있습니다. (계속 업데이트 됩니다)
이제 여기 저기 기웃거리며 돌아댕기지 않아도 강연 자료를 볼 수 있겠네요. 므흣


출처 : http://ozlael.egloos.com/3442955
반응형
Posted by blueasa
, |
이번 개최된 GDC 2010에서 쌈빡한 문서 없나 뒤져보던 중 발견한 판타스틱 오브 더 월드 굿 씨 문서를 하나 소개하고자 한다.

우선 스크롤의 압박을 견디지 못하는 분들을 위해 간략히 설명하자면 ...
 - 모델의 파츠를 미리 모델링한 메쉬로 바꿔치기가 아닌 실시간 랜더로 처리 하는 방식.
 - 버텍스 테이터를 재 구성하는 것이 아니라 셰이더에서 주어진 구형의 부분을 texkill

기존에는 모델 셋트를 따로 만들었기에 다양한 형태가 불가능한데 반해( Left 4 Dead 1 방식)
원본 모델 하나에 텍스쳐 투영으로 알파 clip하기 때문에 다양한 표현 가능( Left 4 Dead 2 방식)
어색하면 뻥 뚫려버린 부분에 구형 메시 삽입
디자이너의 수고도 덜고 플레이어가 공격한 정확한 위치에 파손을 줄 수 있고... 게다가 구현이 복잡하지도 않아 보인다.
긴말해서 뭐하리오 직접 문서를 봐보시라~! 첫페이지부터 뇌즙의 압박이 올지어니~ 
반응형
Posted by blueasa
, |

- 테이블에 자신의 키와 자기 부모의 키를 가지고 있는경우 재귀함수를 이용해 트리뷰를 구성

 

 

RwNm : 노드이름

RwCd : 노드키

PrntRw : 자신의 부모키

 

#region 트리뷰구성
private TreeNode CreateNode(string RwNm,string RwCd)
{
    //자신의 하위노드가 없을때까지 찾는다   

    TreeNode node = new TreeNode();
    node.Name = RwCd;
    node.Text = RwNm;

    foreach (DataRow r in RwCdTable.Rows)
    {
          if (RwCd == r["PrntRw"].ToString()) //자신의 키를 부모키로 갖고있는 노드검색
          {
              //System.Diagnostics.Debug.WriteLine(RwCd+ "->"+r["RwCd"].ToString());

              

              //재귀호출
              node.Nodes.Add(CreateNode(r["RwNm"].ToString(),

                                                        r["RwCd"].ToString()));                      
           }
     }
     return node; //자신의 하위노드를 다찾은 노드를 반환
}
#endregion

 

//함수사용

trvRw.Nodes.Add(CreateNode(strRwLevlNm,"00000000"));

 

자료구조시간에 배운 재귀함수를 회사에서 써먹게될줄이야...


출처 : http://blog.naver.com/tjr0807?Redirect=Log&logNo=150005240319

반응형
Posted by blueasa
, |