반응형

VMware를 이용한 원격 디버깅 설정

1. VMware시리얼 포트 추가

    (1) VMware [Edit virtual machine settings] 클릭합니다.

사용자 삽입 이미지

(2) [Add...] 버튼을 클릭합니다.

사용자 삽입 이미지

(3) [Serial Port] 선택 후 계속진행합니다.

사용자 삽입 이미지

(4) [Output to named pipe] 선택 후 계속진행합니다.

사용자 삽입 이미지

(5) Named pipe 이름을 설정합니다.
1) Named pipe 이름 형식은 \\.\pipe\임의지정 형태입니다.

사용자 삽입 이미지

(6) Serial 포트가 추가되었습니다

사용자 삽입 이미지

2. Debugee( VMware내의 OS ) 설정

(1) C드라이브의 boot.ini 파일에 다음 내용을 추가합니다.
아래의 내용은 디버깅 모드와 일반모드의 멀티 부팅을 지원합니다.

[boot loader]

timeout=10

default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /debugport=COM1 /baudrate=115200

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect

(2) 실제 적용한 내용은 아래와 같습니다.

사용자 삽입 이미지

(3) VMware내의 OS를 부팅하면 아래와 같이 표시됩니다.
[
디버거 사용 가능]을 선택하여 부팅하면 디버깅이 가능합니다

사용자 삽입 이미지
   (4) Windows Vista의 경우, boot.ini파일이 존재하지 않습니다.
  
디버깅 설정을 위해, bcdedit.exe 유틸리티를 사용해야 합니다.
  Command 창에서 다음과 같이 입력합니다.
  1) Serial
포트를 이용하는 경우
     c:\> bcdedit /debug on
     c:\> bcdedit /dbgsettings serial debugport:1 baudrate:115200
  2) IEEE 1394
를 이용하는 경우
     c:\> bcdedit /dbgsettings 1394 channel:23


 


3. WinDBG 설정

     (1) WinDBG 바로가기 파일을 원하는 위치에 복사합니다.

사용자 삽입 이미지

(2) 복사된 바로가기 파일을 오른쪽 마우스 클릭한 후 [속성]메뉴를 선택합니다

(3) [대상] 항목을 다음과 같이 설정합니다.

"C:\Program Files\Debugging Tools for Windows\windbg.exe" -k com:port=\\.\pipe\com_dbg,baud=115200,pipe,reconnect

1) 빨간색으로 표시된 com_dbg 부분은 1.(5)에서 설정한 이름을 적어 줍니다.

사용자 삽입 이미지

4. 디버기(Debugee)와의 연결
(1) 3.에서 설정한 바로가기를 실행합니다.


사용자 삽입 이미지

(2) VMware내의 OS를 구동하면 OS가 부팅되면 다음과 같이 WinDBG와 연결됩니다.

사용자 삽입 이미지

(3) Ctrl+Break를 누르면 다음과 같이 디버깅 모드로 전환 됩니다.

사용자 삽입 이미지

5. OS 심볼 설정

    (1) WinDBG [File>Symbol File Path]메뉴를 선택합니다.

사용자 삽입 이미지

(2) 다음과 같이 심볼파일 경로를 설정하면 OS의 심볼을 로드할 수 있습니다.

srv*c:\symbols.pub*http://msdl.microsoft.com/download/symbols;

사용자 삽입 이미지
   


반응형
반응형

COM 모듈만으로 COM 사용하기

 

모듈에 대한 설명 없이 달랑 COM Dll만을 전달 받은 상황. .

 

물론 COM모듈만으로도 사용 가능할 수 있게 하기를 모토로 한다고는 하지만 간단한 인터페이스 설명조차 없이 너무한 거 아니요?

 

암튼 위의 상황에서 삽질하며 알게 된 COM사용 방법에 대해 기술하겠습니다.

 

아래에 기술되는 방법은 제가 테스트를 통해 정상적으로 사용이 가능함을 확인했지만, COM에 대한 소양이 부족한지라, 오류의 가능성이 있을 수 있음을 미리 밝혀둡니다.

 

n  idl 파일 추출하기

     Visual studio도구의 OLE View나 실행>oleview를 실행해서 oleviewer를 실행시킨다.

     2. File>View TypeLib메뉴를 선택해 해당 COM dll혹은 COM exe Open한다.

     디스플레이되는 정보에서 Root로 표시되는 XXX(xxx x.x Type Library)를 클릭하면 오른쪽 윈도우에 idl파일을 생성해서 보여준다.

     해당 내용을 xxx.idl로 저장한다.

 

n  tlb 파일 생성하기

n  방법 1

ü  Win32 Dynamic Linked Library프로젝트 생성해 빈프로젝트를 만든다.

ü  위에서 생성한 idl파일을 프로젝트에 포함한 후 Build하면 *.tlb파일이 생성된다.
( VC++
[ Project>setting>mi] 탭에 MkTypLib commpatible 항목이 체크되어 있어야 한다.

n  방법 2

ü  명령프롬프트 창에서 다음과 같이 입력해 tlb파일을 생성한다.
C:\>midl /mktyplib203 xxx.idl

 

n  tlb파일 import

n  방법 1

ü  #import "xxx.tlb"를 추가 후 컴파일하면 xxx.tlh파일이 생성된다.
xxx.tlh
파일을 열어보면, namespace CLSID, IID등의 정의 부분이 존재한다.

ü  최종적으로,

#import "xxx.tlb" named_guids

using namespace XXXX;

를 코드에 삽입한 후 사용하면 된다.

n  방법2 - MFC를 이용하는 경우

ü  Ctrl+w를 눌러 클래스 위자드를 실행시킨후, New Class버튼을 눌러 From TypeLib를 선택한다.

ü  위에서 생성된 tlb파일을 선택하면, 해당 COM모듈을 사용할 수 있는 wrapper class를 자동으로 생성해 준다

 

반응형

'Windows Programming' 카테고리의 다른 글

Windows Mobile 전원 상태 감시  (0) 2008.08.12
듀얼 모니터에서의 좌표값 확인  (1) 2008.07.04
Afx의 의미  (0) 2008.04.14
스크린 크기 구하기  (0) 2008.04.02
[MFC] Windows Control 제어  (0) 2008.03.31
반응형

Afx의 의미

MFC로 프로그램을 작성하다 보면 Afx로 시작하는 함수들을 많이 볼 수 있다.

Afx는 무슨 의미일까?

간혹 궁금증이 일곤 했다.

그래서~~

Naver님에게 물어봤다.

AfxApplication FrameworKS을 뜻하는 말로, MFC를 개발하던 MS내부 팀의 이름 이란다.

AApplication

FFrameworks

X – FrameworKS

 

궁금하면 물어봐라. 그리고 확인해라

 

반응형

'Windows Programming' 카테고리의 다른 글

듀얼 모니터에서의 좌표값 확인  (1) 2008.07.04
COM DLL만으로 tlb파일 생성및 COM사용하기  (0) 2008.04.28
스크린 크기 구하기  (0) 2008.04.02
[MFC] Windows Control 제어  (0) 2008.03.31
MFC 전역함수  (0) 2008.03.30
반응형

Screen 크기 구하기

 

GetSystemMetrics API를 이용해서 구할 수 있는 스크린 크기는 여러 가지가 있다.

상황에 따라 필요한 화면크기를 구할 때는 다음과 같이 코딩하면 된다.

·        스크린 크기( 해상도 )
int iScreenCx = GetSystemMetrics(SM_CXSCREEN);
int iScreenCy = GetSystemMetrics(SM_CYSCREEN);
이 값은 GetDeviceCaps(HORZRES), GetDeviceCaps(VERTRES)값과 같다고 MSDN에 명기되어 있다

 

·        태스크바를 제외한 윈도우가 위치할 수 있는 화면 크기
MSDN을 보면 SM_CXMAXIMIZED(SM_CYXMAXIMIZED) 플래그가 있다.
이 플래그를 인자로 전달하면 원하는 사이즈를 계산해 줄 꺼라 생각할 수 있지만, 실제로는 그렇지 않다
.
SM_CXMAXIMIZED(SM_CYXMAXIMIZED)
값은 Primary 모니터에서 top-level Maximized되었을 때의 윈도우의 사이즈를 리턴 한다
.
원하는 바와 같은 내용인 것 같지만, 테스트 해보면 다른 값이 나옴을 알 수 있다
.
우선 해당 사이즈를 얻은 후 MoveWindow를 해 보면, right bottom이 예상했던 영역을 몇 픽셀씩 벗어난다. 해당 윈도우를 최대화 했을 경우에는 예상했던 영역에 표시된다
.
그런데 spy로 확인해보면, 두 경우의 윈도우 사이즈가 동일하다
.
왜 이런 현상이 발생하는지는 알수 없지만, 어찌됬든 위의 값을 사용할 수는 없다는 얘기다
.
해답은
SM_CXFULLSCREEN(SM_CYFULLSCREEN)에서 찾을 수 있다.( 이 플래그를 이용하라는 얘기가 아니다
.)
이 플래그를 MSDN에서 찾아보면 풀 스크린 윈도우의 클라이언트 width,height를 리턴 한다고 되어있다. 그리고 친절하게도
태스크 바나 응용프로그램 태스크 바의 영역을 제외한 크기를 얻으려면, SystemParametersInfo( , SPI_GETWORKAREA )를 사용하라고 명기되어 있다
.
이 함수를 이용하면 원하는 값을 얻을 수 있다.


다음은 내 컴퓨터에서 테스트한 각 함수호출의 결과값이다.
테스트 PC 해상도는 1680*1050이다.

GetSystemMetrics( SM_CXSCREEN ) = 1680;
GetSystemMetrics(
SM_CYSCREEN
) = 1050;
GetSystemMetrics(
SM_CXMAXIMIZED
) = 1688;
GetSystemMetrics(
SM_CYMAXIMIZED
) = 1030;
GetSystemMetrics(
SM_CXFULLSCREEN
) = 1680;
GetSystemMetrics(
SM_CYFULLSCREEN ) = 1003;

 

RECT rcWorkArea;
SystemParametersInfo(
SPI_GETWORKAREA
, 0, &rcWorkArea, 0 ) ;
rcWorkArea.right - rcWorkArea.left = 1680;
rcWorkArea.bottom - rcWorkArea.top = 1022;

결국 대부분의 간단한 문제에 대한 해답은 MSDN에 있다.~.

 

 

반응형

'Windows Programming' 카테고리의 다른 글

듀얼 모니터에서의 좌표값 확인  (1) 2008.07.04
COM DLL만으로 tlb파일 생성및 COM사용하기  (0) 2008.04.28
Afx의 의미  (0) 2008.04.14
[MFC] Windows Control 제어  (0) 2008.03.31
MFC 전역함수  (0) 2008.03.30
반응형

Windows Control 제어

 

[체크박스]

CButton *pCheck = (CButton *)GetDlgItem( IDC_CHECK );

if ( pCheck->GetCheck() == 1 )

{

           // checked

}

else

{

           // Unchecked

}

 

[리스트박스]

CListBox *pList = (CListBox *)GetDlgItem(IDC_LIST);

pList->AddString("List Item");

pList->GetText(pList->GetCurSel(), str);

 

[콤보박스]

CComboBox *pCombo = (CComboBox *)GetDlgItem(IDC_COMBO);

pCmbo->GetLBText(pCombo->GetCurSel(), str);

 

[리스트뷰]

//자동스크롤
m_ListView.EnsureVisible( iRow, FALSE);

반응형

'Windows Programming' 카테고리의 다른 글

듀얼 모니터에서의 좌표값 확인  (1) 2008.07.04
COM DLL만으로 tlb파일 생성및 COM사용하기  (0) 2008.04.28
Afx의 의미  (0) 2008.04.14
스크린 크기 구하기  (0) 2008.04.02
MFC 전역함수  (0) 2008.03.30
반응형

Debug-Mode : 메모리의 의미

 

초기화 하지 않은 변수는 쓰레기 값으로 채워진다” C/C++책을 한번이라도 주의 깊게 보신 분이라면 한번쯤 접해 보셨을 문구라고 생각됩니다.

 

하지만 (디버그 빌드에 한하여)이 쓰레기 값이 어떤 의미 있는 값이라는 것은 알고 계신가요?

이 의미 있는 값에 대해 일부 정리 해 보려 합니다.

 

Memory

설명

0xCDCDCDCD

할당된 Heap메모리에 채워지는 값(초기화하지 않을 경우)

0xFDFDFDFD

할당된 Heap의 경계(,)에 채워지는 값

0xDDDDDDDD

0xFEEEFEEE

Free Heap메모리에 채워지는 값

0xCCCCCCCC

스택에 할당된 메모리에 채워지는 값(초기화하지 않을 경우)

해당 값은 어셈블리 __asm int 3(break)와 동일하여 이 영역을 접근하면 break point에 적중된다.

 

그렇다면 우리는 해당 메모리 값을 통해 어떤 도움을 받을 수 있을까요?

 

디버거가 자체 적으로 위 메모리의 값을 기준으로 오류 판단을 하기도 할 뿐아니라,

디버깅 상황에서 몇가지 도움을 얻을 수는 있을 듯 합니다.

 

예를 들어 메모리를 엑세스 할 때 에러가 발생할 때,

해당 메모리가

n  0xCDCDCDCD로 채워져 있다면, 해당 메모리를 초기화 하지 않고 사용했을 가능성을 용의 선상에 올려 놓을수 있을 테고,

n  0xFEEEFEEE로 채워져 있다면 이미 해제된 메모리를 참조하고 있음을,

n  할당한 메모리의 전/후 경계 부분이 0xFDFDFDFD값이 아니라면 메모리의 범위를 넘어선 write동작을 했음을 유추 할 수 있을 듯 합니다.

 

문제에 대한 완전한 해결책은 될수 없더라도, 적어도 발생한 문제에 대한 한가지 체크 지점을 발견 할 수도 있다는 얘기가 되겠죠.

 

 

ü  메모리 디버깅 관련 참고URL
http://cafe.naver.com/ddugi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=22
&

 

 

반응형

+ Recent posts