Gdbデバッグツール(Makfileプロジェクト管理)の使用方法について話します

1つはgdbデバッグツールです

gcc -g main.c -o main
一般的に使用されるコマンド:

  • コマンド短縮機能
  • helphモジュールごとにコマンドクラスを一覧表示する
  • ヘルプクラス特定のタイプの特定のコマンドを検索する
  • リストlビューコード、行番号と関数名を続けることができます
  • list-lコードをオンラインで表示
  • quit qgdbを終了します
  • runrプログラムをフルスピードで実行する
  • シングルステップを開始し、プログラムを実行し、最初の行で停止してステートメントを実行します
  • 次のnステップバイステップの実行
  • ステップsステートメントごとに実行します。関数が検出されたら、実行のために関数に転送します。
  • バックトレースb関数呼び出しスタックフレームと階層関係を表示する
  • infoI関数内のローカル変数の値を表示します
  • フレームfスイッチ機能スタックフレーム
  • finishは現在の関数を終了し、関数呼び出しのポイントに戻ります
  • set変数の値を設定します
  • デバッグ中にパラメータを渡すarvg [1] argv [2]コマンドラインを実行します
  • printp印刷変数とアドレス
  • 行番号と関数名に従って、ブレークbセットブレークポイント
  • 削除dブレークポイントの削除dブレークポイントNUM
  • セット観測変数を表示します
  • undisplay観測変数をキャンセルします
  • 残りのコードをフルスピードで実行し続けます
  • ブレークポイントを有効にするブレークポイントを有効にする
  • ブレークポイントを無効にするブレークポイントを無効にする
  • xメモリの表示x / 20xwは、20ユニット、16進数、ユニットあたり4バイトを表示します
  • 設定した観測点の変数が送信および変更されたときに印刷および表示する
  • ディスプレイ観測点を見る
  • コアファイルulimit-c 1024オープンコアファイル、デバッグ中のgdba.outコア
  • set var n = 10などのデバッグ時の変数の値を設定しますsetvar n = 100

2、gdbデバッグモード

  • gdbデバッグモード
  • 全速力で走る
  • シングルステップデバッグを開始します
  • follow-fork-mode子/親を設定します#Makefileプロジェクト管理が子プロセスと親プロセスを追跡します

3、Makfileプロジェクト管理

  • プロジェクトコードのコンパイル管理
  • プロジェクトのコンパイル時間を節約
  • 一度書かれた生涯の利益

操作例ファイル:add.c sub.c mul.c dive.c main.c

基本原則
3つの要素:目標、条件、および順序。

第四に、Makefileの動作原理

  1. 各目標と依存関係の関係を分析する
  2. 依存関係に基づいて下から上にコマンドを実行します
  3. ターゲットよりも新しい変更時間に基づいて更新を決定します

ターゲットがどの条件にも依存しない場合は、対応するコマンドを実行して更新を表示します。
掃除

  • 目的:コンパイルによって生成された中間oファイルと最終ターゲットファイルをクリアします
  • make clean現在のディレクトリに同じ名前のcleanファイルがある場合、cleanに対応するコマンドは実行されません。
  • 誤ったターゲットステートメント:.PHONY:clean
  • cleanコマンドの特別な記号

"-"このコマンドは間違っています。makeは後続のコマンドを実行し続けます。例: "-rm main.o"
"@"はコマンド自体を表示せず、結果のみを表示します。例: "@ echo" clean done ""

その他

-make默认执行第一个出现的目标,可通过make dst指定要执行的目标
-distclean目标
-install目标
-make -C指定目录 进入指定目录,调用里面的Makefile

5つ目は、MakeFileを使用するだけです

python @ ubuntu:〜/ linuxC / calc $ cat Makefile
ターゲット:依存(条件)コマンド
フェーズ1

#app:add.c sub.c dive.c mul.c main.c
#gcc add.c sub.c dive.c mul.c main.c -o app

ステージ2

#app:add.o sub.o dive.o mul.o main.o
#gcc add.o sub.o dive.o mul.o main.o -o app
#add.o:add.c
#gcc -c add.c
#sub.o:sub.c
#gcc -c sub.c
#dive.o:dive.c
#gcc -c dive.c
#mul.o:mul.c
#gcc -c mul.c
#main.o:main.c
#gcc -c main.c

ステージ3

#$@表示目标,$^表示所有依赖,$<表示依赖中的第一个
#obj=add.o sub.o mul.o dive.o main.o
#src = $(wildcard *.c)
#obj = $(patsubst %.c,%.o,$(src))
#target = app
#$(target):$(obj)
#gcc $^ -o $@
#%.o:%.c
#gcc -c $< -o $@

ステージ4

CPPFLAGS= -Iinclude
CFLAGS= -g -Wall
LDFLAGS=
CC=gcc
#CC=arm-linux-gcc
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
target = app
$(target):$(obj)
$(CC) $^ $(LDFLAGS) -o $@
%.o:%.c
    $(CC) -c $< $(CFLAGS) $(CPPFLAGS) -o $@
.PHONY:clean
#彻底清除生生过程文件
clean:
    -rm -f *.o
    -rm -f app
#彻底清除生生过程文件和生成配置文件
distclean: rm /usr/bin/app
install:cp app /usr/bin
test:
    @echo $(src)
    @echo $(obj)

ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_50662680/article/details/110232731