在 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,有很多可用的工具,稱為“系統內部套件」這可以幫助您,而無需了解使用實際調試工具獲得的所有調試輸出。

特別是,工具句柄應該能夠幫助您找出正在使用目前開啟的文件的內容。雖然進程監視器會向您即時顯示目前正在運行的程式執行的許多操作。主要關注註冊表和文件操作。

要弄清楚程式從哪裡獲取信息,您可以嘗試使用進程監視器並將其設定為僅顯示特定程式的操作。該工具本身俱有針對各種類型的操作以及這些操作的屬性的過濾選項。

相關內容