반응형
WinDbg Vista에서 디버그 프린트 출력하기

출처: http://greemate.tistory.com/81

greemate님의 홈페이지 에서 가져왔습니다.

VISTA 에서 디버그 메시지가 기본적으로 꺼져 있다는 것 알고 계시지요?
Windows Server 2008 도 마찬가지구요.

까먹구 있었는데 디버깅하다가 보니 DbgPrint/KdPrint 로 출력한 디버그 메시지가 안나오더라구요.
어떻게 켜는지 확인해 보니 WinDbg 명령창에서 아래와 같이 Kd_DEFAULT_MASK 를 수정하면 되더군요.
다음 번에 또 찾기 귀찮아서 여기에 적어 둡니다.

* DPFLTR_INFO_LEVEL 로 켜고 싶을 때
kd > ed Kd_DEFAULT_MASK 8

* DPFLTR_ERROR_LEVEL 로 켜고 싶을 때
kd > ed Kd_DEFAULT_MASK 0xF

* 디버그 메시지를 끄고 싶을 때
kd > ed Kd_DEFAULT_MASK 0

8 로 해도 제가 DbgPrint 한 메시지들은 모두 나오더군요.
참고하시기 바랍니다.

자세한 내용은 아래 링크에 있습니다.
http://www.osronline.com/article.cfm?article=295


http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=1&s_bulu=&s_key=&no=101
반응형
반응형

디버깅시 Local 변수값이 표시되지 않는 경우

 

WinDbg로 디버깅시 Local변수가 확인이 안되는 문제가 발생했다.
아니 지금까지 계속 그랬는데 오늘 눈에 띄었다.

빌드도 정상이고 동작도 정상인데, 코드에 BreakPoint를 걸어 디버깅을 시도해 보니

멀쩡히 선언되어 있는 로컬변수가 Locals Winodw에 표시가 되지 않는것 아닌가?
dv
명령어를 쳐봐도 해당변수에 대한 정보가 없다
.
그렇다고 다 안보이는 것도 아니고 3개중 1개만 안보인다
.

-
빌드 옵션의 문제가 아닌가하는 생각에, DDK 빌드관련 페이지를 검색
...

덕분에 VC6.0을 이용해서 드라이버를 빌드할 수 있는 방법을 찾긴했으니 삽질은 아니었다
.
Go To Definition
등의 메뉴를 사용할 수 있어 편하겠다만은 빌드옵션이 넘 복잡하고

하나 하나 뜯어볼 형편이 안되는 관계로 우선은 그냥 예전방식을 사용할란다.
(
궁금하신 분은
http://www.codeproject.com/KB/applications/driverwizard.aspx를 참고하시라
.)

지금 쓰는 방식은 makefile Project를 이용해서 IDE 환경만 빌리는 방식이다 - (이 방법은 Chris Cant Windows WDM Driver Model에 보면 나와 있다
)

-
아무튼 코드프로젝트의 위자드를 사용하니, 로컬변수가 모두 표시된다
.
-
두개를 비교해본다
.
-
동일한 코드를 빌드했음에도 확실히 차이가 난다
.
-
위자드를 쓰는 방법밖에는 없는건가
?

저녁을 먹고 올라오다 불현듯, 얼마전에 본 소스의 첫째줄이 생각났다
.
#pragma optimize("", off)
이 한줄이다
.
아마도 optimize되는 과정에서 로컬변수에 대한 디버깅 정보가 빠지는건 아닐까
???

[
덧붇임: 2008.07.23]

최적화와 로컬변수 디버깅정보 누락에 대한 해답이 될만한 포스트를 찾았다.
자세한 정보는 링크를 참조
.!!!
http://blog.naver.com/process3?Redirect=Log&logNo=20036617483

---- 발췌 ----
3
번 원본 코드를 최적화 옵션을 주고 컴파일 하고 default로 컴파일 했을 때의 차이를 쉽게 알 수 있습니다.
, 최적화를 사용하면 사용하지 않는 로컬 변수등을 컴파일러가 스스로 제거하고 최소한의 코드를 만듭니다., 적은수의 OPCODE를 만들어서 CPU 부하를 줄입니다.

그러나, 최적화는 양날의 검입니다. 최적화 옵션을 사용하면 차후에 덤프 디버그 할때 FPO 등과 로컬 변수등이 제대로 나오지 않아서 디버깅 하는것이 상당히 어려워 집니다

[
덧붇임: 2009.07.21] - by 좋은향기
최적화 옵션으로 빌드할 경우,
지역변수 정보뿐만 아니라, 간단한 함수의 경우 스택프레임 구성이 생략될수 있다.

 

 

반응형
반응형

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;

사용자 삽입 이미지
   


반응형
반응형

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
&

 

 

반응형
반응형

Watch window formatting Symbols

변수의 값을 확인하기 위해 사용하는 VC++Watch Window에서 변수의 값을 원하는 형태로 출력하는 Formatting Symbol에 대해 정리합니다.

 

n  Number

Symbol

Format

d,i

signed decimal integer

u

unsigned decimal integer

o

unsigned octal integer

x,X

Hexadecimal integer


 

n  String

Symbol

Format

s

String

su

Unicode string

st

Unicode string or ANSI string, depending on Unicode Strings setting in autoexp.dat.



 

n  Memory

Symbol

Format

ma

64 ASCII characters

m

16 bytes in hexadecimal, followed by 16 ASCII characters

mb

16 bytes in hexadecimal, followed by 16 ASCII characters

mw

8 words

md

4 doublewords

mq

4 quadwords

mu

2-byte characters (Unicode)

 

 

 

 

 

 

 


 

n  상수

Symbol

Format

hr

HRESULT Code

wm

Window Message

 

 

 




 

n  기타

Symbol

Format

@err

LastErrorCode

@eax

Register Value

 

 


반응형

+ Recent posts