Create TOC

2005년 12월 27일

WinDbg/Userdump

다운로드

WinDbg/DrWatson32

  1. drwtsn32 -i
  2. drwtsn32을 실행하고 아래처럼 설정

덤프 파일은 아래 경로에 저장된다.(기본값)

C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson\user.dmp

WinDbg/Kernel Memory Dump 설정

내 컴퓨터에서

속성 -> 고급 -3 시작 및 복구 의 설정 화면에서 아래 그림처럼 설정 후 재부팅하면 된다.

WinDbg

Symbol setting

OS 심볼 설정

.symfix c:\symbol\winsym

기타 심볼

적당한 폴더에 pdb를 넣고 File-Symbol File Path 메뉴에서 추가로 등록해준다.

기본 명령

  • k : for stack
  • ~ : list all thread
  • ~ <tid> : changes to specific thread number
  • ~*kb : lists the stacks for all threads in a process
  • ~<tid>kb : list the stack for <tid> thread
  • g : go
  • ln <address> : address로부터 근접한 함수를 찾아줌. symbol 필요. stack dump를 떠서 손으로 call stack을 추척할때 필요하다.
  • dump /f <filename> : create memory dump
  • lm : list module. see .hh lm
  • lmvm 모듈명 : 모듈에 대한 정보를 얻는다.
  • .hh <command> : help
  • dt 구조체명 [주소] : 구조체의 실제 구성내용을 보여준다. [주소] 가 생략되면 prototype을, [주소] 가 주어지면 구조체의 멤버변수 값을 보여준다.

덤프 분석

커널 덤프 경우

기본 OS 설정에서는 BSOD 발생시 풀 덤프를 만들어주지 않는다. BSOD를 분석하기 위해서는 반드시 풀 덤프가 생기도록 Kernel Dump 설정 해줘야 한다.

  1. ''!analyze -v'' 명령을 통해서 나온 오류 코드를 도움말에서 찾아서 분석한다.
  2. !processs 이녀석이 관련된 process.

그 외에 Kernel Memory Space Analyzer도 도움이 된다.

User 덤프 경우

Dr.Watson32UserDumpUserDump는 업데이트가 되지 않기 때문에 SysInternals의 procdump를 사용하는 것이 더 좋다를 사용해서 풀 덤프를 받아온다.

Interactive Debugging

example) 임의의 모듈에 break 걸기

  1. process attach
  2. break
  3. x user32!Message* : 현재 attach한 process가 user32 를 load 하고 있을때 user32의 Message 로 시작하는 함수 목록을 출력
  4. bp <주소> 또는 bp 모듈명!함수이름 : 위에서 원하는 함수에 대한 주소를 얻어서 break. break point 목록은 bl, 지울때는 bc
  5. bu <module>!<function> : module이 load되기 전에 breakpoint를 설정하고 싶을 때 사용한다.
  6. g

원격 디버깅

문제가 발생하는 PC와 개발자가 사용하는 PC에 각각 WinDbg를 설치하고 문제가 되는 PC에서 아래와 같이 WinDbg를 실행한다.

windbg.exe -server tcp:port=사용할포트

그 뒤에 개발자 PC에서 아래와 같이 입력하면 개발자 PC에서 원격으로 디버깅을 할 수 있다.

windbg.exe -remote tcp:server=WinDbg서버IP,port=포트

Call stack 해석

WinDbg의 call stack에서는 parameter를 3개까지밖에 표시해 주지 않는다. 추가적인 parameter는 clientEBP 값을 가지고 계산하면 된다.

  • 첫번째 인자는 EBP + 0x8
  • 두번째 인자는 EBP + 0xc

이런식으로 주소를 4씩 증가시키면서 보면 된다.

메모리 특정 영역 값이 변경될때 break 걸기

ba w4 address

유용한 링크

2005년 5월 15일

C++/typename

아래와 같은 소스가 있을때

#include <iostream>
#include <vector>

using std::vector;

template<class T>
class TemplateTest
{
	public:
		TemplateTest() {}
		virtual ~TemplateTest() {}
		void foo(vector<T>& vec)
		{
			vector<T>::iterator it;
			vector<T>::iterator end = vec.end();
			for (it = vec.begin(); it != end; ++it)
			{
			}
		}
};

int main (int argc, char **argv)
{
	return 0;
}

컴파일 하면 아래와 같은 경고가 뜬다.

$ g++ testt.cc
testt.cc: In member function `void TemplateTest<T>::foo(std::vector<T, std::allocator<_CharT> >&)':
testt.cc:14: warning: `std::vector<T, std::allocator<_CharT> >::iterator' is implicitly a typename
testt.cc:14: warning: implicit typename is deprecated, please see the documentation for details
testt.cc:15: warning: `std::vector<T, std::allocator<_CharT> >::iterator' is implicitly a typename
testt.cc:15: warning: implicit typename is deprecated, please see the documentation for details

표준에 따르면

14.6/2 A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.

즉 위 소스 중에서

vector<T>::iterator it;
vector<T>::iterator end = vec.end();

이 부분을 아래과 같이 수정해야 한다.

typename vector<T>::iterator it;
typename vector<T>::iterator end = vec.end();

2005년 3월 8일

USB형태의 메모리 카드 리더기를 Linux에서 사용하기

디지털 카메라 등에서는 저장장치로 CF, MMC, MemoryStick 등을(이하 메모리카드) 사용한다. 이런 메모리카드를 PC에서 바로 사용하기 위해서 USB형태의 메모리카드 리더기를(이하 USB 리더기) 많이 사용한다.

이 문서는 USB 리더기를 Linux에서 사용하는 방법에 대해 설명한다.

커널 컴파일(2.4.x 기준)

USB 리더기를 사용하기 위해 커널의 scsi support 옵션과 usb support 옵션을 아래와 같이 변경 한다.

general setup

  1. Support for hot-pluggable devices (CONFIG_HOTPLUG=y)

scsi support

  1. SCSI Support (CONFIG_SCSI=m, scsi.o)
  2. SCSI disk support (CONFIG_BLK_DEV_SD=m, sd.o)
  3. SCSI generic support (CONFIG_CHR_DEV_SG=m, sg.o)

usb support

  1. Support for USB (CONFIG_USB=m, usb.o)
  2. Preliminary USB device file system (CONFIG_USB_DEVICEFS=y, devices.o?)
  3. 다음 중 1개 또는 그 이상(필요에따라): UHCI (CONFIG_USB_UHCI=m, usb-uhci.o), OHCI (CONFIG_USB_OHCI=m, usb-ohci.o)
  4. USB Mass Storage support (CONFIG_USB_STORAGE=m, usb-storage.o)

장치가 연결되었는지 확인하기.

USB 리더기를 컴퓨터에 연결한다.

커널 옵션을 제대로 설정하면 Linux에서 scsi 장비로 인식된다.

인식 여부를 알아보기 위해 sg3-utils 패키지를 설치 한다Debian 에서는 패키지가 제공된다

sg3-utils 를 설치한 후 아래 명령을 통해서 인식 여부를 알아볼 수 있다.

# sg_scan -i
/dev/sg0: scsi0 channel=0 id=0 lun=0 [em]  type=5
    LG        CD-ROM CRD-8400C  1.02 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg1: scsi1 channel=0 id=0 lun=0 [em]  type=0
    Generic   STORAGE DEVICE    0113 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg2: scsi1 channel=0 id=0 lun=1 [em]  type=0
    Generic   STORAGE DEVICE    0113 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg3: scsi1 channel=0 id=0 lun=2 [em]  type=0
    Generic   STORAGE DEVICE    0113 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg4: scsi1 channel=0 id=0 lun=3 [em]  type=0
    Generic   STORAGE DEVICE    0113 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]

4가지 메모리를 한번에 사용할 수 있는 USB 리더기를 사용하기 때문에 scsi 장치가 4개 (1번부터 4번) 인식되었다.

이제 인식된 장치가 어떤 block device 에 연결되는지 알아보자.

# sg_map
/dev/sg0  /dev/sr0
/dev/sg1  /dev/sda
/dev/sg2  /dev/sdb
/dev/sg3  /dev/sdc
/dev/sg4  /dev/sdd

1번 장치부터 sda 에 연결된 것을 확인할 수 있다.

/etc/fstab 설정

위의 내용을 보고 /etc/fstab 파일을 편집한다.

/dev/sda1   /mnt/cf     vfat    noauto,user     0   0
/dev/sdb1   /mnt/sm     vfat    noauto,user     0   0
/dev/sdc1   /mnt/mmc    vfat    noauto,user     0   0
/dev/sdd1   /mnt/ms     vfat    noauto,user     0   0

설정 완료

이제 모든 설정은 완료되었다. USB 리더기를 꼽고 mount 명령을 사용해서 일반 디스크처럼 사용할 수 있다. gnome 사용자라면 '디스크 마운트 애플릿' 을 사용하면 좀 더 쉽게 mount / unmount를 할 수 있다.

2005년 1월 12일

공인인증서, 안심결재 ISP 백업하기

공인 인증서나 안심결재 ISP를 백업할 때 매번 인증 관련 프로그램을 실행시키지 않고 간단히 파일 복사로 백업을 할 수 있다.

공인인증서

C:\Program files\NPKI 디렉토리 아래에 설치되어 있다OS/X에서는 /Users/사용자명/Library/Preferences/NPKI/Windows 7 부터는 %USERPROFILE%\AppData\LocalLow\NPKI.

다른 컴퓨터에 옮길 때 이 디렉토리를 통째로 복사하면 사용할 수 있다.

안심결재(ISP) vCard

C:\Winodws\Application Data\Vcard 디렉토리 아래에 설치되어 있다Windows 7 부터는 %USERPROFILE%\AppData\LocalLow\KVP\Application Data\Vcard.

다른 컴퓨터에 옮길 때 이 디렉토리를 통째로 복사하면 사용할 수 있다.