Cで記述されCentOS5.5で実行されているTCPSvrプロセスがあります。外部クライアントのTCPサーバーとして機能し、確立したUnixドメインソケットを使用してシステム内の他のプロセスとのIPC通信も行います。マルチスレッドプロセスではありません。一度に1つのタスクを実行します。TCPソケットまたは内部プロセスで確立されたIPCソケットのいずれかで要求をリッスンするために使用するepoll_wait()があります。epoll_wait()関数が壊れたら、誰でもリクエストを処理してからepoll_wait()に戻ります。
(IPCではなく)外部からこのプロセスに接続するTCPクライアントがあります。接続に成功し、要求メッセージを送信し、応答を返します。堅牢性などをテストするために、これを無限ループに入れました。
しばらくすると、TCPサーバーはTCPクライアントからの要求への応答を停止します。TCPクライアントは正常に接続し、要求メッセージを送信しますが、TCPサーバーから応答メッセージを返しません。
したがって、TCPサーバーがどこか別の場所でスタックしていて、何かをしようとして、epoll_wait()に戻って他の要求を処理していないと思います。ログを使用してそれを理解しようとしましたが、それは正確にどこを理解するのに役立ちませんプロセスがスタックしています。
そのため、プロセスが何をしているのかについて、情報を提供できるデバッガーを使用したいと思いました(関数名は素晴らしいでしょう)。ブレークポイントを設定すると、TCPサーバープロセスに大量のファイルと関数が含まれるため、圧倒されます。
CentOS 5.5でDDDを使用して、何が起こっているのかを把握しようとしています。プロセスに正常にアタッチします。次に、「ステップ」、「ステピ」、「次へ」ボタンをクリックしますが、何も起こりません。
ところで、デバッグにEclipseを使用し、このプロセス(または任意のプロセス)に接続すると、常に「__kernel_vsyscall()」が表示されます。これは、プログラムがデフォルトで中断することを意味しますか?その場合、プログラム内で続行するには、どうすれば__kernel_vsyscall()呼び出しから抜け出すことができますか?f8を押すと出てきますが、スタックトレースが緩んでいるので、どこにあるのかわかりません。どこにあるのかわからないので、ブレークポイントをどこに置くかわかりません。
要約すると、プロセスがどこでスタックしているのか、またはプロセスが何をしているのかを把握し、その時点からデバッグを試みたいと思います。
どうすればこれを行うことができますか?
ありがとうアミット