在 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,仅此而已。在 中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,有很多可用的工具,称为“系统内部套件“这可以帮助您,而无需了解使用实际调试工具获得的所有调试输出。

具体来说,工具句柄应该能够帮助您找出当前打开的文件正在使用什么。而进程监视器会向您显示当前正在运行的程序执行的许多操作的实时信息。主要侧重于注册表和文件操作。

要弄清楚程序从哪里获取信息,您可以尝试使用进程监视器并将其设置为仅显示特定程序的操作。该工具本身具有针对各种操作类型以及这些操作属性的过滤选项。

相关内容