1) 드라이버 버젼과 심볼 매치

    - lmvm drivername 의 Time Stamp 확인

    - Dump분석 시, FullDump일 경우 드라이버의 버젼을 출력한 구문을 직접 찾는다.
        s -a StartAddr EndAddr(or Length) "Out Version Text"


2) 심볼의 강제 로드

    - .reload -i    
        강제 심볼 로드. -f 옵션이 묵시적 적용
        ex) .reload -i drivername.sys


    - .reload -i Driver Name=StartAddr,Length
        .reload -i로도 되지 않을 경우
        ex) .reload -i drivername.sys=0x00010000, 0x1000

windbg를 사용하다 보면 심볼 경로에 분명히 심볼의 위치를 써주었는데도 심볼을 로딩하지 못하는 경우가 있다. lm 명령어를 써서 현재 로딩된 심볼들을 확인해보면 심볼이 제대로 로딩이 되었는지 확인할 수 있다.
이 때 'deffered'라고 되어 있다면 ".reload -i <로딩할 모듈>" 명령어로 강제로 심볼을 올릴 수 있다. -i 옵션은 pdb 파일의 crc나 날짜에 상관없이 같은 이름의 pdb를 올리라는 의미이다. 이때는 자동으로 -f 옵션도 적용된다.
하지만 이렇게 해도 심볼을 로딩하지 못하는 경우가 있는데, 이 때는 약간의 꼼수가 통할 때도 있다. 현재 심볼을 다른 디렉토리로 옮겨서 다시 심볼 패스를 지정하고 심볼을 로딩하는 것이다. 이것은 논리적으로는 설명할 수는 없지만 경험학적으로 이것이 통할 때가 있다. 특히 심볼 패스 안에 네트워크 공유폴더가 있는 경우, 나의 로컬 컴퓨터로 복사를 해 오면 효과를 보는 경우가 많다. 그 이유뿐 아니라 네트워크 공유 폴더에 있는 심볼을 그대로 쓰게 되면, 물론 windbg의 help에는 충분히 잘 지원한다고 되어 있지만, 왠일인지 심볼을 로드하지 못하거나 로드를 해도 전혀 엉뚱한 곳을 짚고 있는 경우가 생긴다.(순전히 나의 경험학적인 이야기이다.) 따라서 될 수 있으면 윈도우 심볼과 자신이 개발하는 제품의 심볼은 디버깅을 수행하고 있는 컴퓨터의 로컬에 복사를 해 놓고 하는 것이 좋다.
디렉토리를 옮기고 로컬로 복사를 해서 강제로 심볼을 올리려고 해도 안 될 경우에는 ".reload -i" 다음에 디버깅하고자 하는 모듈의 시작 주소와 크기를 넣어준다.  모듈의 시작주소와 크기는 lmvm <모듈이름>으로 알 수 있다.
다음은 이 명령어를 windbg에서 실행한 모습이다.

0:035> lmvm ntdll
start    end        module name
7c930000 7c9cc000   ntdll      (pdb symbols)          c:\symbol\ntdll.pdb\36515FB5D04345E491F672FA2E2878C02\ntdll.pdb
    Loaded symbol image file: C:\WINDOWS\system32\ntdll.dll
    Image path: C:\WINDOWS\system32\ntdll.dll
    Image name: ntdll.dll
    Timestamp:        Wed Aug 04 16:53:05 2004 (411095E1)
    CheckSum:         0009BD3A
    ImageSize:        0009C000
    File version:     5.1.2600.2180
    Product version:  5.1.2600.2180
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0412.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Windows® Operating System
    InternalName:     ntdll.dll
    OriginalFilename: ntdll.dll
    ProductVersion:   5.1.2600.2180
    FileVersion:      5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
    FileDescription:  NT Layer DLL
    LegalCopyright:   ⓒ Microsoft Corporation. All rights reserved.

ntdll의 정보를 본 것인데, 여기서 start 항목에 있는 주소가 시작주소가 되며, image size가 모듈의 크기가 된다. ntdll의 경우, 7c930000에서 시작하고 이미지크기는 9c000이 된다.
이 정보를 알게 되면 ".reload -i ntdll.dll=7c930000,9c000"과 같이 명령을 내리면 강제로 심볼을 로딩할 수 있다.


[출처] http://sixthman.tistory.com/tag/symbol

 

Posted by 울랄라베베
:

카테고리

분류 전체보기 (20)
Kernel programming (13)
User porgramming (2)
Etc... (2)