12

Eclipse cdt(Juno)を使用してfork()メカニズムをデバッグしようとしています。私はCでプログラムを書きました。

  if( -1 == (pid = fork()) ) /* error */
    goto cleanup;
  else if ( 0 == pid ) /* child */
  {
    execlp("gcc", "gcc", cFilePath, "-o" , GCC_OUTPUT_FILE_NAME, NULL);
    goto cleanup; /* Arrives here only on error! */
  }
  else if (pid > 0) /* parent - checks: correct pid returns, returns normally, with exit status = 0*/
  {
      returnedpid = wait(exitStatus);
      if( pid != returnedpid || exitStatus == NULL || !WIFEXITED(*exitStatus) || !WEXITSTATUS(*exitStatus) )
          goto cleanup;
  }

ここで述べたように「」を追加しようとしました:http set follow-fork-mode child//unix.derkeiler.com/Newsgroups/comp.unix.programmer/2006-02/msg00435.html

1.コードセクションをどこでデバッグするにはどうすればよい(0==pid)ですか?

2. waitステートメントに到達すると、デバッガーはすぐに戻ります。wait()は、子が戻るまで中断することを想定していませんか?なぜすぐに戻るのですか?

4

3 に答える 3

14

あなたの問題は、おそらく「detach-on-fork」がオフに設定されていることが原因です。DSF はこれをデフォルトで設定します (gdb のデフォルトでもあります)。

1) 「execlp...」と「returnedpid =...」のある行にブレークポイントを置きます。2) デバッグ構成で、「ノンストップ モード」と「フォークされたプロセスを自動的にデバッグする」を有効にします。3) デバッグ セッションを開始します。子または親のいずれかでブレークポイントにヒットします。デバッグ ビューが表示されます。

デバッグ ビュー

バイナリに 2 つのスレッドが表示されていることがわかります。

4) どちらかをクリックして (上の画像の main() のある行)、デバッグ コンテキストを切り替えます。

于 2013-03-18T13:17:28.600 に答える
1
  1. デバッグ構成ウィンドウで->デバッガー->「フォークされたプロセスを自動的にデバッグする」にチェックを入れます
  2. ブレークポイント ウィンドウを開く -> [表示] メニュー -> [イベント ブレークポイント C/C++ を追加] -> "fork called"
  3. イベント ブレークポイントが発生したら、F6 キーを押します -> デバッグ ウィンドウに新しいプロセスが表示されます
  4. 新しいプロセスを選択し、F6 を押します - あなたは子にいます
  5. 楽しみ
于 2014-05-21T16:29:00.577 に答える
1

これは、待機する前に init プロセスが子を取得するためである可能性があります。fork に入るときは sigchld をブロックし、forks/exec の後でシグナルのブロックを解除してみてください。たぶん、それは正確に何が起こっているかについてのアイデアを与えるはずです.

sigprocmask を使用すると役立ちます。

于 2013-03-18T02:37:30.760 に答える