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では、「sysinternals スイート「実際のデバッグ ツールで得られるすべてのデバッグ出力を理解しなくても、役立つ可能性があります。」

特に、ツール ハンドルは、現在開いているファイルを使用しているものを把握するのに役立ちます。プロセス モニターは、現在実行中のプログラムが行う多くのアクションのライブ フィードを表示します。主にレジストリとファイルの操作に焦点を当てています。

プログラムがどこから情報を取得しているかを把握するには、プロセス モニターを使用して、特定のプログラムのアクションのみを表示するように設定することができます。ツール自体には、さまざまな種類のアクションとそれらのアクションのプロパティのフィルター オプションがあります。

関連情報