C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[995] 디버깅 중에 해당 변수가 가르키는 메모리 번지부터 덤프해 보기.
김태선 [cppbuilder] 11799 읽음    2010-07-12 21:45
가령 다음과 같은 코드가 있다고 합시다.

{
    void *pFileInfo = (void*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwVersionInfoSize); // 1
    GetFileVersionInfo(filename.c_str(), dwHandle, dwVersionInfoSize, pFileInfo); // 2
    ... // 3
}

3번 줄에 브레이크 포인트를 걸어 놓은 뒤,
pFileInfo 내에 적제된 값을 메모리 덤프해서 한번 보려고 합니다.
어떻게 하면 될까요?
어떤 분은 이걸 보기 위해 무식하게 간단히 Hex Dump 메소드를 만든뒤 화면에 찍어서 확인하더군요.
예? 저만 그런다구요? 아. 그렇군요.

빌더 메뉴에서 Run->Evaluate/Modify를 선택하거나 CTRL+F7을 누릅니다.
그리고 Expression에
*(byte *)pFileInfo, 100m 또는
*(byte *)pFileInfo, 100x
라고 입력한 뒤 Enter 치면 화면에 그 내용이 100바이트 덤프 됩니다.

pFileInfo는 void * 형이니 덤프가 되지 않습니다.
그래서 (byte *)형으로 캐스팅한 뒤, 다시 그 내용을 덤프 해야 하므로  앞에 * 를 붙였습니다.
C 언어 표현 방법과 같죠.
*를 붙이지 않으면, pFileInfo가 가르키는 번지의 덤프가 아니라 pFileInfo 변수가 위치한 번지의 내용이 덤프됩니다.
C 언어 표현 방법과 같으므로
*((byte *)pFileInfo+10), 10m 식으로 10번지 뒤의 내용부터 10바이트만 덤프하라는 식도 됩니다.

그리고, 100m은 100바이트를 덤프하라는 뜻인데, 8바이트만 덤프하고 싶으면 8m 이라고 하면 되겠죠.

이건 Run->Evaluate/Modify의 Help만 읽어 봐도 사실 알수 있는 내용입니다.
하지만 필요한데 안쓰시는 분도 계셔서 한번 올려 봤습니다.

참고로
, 숫자m 대신에

, d 는 십진수 가령 *(byte *)pFileInfo, 10d 하면 10바이트를 10진수로 덤프합니다.
*(byte *)pFileInfo, d 라고 하면 그냥 10진수로 한바이트만 보여주겠죠.

구조체 형식으로 덤프해 보고 싶을 때는
*(VS_FIXEDFILEINFO *)pFileInfo, r
식으로 해당 구조체로 캐스팅 한 뒤 , r 을 붙이면 됩니다.
물론 이 경우도 구조체를 몇개 연속해서 덤프해 보고 싶으면
*(VS_FIXEDFILEINFO *)pFileInfo, 3r
식으로 3개를 연속해서 덤프해 볼 수도 있습니다.

그럼.
장성호 [nasilso]   2010-07-12 23:41 X
Good~~!

정말 멋진 팁입니다.

Watch리스트에도 똑같은 방식으로 추가해서 볼수 있네요

+ -

관련 글 리스트
995 디버깅 중에 해당 변수가 가르키는 메모리 번지부터 덤프해 보기. 김태선 11799 2010/07/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.