1

私は本当にここで迷っています。たぶん、あなたの何人かは私を正しい方向に向けることができます。

GCC over MinGW を使用して ANSI C でツールを開発しています。このツールは、コマンド ラインからのみ実行します。おそらくWindowsマシンでのみ。一部のデータをローカルで作成し、他のプログラムで使用するファイルを生成します。基本的に、多くの計算といくつかのファイル処理を行います。本当に空想的なものは何もありません。1000行以上をここに投稿して調べる必要はありませんでした...

GCCでコンパイルして-ansi、警告が1つも表示されないようにします。開発が進化するにつれて、すべてが常にうまく機能しました。しかし、最近、(ほぼ) ランダムなセグメンテーション違反が発生し始めました。最後に行われた変更を確認しましたが、何も見つかりませんでした。完全に機能したときに戻ってくる最後の変更を完全に削除しました。まだセグメンテーション違反。行ごとにトレースしました。ポインター/mallocエラーの可能性を探して、コード全体を読み直しました。頻繁にランダムに失敗する理由を見つけることができません。

ここに奇妙なことがあります--gでコンパイルし、GDBを実行しました。

start MSYS
change dir where the program resides
$ gdb generatore.exe (the one compiled -g that fails)
$ run

そして、GDB内で完全に機能します。私は一歩一歩進んだ。1行ずつ。完全。膨大なデータで強調してみました。すべての作品。エラーを再現できません。ただし、同じ実行可能ファイルをコマンド ラインから実行すると、失敗します。

何らかのポインターで予測できない動作が疑われますが、どこにも見つかりません。

誰かが似たようなことに遭遇したことがありますか?どこをチェックすればいいですか?また、私は GDB にあまり詳しくありません。GDB はスムーズに動作するため、何らかの方法で制御を強制して、失敗した理由を見つけることはできますか? あなたが私にアドバイスできる他の無料のWindows用デバッグソリューションはありますか? 予測できない動作をデバッグするにはどうすればよいですか?

お気遣いありがとうございます、マキシム

4

1 に答える 1

0

ポインタ、メモリ割り当て、割り当て解除などに関連するあらゆる種類のランタイムエラーをキャッチするための優れた無料ツールがあります。これらはコンパイル時にキャッチできないため、コンパイラはそれらについて警告しません。valgrind http:// valgrind .org/。問題は、AFAIKはWindowsでは実行されないということです。ただし、プログラムが純粋なANSI Cである場合は、プログラムをビルドして、Linuxボックスでvalgrindを使用して実行できるはずです。

100%確信はありませんが、仮想マシンで問題なく実行できるはずです。別のLinuxコンピューターがない場合は、UbuntuをVirtual BoxまたはVmWareにインストールして、valgrindを使用してプログラムを実行してみてください。それ。

于 2012-12-07T14:17:58.623 に答える