Java プロジェクトの GDB ラッパーを作成しています。GDB のターゲット アプリケーションがユーザー入力を待機しているタイミングを特定する方法はありますか?
1 に答える
1
基本的に、POSIXシステムでは標準I/Oを疑似端末にリダイレクトする必要があります。その方法を以下に概説します。
次のような独立したスタンドアロンの「ランチャー」プログラムを作成します。
- UNIXドメインソケットを介してファイル記述子を受け取ります。
- stdin、stdout、およびstderrを、標準fork()、dup2()、execl()シーケンスを介して上記で受信したファイル記述子にリダイレクトします。
Java制御プログラムの場合:
- 1組の疑似端末を開きます (上記にリンクされているpty_fork.cの例も参照してください)。
- ランチャープログラムを開始します。プロセスIDをLAUNCHER_PIDに保存します。ランチャーは最終的にrecvmsg()でブロックし、新しいファイル記述子の受信を待機します。
- GDBで「setfollow-fork- modechild 」を実行します
- LAUNDHER_PIDに接続するようにGDBに指示します
- ptyのスレーブエンドをランチャープログラムに送信します。次に、ランチャーはrecvmsg()から戻り、fock()、dup2()、execl()シーケンスに進みます。
次に、デバッグ中のプログラムがユーザー入力を待機していることを検出できます。たとえば、ptyファイル記述子のマスターエンドをNIOチャネルに変換し、非ブロッキングモードに設定して、セレクターで書き込みを行うマスターptyを監視します。
Microsoft Windowsをサポートするには、別のコードパスが必要です。
于 2012-09-30T20:08:24.637 に答える