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

카테고리

분류 전체보기 (2737)
Unity3D (817)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
VS 프로젝트 설정 (37)
TortoiseSVN (4)
Excel (5)
협업 (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-24 00:01

2003 프로젝트를 2008에서 컴파일 할때 발생..


Wp64 옵션을 주지 말라는 것

프로젝트 -> 속성 -> C/C++ -> 일반 -> 64비트 이식성 문제점 검색 : 아니요



출처 : http://blog.naver.com/ghostcbr954/110086888865

2차 출처 : http://boyfox009.egloos.com/2579554

반응형
Posted by blueasa
, |
Visual Studio 2008에서 C++ 프로그램을 컴파일 하면은 기본적으로 두가지 모드가 있습니다.

Release /Debug 두 버전의 차이점은 다른 소소한 성능 향상을 위한 컴파일 옵션도 있지만

가장 중요한건 디버깅이 가능하느냐 가능하지 않냐의 차이점 이라고 생각입니다.

그런데 기존에 구축되어 있는 프로그램을 유지 보수 하다보면은 디버깅 할일이 발생합니다.

기존의 선임이 Release / Debug  별로 프로젝트를 잘 관리했으면 좋겠지만

세상 사는 일이 다 내맘데로 안되듯이 너무 오랜기간 유지 보수를 하다보니 Debug 정보가 유실되는 경우가 있습니다.

프로젝트가 하나의 exe이면 다시 Debug 컴파일 하면되지만 exe와 dll이 약 40~50개 연결된 프로그램이라면

헉 소리 납니다.

이럴때 기본적으로 되어 있는 Release에서 디버깅 정보를 삽입해서 컴파일 할 수 있습니다.

프로젝트 속성 (ALT + F7) 으로 들어가서 아래 그림과 같이 3개의 설명을 그림에 맞게 해주시면 Release 에서도 

디버깅 가능합니다.

* Property Page -> Configuration Properties -> C++ -> General -> Debug Information Format

* Property Page -> Configuration Properties -> C++ -> Optimization -> Optimization 

* Property Page -> Configuration Properties -> Linker -> Debugging -> Generate Debug Info

반응형
Posted by blueasa
, |

짜증나는 워닝과 에러 중에헤더파일 순서에 따라 발생하는 워닝/에러가 있습니다특히 링크타임에 나는 에러는 네이밍 모양새가 재밌게 생겨먹지 않은 스타일로 생기는 데다가 링커가 별로 힌트를 주지 않아서 짜증이 나기도 합니다예를 들면 아래와 같은 겁니다.

 

1>Generating Code...

1>Compiling resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Compiling manifest to resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Linking...

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)

 

위 예는 MFC프로젝트에서 모든 파일에서 MFC 헤더를 다른 헤더 보다 먼저 선언해야 하는데(대부분 stdafx.h를 가장 상위에 선언합니다.),  MFC 프로젝트에서 사용하던 파일을 Import 하고 컴파일 하는 순간 발생했습니다.

 

이런 에러의 경우 대처법은 의외로 간단 합니다일단 똑똑고 기억력 좋으신 분들은 자기가 했던 행위들의 콜스택을 하나하나 거슬러 올라가시면서 대처 하는법이 있고이게 가장 비용대비 시간단축 효가가 가장 좋습니다.

 

순간 욱해서 콜스택 거슬러 올라가기 힘드신 (저 같은;;)분들은 아래처럼 대처 하시면 됩니다먼저 링커 옵션에 아래 옵션을 추가 합니다.

 

/verbose:lib

 

 

 

그리고 다시 빌드 하면 링킹타임에 library를 스캔하는 리스트가 아래와 같이 output창에 나오게 됩니다.

 

1>Generating Code...

1>Compiling resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Compiling manifest to resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Linking...

1>Searching libraries

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\DelayImp.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\LIBCMTD.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\uafxcwd.lib:

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\kernel32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\user32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\gdi32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib:

 

윗 예에서 uafxcwd.lib를 링크 할 때링크에러가 났고에러를 유발한 유력한 용의자는 uuid.lib입니다왜냐면계속 다른 애들은 디폴트 경로에서 링크되는데 uuid.lib만 sdk 에서 링크 되었고, MFC에서 new를 재정의 하기 때문에이전에 new가 정의되어 있는 파일이 링크되면 안됩니다여기서 “stdafx.h”파일을 추가 하는 것을 잊었구나 하는 생각이 듭니다.

 

/verbose 옵션을 써보지 않으신 분들은 한번 넣고 컴파일을 해보시면 쓰잘떼기 없는 정보까지 주르륵 나와서 놀라실 껍니다. 여러가지 링킹 타임에 하는 작업 정보를 자세히 알려주는 것을 알 수 있습니다. 윗예의 :lib처럼 뒷부분에 세부 옵션을 붙여 보기 좋게 정보를 추출하는 작업이 익숙해 지면 일반적인 컴파일시 정보를 잘 제공해주지 않는 링킹 타임시 발생하는 에러에 정보를 얻어 디버깅 작업 시간을 단축 시킬 수 있습니다.


출처 : http://blog.naver.com/drvoss/20064150564

반응형
Posted by blueasa
, |

/VERBOSE:LIB

 

이 옵션을 걸어주면 어떤 lib에서 라이브러리 충돌이 생기는지 알 수 있다

 

라이브러리 충돌은 라이브러리를 만들때 crt lib를 포함해서 (mtd,mt) 컴파일 하였다면

라이브러리를 사용하는 응용프로그램 또한 crt lib를 포함해서 컴파일 해야한다.

 

반대로 lib를 만들때 (mdd,md) 공유 라이브러리를 이용해 컴파일 했다면 응용프로그램에서도

그렇게 해야한다.



출처 : http://blog.naver.com/herok3/100047421303

반응형
Posted by blueasa
, |

1. API에서 참조하는 library의 순서를 확일 할수 있는 명령

 

.net -> 속성 -> linker -> 명령줄 -> 추가 옵션

/verbose:lib


반응형
Posted by blueasa
, |

Visual C++ (.NET 기준)에서 디버깅 시 유용하게 사용할 수 있는 컴파일옵션들을 정리해 보았습니다.  하나하나 다 외우질 못해 프린트해서 그때그때 사용하고 있습니다. ^^

도움이 될 지 모르겠네요.

 

/EP /P C/C++ Preprocessor Generate Preprocessed File
(파일전처리)
전처리 코드에 대한 내용을 소스파일.i 파일로 볼 수 있다. 
/C C/C++ Preprocessor Keep Comments
(주석유지)
위를 설정하고 이것도 설정하면 선택하면 전처리코드 위의 주석도 유지하면서 보여 줄 것이다.
/X C/C++ Preprocessor Ignore Standard Include Path
(표준 포함경로무시)
표준 인클루드 경로 무시
/Zp C/C++ Code Generation Struct Member Alignment
(구조체 맴버 맞춤)
#pragma pack 지시자를 사용하는 것이 더 좋을 것 같다.
/Wp64 C/C++ General Detect 64-bit Portability Issues
(64비트 이식성 문제 검색)
나중 64비트 호완성을 돕기위해 설정을 해 두는 것이 좋다.
/RTC C/C++ Code Generation Smaller Type Check
(작은 형식 검사)
/RTCc : 값을 작은 데이터 형식으로 변환할 때 데이터손실이 없는 지 검사한다.
Basic Runtime Checks
(기본 런타임 검사)
/RTCu : 초기화되지 않은 변수참조를 추적한다.
/RTCs : 모든 지역변수들을 0xCC로 초기화 하여 훌륭한 스택 프레임 검사가 로컬변수 언더런과 오버런을 감지하고 스택 충돌에 대해서 스택 포인터를 검증하도록 한다.
/RTCsu : 위의 두개 모두 포함
/GS C/C++ Code Generation Buffer Security Check
(버퍼 보안 검사)
바이러스 작성자들의 가장 일반적인 공격인 리턴주소를 악성코드로 리다이렉트 할 수 있도록 하는 버퍼오버런공격을 막아주는 것이다.
/O(num) C/C++ Optimization Optimization
(최적화)
/O1(크기최소화), /O2(속도최대화:디폴트)
마이크로소프트 제품은 모두 /O1으로 컴파일..이것으로 컴파일 할 때 같이 SWS(Smooth Working Set)유틸리티를 사용해서 공통적으로 사용하는 함수들을 앞으로 배치되도록 해야 한다.(속도도 높이기 위해)
/GL Main General Whole Program Optimization
(전체프로그램최적화)
설정하면 링커스위치에 /LTCG(밑에 참조 바람)를 설정
/showincludes C/C++ Advanced Show Includes
(포함 파일 나열)
컴파일 할 때 포함되는 include 파일들이 어떤 위치의 것인지를 Output 화면으로 모두 보여준다.
/MAP Linker Debugging Generate Map File
(맵파일 생성)
맵파일을 생성하는 스위치로 유용한 정보를 얻기위해서는 모두 사용해야 한다.
/MAP:LINES Linker Debugging Map Lines
(맵파일에 줄 번호 정보 포함
/MAP:EXPORTS Linker Debugging Map Exports
(맴파일에 익스포트 함수정보 포함)
/NODEFAULTLIB Linker Input Ignore All Default Libraries
(라이브러리 무시)
많은 시스템 헤더파일들이 어떤 파일이 링크되는지 지정하기 위해 #pragma comment (lib#,립이름)을 포함하는데 이를 모두 무시하도록 지시한다.
/OPT:NOWIN98 Linker Optimization Optimize for Windows98
(Windows98에 맞게 최적화)
98,ME를 지원하지 않는 다면 설정하는 것이 좋다. 응용프로그램의 크기를 줄일 수 있다.
/ORDER Linker Optimization Function Order
(함수에 순서 지정)
SWS(Smooth Working Set) 을 실행한 후 함수의 순서를 포함하고 있는 파일을 지정할 수 있다.
/VERBOSE Linker General Show Process
(진행 메시지 표시)
링크되는 라이브러리의 모든 진행 메세지를 표시
/VERBOSE:LIB Linker General Show Process
(진행 메시지 표시)
검색된 라이브러리만 나타내는 진행 메세지를 표시
/LTCG Main General Whole Program Optimization
(전체프로그램최적화)
/GL스위치와 짝을 이룬다. 링크시간코드를 생성.
/RELEASE Linker Advanced Set Checksum
(체크섬 설정)
별로 사용되지 않지만 WinDBG를 사용할 때 책섬을 조사할 때 필요하기 때문에 미리 넣어 두는 게 좋다.
/PDBSTRIPPED Linker Debugging Strip Private Symbols
(전용 기호 제거된 심볼)
스택을 탐색하고 해독하기 위해서 필요한 특별한 Frame Pointer Omission(FPO) 데이터를 PDB파일에 포함시키기 위해 설정한다. 각종 변수나 소스 줄정보는 빼고 필요한 FPO데이터와 공용함수들만 남겨놓는다(stripped PDB파일). 이것과 함께 일반 PDB 파일을 같이 생성할 수 있다. 나중에 Dr.Watson 등에서 PDB파일을 로드할 수 있기 위해서는 파일명을 어플리케이션 명과 같게 해줄 필요가 있다.

반응형
Posted by blueasa
, |

VS도움말에도 나와있는 내용이지만 프로젝트가 거대해지면 어쩔 수 없이 헤더파일이 이리저리 엉키고 중복선언하게되는데, 그렇게되면 잘 작동하던 Intellisense가 갑자기 작동하지 않고 상태표시줄에 아래와 같은 메시지가 뜨는 것을 볼 수가 있다.

그림 1 : 에러메시지. (Intellisense가 정상작동하는데도 .또는 ->가 뒤바뀌어서 같은 메시지가 뜨는 경우도 있다. )

 

사실 아래와 같은 Intellisense가 뜨는게 정상인데 말이다.

그림 2 : Intellisense

이럴 땐 VS를 종료하고 프로젝트폴더 안을 보면 프로젝트명.ncb의 파일이 존재하는데 가차없이 삭제해주고 VB를 재실행하면 해결된다.

 

(레퍼런스)----------------------------------------------------------------------

Visual Studio 도움말

-----------------------------------------------------------------------------

반응형
Posted by blueasa
, |

조치 방법은 일단 visual Studio IDE 를 삭제하고 다시 설치하는 방법이 있구요..(최악의 방법이자 뒷탈없는 방법이죠.)

 

다음으로는 Visual Studio IDE를 리셋 하는 방법입니다..

관련정보는 http://www.microsoft.com/korea/msdn/library/ko-kr/bb245788(vs.80).aspx

  • Visual Studio 2005의 인스턴스를 모두 종료합니다.
  • 시작을 클릭하고 실행...을 선택합니다.
  • "devenv.exe /resetuserdata"를 입력합니다.
이 명령을 사용하면 몇 분 동안 Visual Studio가 정리되고 처음 상태로 설정됩니다. 이때 작업 관리자를 열어 devenv.exe 프로세스가 실행 중인지 여부를 확인할 수 있습니다. 실행이 종료되면 Visual Studio를 다시 시작할 수 있습니다. 그러면 컴퓨터에서 Visual Studio를 처음으로 실행할 때처럼 처음 실행 대화 상자가 다시 표시됩니다.

반응형
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
, |