[解決済み] CおよびC++に最適なデバッグツール [終了しました]。
質問
UNIXでC/C++を扱っていて、coreファイルをよく見かけるようになりました。コアファイルは、コアやセグメンテーションフォールトの実際の原因を見つけるためにデバッグすることが困難な場合が多くあります。効率的なデバッガを提案していただけませんか?
解決方法を教えてください。
ほとんどのCコンパイラは、*nixのほとんどのフレーバーで、以下をサポートしていると思います。
-g
を使ってオブジェクトファイル内にデバッグ用シンボルを含めることができますので、その場合は
cc -g -c file1.c
cc -g -c file2.c
cc -g file1.o file2.o -o program
./program
そして、プログラムを実行したときにクラッシュした場合、より簡単にデバッグできるコアファイルを生成する必要があります。 最初の2行はソースファイルをコンパイルするだけです(.oファイルを生成します)。3行目はコンパイラにリンカを呼び出してソースファイルを実行ファイルにリンクさせるように指示します(.oファイルを渡す)。
-g
リンカがデバッグシンボル付きの実行ファイルを生成するために特別なことをする必要がない場合、ここでは実際には何もしないかもしれませんが、何も損はしないはずです)そして最後の行がプログラムを実行します。 最適化は通常、より難しくするので、デバッグしようとしているときに、コンパイラに最適化を指示しないようにする必要があります(最適化をオンにしない限りエラーが出ないことがわかった場合は別です)。
あなたがどのようなプラットフォームで、どのようなツールを使っているのかがわからないので(というか、本当はどのCコンパイラーを使っているのかも)、より具体的なアドバイスをするのは難しいのですが。 お使いのコンパイラのマニュアルを読んでみてください。 コマンドラインからタイプしてください。
man cc
そして、あなたのシステムのコンパイラについていろいろと教えてくれるマニュアルのページが表示されるはずです。 このページには、コンパイラにもっと警告メッセージを出すように指示する方法が書かれているかもしれません。そうすれば、プログラムを実行する前にエラーを見つけることができるかもしれません。 (いくつかの警告は、特定の最適化をオンにしてコンパイルした場合にのみ表示されることに注意してください。)
あなたのUnixシステムには、おそらく何らかのデバッガがインストールされていることでしょう。 C言語開発用にセットアップされたほとんどのLinuxマシンには
gdb
がインストールされています。
gdb
は、プログラムをデバッグモードで実行したり、コアファイルを解析するために使用することができます。 gdbを持っていれば可能です。
gdb ./program
が起動し、プログラムを実行できる状態になります。 そうすると
gdb ./program ./core
を実行すると、デバッグ中にプログラムがクラッシュしたかのような状態になる以外は、同じような動作になります。 この状態から、最も早く、そして最も役に立つことは、次のことです。
(gdb) bt
ここで
(gdb)
はプロンプトで
bt
は、バックトレースを作成せよという命令です。 これはコールスタックを意味し、障害が発生したときにプログラムがどの関数にいたのか、どの関数がその関数を呼び、どの関数がその関数を呼び、そして最初の関数まで延々と表示されます。 このとき、ライブラリ関数が最も新しく呼び出された関数として表示されることが多いので、混乱することがありますが、これは通常、問題の原因となる悪いデータをどこかで渡していることを意味します。
gdb
は大規模で複雑なプログラムなので、もしあなたのシステム上にあるのなら、時間をかけて読み込む必要があります。
もしシステム上にないのであれば、似たようなツールはないか調べてみてください。 グラフィカルデバッガー (IDE 内または IDE 以外) の中には、コマンドラインデバッガーのフロントエンドとして機能するものや、複数の異なるコマンドラインデバッガーをサポートするものがあります。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み] C++のセグメンテーションフォールトの修正
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み】デバッグビルドとリリースビルドの性能差について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】警告:式の結果が未使用の場合