1. ホーム
  2. c

[解決済み] CおよびC++に最適なデバッグツール [終了しました]。

2022-03-03 04:14:28

質問

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 以外) の中には、コマンドラインデバッガーのフロントエンドとして機能するものや、複数の異なるコマンドラインデバッガーをサポートするものがあります。