У меня есть консольное приложение, которое использует 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
, ничего больше. В windbg
, я вижу 8 дескрипторов файлов, однако, никакой информации о путях к файлам ...
Извините, я 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 набор", которые могут вам помочь, не требуя понимания всех отладочных результатов, которые вы получаете с помощью реальных инструментов отладки.
В частности, дескриптор инструмента должен помочь вам выяснить, что использует текущий открытый файл. В то время как монитор процесса покажет вам прямую трансляцию множества действий, которые выполняют текущие запущенные программы. В основном сосредоточен на операциях с реестром и файлами.
Чтобы выяснить, откуда программа получает информацию, вы можете попробовать использовать Process Monitor и настроить его так, чтобы он показывал вам только действия определенной программы. Сам инструмент имеет параметры фильтрации для различных типов действий, а также для свойств этих действий.