ソフトウェアツールは通常、複数の機能を提供しますが、ほとんどの人が同意するように、すべての機能がすべての人に使用されているわけではありません。一般的に言って、各ユーザーには独自の要件があり、その領域内でのみツールを使用するため、問題はありません。ただし、ツールの機能の1つがいつ役立つかわからないため、使用するツールを常に調べておくと、その過程で貴重な時間を節約できます。
適切な例:コンパイラ。優れたプログラミング言語コンパイラは常に多数のオプションを提供しますが、ユーザーは通常、限られたセットのみを知って使用します。具体的には、C言語開発者であり、開発プラットフォームとしてLinuxを使用している場合は、コマンドラインオプションの無限のリストを提供するgccコンパイラを使用している可能性が高くなります。
必要に応じて、コンパイルプロセスの各段階で出力を保存するようにgccに依頼できることをご存知ですか? -壁を知っていますか 警告の生成に使用するオプションは、特定の警告をカバーしていませんか?一般的に使用されないコマンドラインgccオプションは多数ありますが、コードのデバッグ中など、特定のシナリオで非常に役立つ場合があります。
そのため、この記事では、そのようなオプションをいくつか取り上げ、必要なすべての詳細を提供し、必要に応じてわかりやすい例で説明します。
ただし、先に進む前に、このチュートリアルで説明されているすべての例、コマンド、および手順はUbuntu 16.04 LTSでテストされており、使用したgccバージョンは5.4.0であることに注意してください。
gccコンパイラを使用してCコードをコンパイルするときに、Cコードが通過する段階は大まかに4つあることをご存知ですか?これらは、前処理、コンパイル、アセンブリ、およびリンクです。各ステージの後、gccは一時的な出力ファイルを生成します。このファイルは次のステージに渡されます。現在、これらはすべて生成される一時ファイルであるため、表示されません。コンパイルコマンドを発行しただけで、実行可能なバイナリ/実行可能ファイルが生成されます。
ただし、デバッグ中に、たとえば前処理段階でコードがどのように処理されたかを確認する必要があるとします。では、どうしますか?良い点は、gccコンパイラが標準のコンパイルコマンドで使用できるコマンドラインオプションを提供し、それ以外の場合はコンパイラによって削除される中間ファイルを取得することです。私たちが話しているオプションは-save-temps 。
このオプションについてのgccのマニュアルページの内容は次のとおりです。
Store the usual "temporary" intermediate files permanently; place
them in the current directory and name them based on the source
file. Thus, compiling foo.c with -c -save-temps produces files
foo.i and foo.s, as well as foo.o. This creates a preprocessed
foo.i output file even though the compiler now normally uses an
integrated preprocessor.
When used in combination with the -x command-line option,
-save-temps is sensible enough to avoid over writing an input
source file with the same extension as an intermediate file. The
corresponding intermediate file may be obtained by renaming the
source file before using -save-temps.
以下は、このオプションの使用方法を示すコマンドの例です。
gcc -Wall -save-temps test.c -o test-exec
そして、これが、上記のコマンドが実行された後にすべての中間ファイルが実際に生成されたことを確認した方法です。
したがって、上のスクリーンショットでわかるように、 test.i 、 test.s 、および test.o ファイルは-save-tempsによって作成されました オプション。これらのファイルは、それぞれ前処理、コンパイル、およびリンクの段階に対応しています。
ソースコードのデバッグとプロファイリングを可能にする専用ツールがあります。たとえば、gdbはデバッグの目的で使用されますが、gprofはプロファイリングの目的で人気のあるツールです。しかし、コードのデバッグとプロファイリングを準備するためにgccが提供する特定のコマンドラインオプションがあることをご存知ですか?
デバッグから始めましょう。コードのデバッグにgdbを使用できるようにするには、 -gを使用してコードをコンパイルする必要があります。 コマンドラインオプションはgccコンパイラを提供しました。このオプションを使用すると、基本的にgccは、gdbがプログラムを正常にデバッグするために必要なデバッグ情報を生成できます。
このオプションを使用する場合は、gccのmanページでこのオプションに記載されている詳細を確認することをお勧めします。その一部は、場合によっては重要であることが判明する可能性があります。たとえば、以下はマニュアルページからの抜粋です。
GCC allows you to use -g with -O. The shortcuts taken by optimized
code may occasionally produce surprising results: some variables
you declared may not exist at all; flow of control may briefly move
where you did not expect it; some statements may not be executed
because they compute constant results or their values are already
at hand; some statements may execute in different places because
they have been moved out of loops.
Nevertheless it proves possible to debug optimized output. This
makes it reasonable to use the optimizer for programs that might
have bugs.
gdbだけでなく、 -gを使用してコードをコンパイルします。 このオプションを使用すると、Valgrindのmemcheckツールを最大限に活用できる可能性も広がります。知らない人のために、memcheckは、プログラマーがコード内のメモリリーク(存在する場合)をチェックするために使用されます。このツールの詳細については、こちらをご覧ください。
次に、コードプロファイリングにgprofを使用できるようにするには、 -pgを使用してコードをコンパイルする必要があります。 コマンドラインオプション。これにより、gccは、コード分析のためにgprofが必要とするプロファイリング情報を書き込むための追加のコードを生成できます。 「データが必要なソースファイルをコンパイルするときにこのオプションを使用する必要があります。また、リンクするときにもこのオプションを使用する必要があります」とgccのmanページに記載されています。 gprofを使用してコードプロファイリングを実行する方法の詳細については、当社のWebサイトにあるこの専用チュートリアルにアクセスしてください。
注 :両方の -gの使用法 および-pg オプションは、 -save-tempsの方法と似ています。 オプションは前のセクションで使用されました。
あなたがgccプロでない限り、あなたはこの記事で何か新しいことを学んだと確信しています。これらのオプションを試してみて、どのように機能するかを確認してください。その間、このチュートリアルシリーズの次のパートを待ちます。ここでは、このような興味深く便利なgccコマンドラインオプションについて詳しく説明します。