태그 보관물: windows

Windows DLL loading 실패 디버깅

Windows programming 중에 DLL loading을 실패해서 오류가 발생하면 문제가 생겼다는 에러코드(0xc0000135)만 출력되고 어떤 것이 실패했는지 또 어느 곳을 찾아 봤는지에 대한 정보는 자세히 알려주지 않는다.

Windows SDK에 포함된 gflags.exe(Global Flags)를 이용하면 DLL loading에 대한 세부정보를 볼 수 있다. gflags.exe가 실행하는데 admin권한을 필요로 하기 때문에 관리자 권한으로 터미널을 띄우고 Windows SDK안에 포함되어 있는 gflags.exe를 다음과 같이 실행해서 세부 내역을 보고 싶은 실행파일의 이름과 sls(Show Loader Snaps) option을 명시 해준다.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe -i <프로그램이름.exe> +sls
Current Registry Settings for <프로그램이름.exe> executable are: 00000002
    sls - Show Loader Snaps

다시 Visual studio로 돌아와서 프로그램을 실행하면 Output window에 DLL loading에 실패한 라이브러리의 이름과 시도해본 path들에 대한 세부정보가 표시된다.

8e9c:55d4 @ 621281687 - LdrpFindKnownDll - ENTER: DLL name: <실패하는 라이브러리>.dll
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - RETURN: Status: 0xc0000135
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - ENTER: DLL name: vccorlib140d_app.DLL
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - RETURN: Status: 0xc0000135
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - ENTER: DLL name: MSVCP140D_APP.dll
8e9c:55d4 @ 621281687 - LdrpFindKnownDll - RETURN: Status: 0xc0000135

이전 상태로 되돌리려면 옵션을 `-sls`로 변경해서 다시 한 번 gflgas.exe를 실행해 주면 된다.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe -i ieproxytest.exe -sls
Current Registry Settings for ieproxytest.exe executable are: 00000000

[Tip] WinDbg에서 경로가 다른 PDB의 source를 load하기

Windows에서 WinDbg로 디버깅할 때, PDB에 적혀있는 절대경로 때문에 다른 machine에서 빌드한 바이너리(dll/sys/exe)를 디버깅할 때는 소스가 맞지 않아 번거롭다. 이 것을 해결하는 방법으로 source indexing을 사용하라는 글이 있기는 했었는데 내가 뭐 배포정책을 바꿀만큼 힘이 있는 것도 아니고… 아주 약간(!) 지저분 하긴 하지만 Windows의 subst 명령어를 사용해서 PDB에 적힌 경로를 흉내내는 것으로 이 문제를 해결할 수 있었다.

PDB에 있는 절대 주소와 내 로컬 소스의 주소가 각각 다음과 같다고 가정한다.

PDB path - D:\AAA\BBB\CCC\DDD\EEE\FFF\GGG
Local path - C:\ZZZ\YYY\XXX\EEE\FFF\GGG

즉, Local path의 EEE directory에 PDB path EEE가 연결되도록 만들면 된다. D:가 유효하다면 그걸 사용하면 되지만, 이 글에서는 C:만 사용가능한 상태라 가정한다.

먼저 C:에 가짜 디렉토리 ‘AAA\BBB\CCC\DDD’를 만든다. 꼭 C: 밑에 바로 만들지 않더라도 나중에 subst 명령어에서 경로 지정만 잘 해주면 된다. 상황에 따라 admin권한이 필요할 수도 있다.

CMD> mkdir c:\AAA\BBB\CCC\DDD

Local path에 있는 EEE 디렉토리로 link를 만든다.

CMD> mklink /d c:\AAA\BBB\CCC\DDD\EEE c:\ZZZ\XXX\YYY\EEE

마지막으로 subst 명령어를 이용해서 Local에 만든 가짜 directory를 D:로 연결한다. 이때는 admin 권한으로 실행하면 안된다. 일반 권한으로 다음을 수행하자.

CMD> subst d: c:

subst의 두번째 인자는 처음에 만든 가짜 디렉토리에 따라 필요한 경우 디렉토리명을 적어도 된다. 이제 d:로 이동해 보면 PDB와 동일하게 D:\AAA\BBB\CCC\DDD\EEE 경로가 유효한 것을 볼 수 있고, WinDbg에서 source loading도 제대로 동작한다.

해제

subst는 system을 reboot하면 해제된다. 필요한 경우 /d option으로 해제할 수 있다.

CMD> subst /d d:

XPS13에 MS Windows 설치2 –세부설정-

Mac mini의 사망진단과 더불어 8년여의 Mac OS X 생활 청산과 Windows 7으로 강제이주가 시작되었다.(이 포스트 참조) XPS13은 비교적 좋은 spec의 laptop 이지만, SSD가 작아서 이전에 쓰던 데이터를 모두 복사해 올 수는 없기에 필요한 것들만 c:에 넣고 나머지는 외장 디스크에 복사해 두고 쓰기로 했다. 다음은 Mac mini에서 XPS13(Windows 7)으로 돌아오는 과정을 메모한 것이다.

Data 가져오기

영화, 사진, 음악 등등의 data를 Windows로 가져 오려면 HFSExplorer의 도움이 필요하다. 가져올 대부분의 데이터는 계정 디렉토리 안에 있는데, iPhoto의 경우 “Users/계정명/Pictures/iPhoto 라이브러리” 경로에서 찾을 수 있다.

 

HSF+ disk를 format하기

기존에 Mac에서 사용해 오던 disk를 format하려고 partition을 지웠더니 “강제로 보호된 매개 변수 집합이 없이 보호된 파티션을 삭제할 수 없습니다.–Cannot delete a protected partition without the force protected parameter set는 메세지가 뜨면서 진행되지 않는다. 200MB 정도니까 그냥 버려도 되지만 찜찜하다면 이 post를 따라하면 삭제할 수 있다.

 

대체 Applications

* iPhoto
: iPhoto는 2015년 3월 현재 Mac용으로만 배포되므로 이를 대체할 application을 찾아야 한다. Google Picasa는 Google+ 계정과의 연동에서는 좋지만 나는 사진을 온라인에 올려두는 것을 그다지 좋아하지 않는다. 게다가 Picasa는 iPhone에서 찍은 *.mov file을 제대로 import하지 못하는 문제도 있어서 Windows Essentials에 포함된 MS Photo Gallery를 사용하기로 했다.

* FFView
: 만화책 뷰어는 워낙 유명한 꿀뷰가 있으니 별 고민 없이 설치.

* Automator
: Mac에서는 별다른 utiltity 없이 Automator로 파일 변환 등의 일괄 작업을 해왔는데 Windows에서는 개념상 좀 다르긴 하지만 유명한 Total commander가 있다. 그리고 어찌어찌해서 이것과 비슷한 무료 프로그램인 Multi commander를 찾았다.

 

Steam Library

250GB SSD는 게임을 저장하기에 여유로운 공간은 아니다. Steam의 설정 -> 다운로드 -> ‘콘텐츠 라이브러리’ 항목에서 외장 하드디스크로 게임 저장 공간을 설정해 줄 수 있다. 여기에 설정한 값은 game을 ‘설치’할 때 선택할 수 있는 list로 표시된다.

sc_steam_setting_lib_path

Bluetooth keyboard/mouse 사용

Dell XPS website에 있는 Bluetooth 관련 driver를 update해도 제대로 동작하지 않았다.

여기 저기 헤매다가 Intel website에서 “Intel Driver Update Utility“를 찾게 됐는데, 이 utility로 검색된 wireless와 bluetooth driver를 update하니 새로운 제대로 동작했다. Apple keyboard와 Magic mouse를 pariing하기 전에 Boot camp 지원 software 압축파일을 받아서 다음 파일들을 미리 설치해 둔 다음 진행하는게 좋다.

  • AppleKeyboardInstaller64.exe
  • AppleWirelessMouse64.exe

 

External display 사용과 wake up 문제

Windows7 기본설정은 뚜껑(lid)를 닫을 때 절전모드로 진입하게 되어 있다. “제어판\하드웨어 및 소리\전원 옵션\덮개를 닫으면 수행되는 작업 선택”에서 ‘덮개를 닫을 때’ 항목을 조절하면 lid를 닫을 때도 상태를 유지할 수 있다.

sc_xps13_win7_lid_closing_options그리고 lid를 연 상태에서는 절전모드에서 mouse에 의해 깨어나지만 닫은 상태에서는 깨어나지 못하는 문제가 있었는데, BIOS A10 version upgrade로 해결 되었다. BIOS와 upgrade utility는 Dell hompage에서 찾을 수 있다.

 

Ghost clicking(?)

뚜껑을 닫고 XPS13을 사용하다 보면 비 주기적으로 누르지도 않았는데 mouse click이 생긴다. 처음에는 Apple wireless mouse의 driver 문제인 줄 알고 driver를 삭제해 볼까 했는데 뚜껑을 열었을 때는 문제가 없어서 trackpad를 꺼봤더니 문제가 해결되었다;;;;

sc_xps13_trackpad_off

Update) 2015년 8월 현재, Dell website에 올려진 최신 트랙패드 드라이버를 설치하면 리드가 닫혔을 때 자동으로 트랙패드가 disable되고 열면 enable되므로 별도의 설정이 필요하지 않다.

XPS13에 MS Windows 설치 –Linux에서 되돌아 오기–

먼지 뒤집어 써가면 그 동안 수고해 주던 Mac mini가 KMUG 기사 아저씨로 부터 사망 판정을 받고 말았다. Logic board 불량인 것 같다며 수리 하는데 50만원 정도 든댄다. (2015년 3월 기준으로 Mac mini는 62만원 부터) 여러가지 고민한 끝에, Linux를 설치해서 사용해 오던 XPS13을 다시 Windows로 복귀 시키기로 했다.

Windows7과 필요한 프로그램을 구하기

Dell service center(080-860-9912)에 연락해서 Linux 설치 하느라 partition을 지웠는데 어떻게 Windows7으로 복구할 수 있는지 물어 보니 Windows7 iso image link와 함께 친절하게 설정 방법이 적힌 email로 보내 주셨다. 다만 Windows7 ISO image를 USB로 변환하는 것은 다른 software를 사용했는데, Rufus사용에 대한 자세한 내용은 이 링크를 참조 하면된다.

sc_rufus20_xps13_window7

Windows7 과 driver 설치

먼저 왼쪽 USB port에 위에서 만든 Windows 설치 USB driver를 넣고 부팅 중에 F12를 눌러 BIOS menu에 접근한다. BIOS 화면에서는 “Change BOOT mode to:” -> “LegacyBoot Mode, Secure Boot Off” 순서로 선택해서 Legacy BIOS 화면을 띄운 다음 USB를 선택하면 Windows7 설치가 시작된다.

Windows7 설치 후에는 XPS13용 driver들을 설치해야 하는데, 상담원께서 보내주신 email에 보면 driver에 대한 link들도 함께 들어 있다. 이것들을 다운로드 받아서 설치 하고나서 혹시나 있을지 모를 업데이트를 설치하기 위해 Dell website의 “드라이버 및 다운로드” page에서 ‘Dell Update Application ‘을 설치 해 두었다.

Windows7 설치 직후에는 video뿐만 아니라 유/무선 network도 못 잡는 깡통이므로 다음 두 개의 드라이버는 설치 전에 따로 받아 두는게 좋다.

Bluetooth는 Dell website에 등록된 driver를 설치해도 잘 동작하지 않았는데 Intel driver update utility로 설치하니 잘 동작 했다.

다음은 설치 후 확인한 Windows 7 체험 지수, 그래픽 빼고는 체험 지수 결과가 그럭저럭 잘 나온다. 실제로 Starcraft2를 실행 시켰을 때 시네마틱 영상에서 안습의 렌더링을 보여 주긴 했으나, game이 돌아가기는 한다.

sc_win7perf_xps13