태그 보관물: WinDbg

[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: