Отладка неудачных файловых дескрипторов в приложении Windows Console
328
user2531336
У меня есть консольное приложение, которое использует 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>имя «сеанса», а не путь к файлу, он затем ищет файл или ключ reg с этим именем сеанса):
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 (шпатлевка УПП) загружает сессию на Windows, в данном случае - ответить на этот вопрос не поможет, я хочу знать, как я могу отслеживать ручки, от моего понимания, cdbпозволяет htraceпосле программа завершилась, или мне нужно что-то набрать для запуска команды (не уверен), я даже пытался создать новый процесс с опциями без использования отладчика, по-прежнему загружались только DLL, и ничего больше.
Я попытался, logger.exe <command>и logger.exe -o <command>поскольку stackoverflow говорит, что он ближе всего strace, он перечисляет библиотеки DLL, как cdbничего больше. В windbg, я вижу 8 файловых дескрипторов, однако никакой информации о путях к файлам ...
Извините, я парень из Linux, так избалованный, straceделает трюк без вариантов.
Более простой подход (так как его загрузка может быть либо из файла, либо из реестра) заключается в использовании соответствующего [инструмента sysinternals] (https://technet.microsoft.com/en-us/sysinternals/bb545027.aspx). В настоящее время вы находитесь на жестком пути отладки, что, вероятно, немного для того, что вы на самом деле пытаетесь сделать.
Seth 6 лет назад
1
дескриптор, кажется, самый близкий к тому, что я ищу, но он ожидает, что процесс останется ... здесь, процесс завершится примерно через 1 секунду ... даже `пока true; делайте дескриптор -p ; done`, где команда является частью имени, иногда печатает несколько ссылок на файлы, но ничего интересного (мне пришлось включить более высокую отладку, чтобы замедлить работу программы) ... Я нашел рассматриваемый ключ reg (НЕ был puTTY), ищущий регистр ... все еще ищу ` [] `так что программа Windows, которая запускает другую и распечатывает все действия файла / reg дочернего элемента, ala` strace`.
user2531336 6 лет назад
0
Process Monitor из этого набора инструментов будет показывать вам живые данные (и записи) о том, какие файлы затрагиваются программами. Вы можете отфильтровать его до одного исполняемого файла. Это не консольное приложение, хотя. Извините, я не особо коснулся обычных средств отладки для Windows.
Seth 6 лет назад
1
Я вижу предлагаемое изменение в отношении моего ответа от вас. Хотя на самом деле не имеет смысла добавлять его к ответу как редактирование. В конце концов, я не знаю, о чем ты думаешь. Так как он на самом деле имеет больше входных данных, возможно, стоит рассмотреть возможность размещения его как независимого ответа (ссылаясь на мой) или как (несколько) комментариев. Один из этих вариантов, вероятно, подойдет.
Seth 6 лет назад
0
1 ответ на вопрос
1
Seth
В настоящее время вы используете настоящие инструменты отладки, которые могут быть довольно сложными для понимания, но в конечном итоге предоставляют много деталей. С вашей целью это может быть возможность использовать более простой инструмент для получения необходимой информации.
Для Windows существует довольно много инструментов, известных как « набор sysinternals », которые могут помочь вам, не требуя понимания всех результатов отладки, которые вы получаете с фактическими инструментами отладки.
В частности, дескриптор инструмента должен помочь вам выяснить, что использует открытый в данный момент файл. В то время как монитор процесса покажет вам прямую трансляцию множества действий, выполняемых в настоящее время программами. В основном сосредоточены на реестре и файловых операциях.
Чтобы выяснить, откуда программа получает информацию, вы можете попробовать использовать монитор процессов и настроить его так, чтобы он отображал только действия определенной программы. Сам инструмент имеет параметры фильтрации для различных типов действий, а также для свойств этих действий.