0

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を押すと出てきますが、スタックトレースが緩んでいるので、どこにあるのかわかりません。どこにあるのかわからないので、ブレークポイントをどこに置くかわかりません。

要約すると、プロセスがどこでスタックしているのか、またはプロセスが何をしているのかを把握し、その時点からデバッグを試みたいと思います。

どうすればこれを行うことができますか?

ありがとうアミット

4

2 に答える 2

0

1)Cプロセスにアタッチすると、それ自体で問題が発生することがよくありますが、デバッガーでプロセスを開始する方法はありますか?

2)ブレークポイントを設定し、コマンドでプログラムを停止した後、DDDのステップ関数を使用する必要があります。あなたの質問を読んだことから、あなたがそれをしたかどうかはわかりません。多くのブレークポイントを設定したくない場合がありますが、コードのクリティカルセクションに1つまたは2つ設定することは可能ですか?

于 2011-02-19T02:08:33.277 に答える
0

要約すると、私が達成したかったのは、プログラムがハングしたときに、プログラムがスタックしている場所を見つけられるようにすることでした。私はそれを理解しました-それはとても簡単でした。Eclipseで構成を作成します...."DebugConfigurations-> C / C ++ attach to application" .. ..

プロセスをシェルから通常どおりに実行します(できればターミナルを接続します)。ハングしたら、Eclipseを開き、デバッグアイコンをクリックして、構成されたプロセスを実行します。プロセスにアタッチするように求められます。プロセス名を探して、それに添付します。

ここで、スタックトレース全体を見てください。カーネル関数呼び出しと混合された独自の関数呼び出しのいくつかが表示されます。これにより、プログラムがスタックしている場所がわかります。

于 2011-02-21T05:17:01.723 に答える