Windows 콘솔 애플리케이션에서 실패한 파일 핸들 디버깅

Windows 콘솔 애플리케이션에서 실패한 파일 핸들 디버깅

PuTTY를 DLL로 사용하는 콘솔 응용 프로그램이 있는데 문제의 PuTTY 라이브러리를 디버깅해야 합니다.

UNIX에서는 strace <command>.

strace ls ggg

다음과 같이 인쇄됩니다.

stat("ggg", 0x166b0d0)                  = -1 ENOENT (No such file or directory)

ggg현재 디렉터리에 이름이 지정된 파일이나 디렉터리가 없기 때문입니다 . Windows 콘솔 응용 프로그램에는 이것이 필요합니다.

온라인으로 검색하여 디버깅 도구가 포함된 Windows SDK를 다운로드했습니다. 여러 프로그램을 사용해 보았는데 cdb이 프로그램이 나에게 필요한 것 같습니다.

내가 필요한 cdb -o "!htrace -enable" <command>것 같지만 명령이 실패하거나 파일 열기 시도가 실패한 이유에 대한 힌트를 제공하지 않기 때문에 뭔가 빠진 것 같습니다. ( <command>파일을 로드하는 경우 성공해야 하지만 <command>파일 경로가 아닌 "세션" 이름을 원하면 해당 세션 이름으로 파일 또는 등록 키를 찾습니다):

CommandLine: <command>
Symbol search path is: srv*
Executable search path is:
ModLoad: 00400000 004a7000   image00400000
ModLoad: 77d00000 77e8d000   ntdll.dll
ModLoad: 77aa0000 77b70000   C:\WINDOWS\SysWOW64\KERNEL32.DLL
ModLoad: 748e0000 74ab7000   C:\WINDOWS\SysWOW64\KERNELBASE.dll
ModLoad: 779d0000 77a36000   C:\WINDOWS\SysWOW64\WS2_32.dll
ModLoad: 77b70000 77c2e000   C:\WINDOWS\SysWOW64\RPCRT4.dll
ModLoad: 74720000 74740000   C:\WINDOWS\SysWOW64\SspiCli.dll
ModLoad: 74710000 7471a000   C:\WINDOWS\SysWOW64\CRYPTBASE.dll
ModLoad: 74f00000 74f57000   C:\WINDOWS\SysWOW64\bcryptPrimitives.dll
ModLoad: 75d10000 75d53000   C:\WINDOWS\SysWOW64\sechost.dll
ModLoad: 757c0000 75838000   C:\WINDOWS\SysWOW64\ADVAPI32.dll
ModLoad: 776b0000 7776d000   C:\WINDOWS\SysWOW64\msvcrt.dll
(2f550.32120): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll -
eax=00000000 ebx=00000010 ecx=44ce0000 edx=00000000 esi=00249000 edi=77d06964
eip=77dadbcf esp=00cafa0c ebp=00cafa38 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrInitShimEngineDynamic+0x6af:
77dadbcf cc              int     3
0:000> cdb: Reading initial command '!htrace -enable'
Handle tracing enabled.
Handle tracing information snapshot successfully taken.
0:000>

기본적으로 pscp.exe(puTTY scp)가 Windows에서 세션을 로드하는 위치를 찾으려고 합니다. 이 경우 해당 질문에 대답하는 것은 도움이 되지 않습니다. 이해한 바에 따라 핸들을 추적할 수 있는 방법을 알고 cdb싶습니다 htrace. 프로그램이 완료되었거나 명령을 시작하기 위해 뭔가를 입력해야 하고(확실하지 않음) 디버거 내에서 옵션을 사용하여 새 프로세스를 만들려고 시도했지만 여전히 DLL만 로드되고 다른 것은 로드되지 않습니다.

나는 시도 logger.exe <command>했고logger.exe -o <command>스택 오버플로에 가장 가깝다고 말하면 strace와 마찬가지로 DLL이 나열됩니다 cdb. 에서는 windbg8개의 파일 핸들을 볼 수 있지만 파일 경로에 대한 정보는 없습니다...

죄송합니다. 저는 Linux 사용자이므로 버릇이 없어서 strace옵션 없이 트릭을 수행합니다.

내가 읽고:

https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-handle https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/cdb-command-line-options https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-a-user-mode-process-using-cdb https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-create--create-process-( <command>디버거가 로드된 후 시도하고 실행하기 위해) ... 그리고 몇 가지 더 ...

답변1

현재 이해하기 매우 어려울 수 있지만 궁극적으로 많은 세부 정보를 제공하는 실제 디버그 도구를 사용하고 있습니다. 이를 수행하려는 목적에 따라 더 간단한 도구를 사용하여 필요한 정보를 얻는 것이 옵션일 수 있습니다.

Windows의 경우 "sysinternals 제품군" 실제 디버그 도구를 사용하여 얻는 모든 디버그 출력을 이해하지 않고도 도움이 될 수 있습니다.

특히 도구 핸들은 현재 열려 있는 파일을 사용하는 것이 무엇인지 파악하는 데 도움이 될 수 있습니다. 프로세스 모니터는 현재 실행 중인 프로그램이 수행하는 많은 작업에 대한 실시간 피드를 표시합니다. 주로 레지스트리 및 파일 작업에 중점을 둡니다.

프로그램이 어디에서 정보를 얻는지 파악하려면 프로세스 모니터를 사용하여 특정 프로그램의 작업만 표시하도록 설정할 수 있습니다. 도구 자체에는 다양한 유형의 작업과 해당 작업의 속성에 대한 필터링 옵션이 있습니다.

관련 정보