글쓴이 보관물: litcoder

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