1

64 ビット ウィンドウで、eclipse-Juno-CDT と cygwin-gcc (cygwin バージョン = 1.7.16、gcc バージョン = 3.4.4、gdb バージョン = 7.5.50) を使用して次の C コードをデバッグしようとしています。コードは通常モードで正常に動作します。ソースファイルが見つからなかったため、最初はデバッガーが実行されていませんでした。次に、パス マッピング情報 (/cygdrive/c から C:\ へ) を検索して追加しました。現在は稼働していますが、次の問題があります。

  1. 「hello c 1」行の前にブレークポイントを配置してから、シングル ステップを実行しました。しかし、コンソールには何も出力されません。

  2. 最後の行 (「exit」) を 1 回踏み込んだ後、「No source available for _cygwin_exit_return() at ...」というエラーが表示されます。

    // stdio.h and stdlib.h are included, but when I put a #include the code
    // they dont show up, so I deleted those lines in this code fragment.
    int main(void) {
         int a=10;
         int b=5; // breakpoint on this line, single step after this
         printf("hello c 1\n"); // these outputs are not printed in console
         // fflush(stdout);
         printf("A=%d, B=%d\n", a, b); // but debugger shows the correct values in data window
         // fflush(stdout);
         return EXIT_SUCCESS; // error on this line
    }
    

後で追加:さらにデバッグした後、終了エラーの後でも、「続行」を実行すると、プログラムの終了後にコンソールに行が表示されることがわかりました。そのため、余分な「fflush(stdout)」行を追加したところ、出力が印刷されているときに出力を確認できるようになりました。

しかし、終了エラーの問題を修正するにはどうすればよいでしょうか? また、ファイルを編集して fflush を追加し、デバッグ出力を確認するのは面倒です。これを回避する方法はありますか? 誰かがこの非常に基本的な問題で私を助けてくれますか、または解決策が与えられている場所を教えてくれますか? 前もって感謝します。

4

2 に答える 2

4

論理的には、Cプログラムはint main()その関数が戻ったときに開始および終了しますが、環境(WindowsやCygwinなど)は、メモリ管理の初期化/分解、標準ストリームの開始/終了、およびその他のそのような簿記のために、プリコードとポストコードを頻繁に追加します。Cygwinでコンパイルされた実行可能ファイルは、から戻った後、Cygwinランタイムによって提供されるint main()クリーンアップ関数に切り替わります_cygwin_exit_return()。これにはソースがないため、デバッガーは文句を言います。

すぐに出力を取得する場合は、バッファなしの出力ストリームを使用できます。

オプション1、使用fprintf( stderr, ... )stderr定義上、バッファリングされていないため)。ただし、これはプログラムの非デバッグ動作にも影響します。

オプション2:

int main()
{
// Using NDEBUG as also used by <assert.h>; feel free to use a different define
#ifndef NDEBUG
    // For debugging, set stdout to unbuffered
    setbuf( stdout, NULL );
#endif
    ....
于 2012-11-14T14:44:16.173 に答える
0

マルチスレッドを学んでいた頃、スレッドがプロセスよりも速いかどうかに興味があり、iirc では Windows の stderr/stdout でさえフラッシュする必要がありました。

思い出はさておき、これらの printf() を fflush を呼び出す関数でラップするか、 setvbuf() を呼び出してバッファリングを無効にすることができます。

終了について: 「利用可能なソースがありません」は、プログラムの一部にデバッグ用の情報がないことを意味するだけなので、実際のエラーではありません。自分で cygwin をビルドしない限り、cygwin dll からデバッグ シンボルが取り除かれていると思います。それとも、cygwin の exit() をデバッグしたいですか?

編集:がらくた、同時回答:)

于 2012-11-14T14:51:36.960 に答える