Expliquez comment utiliser l'outil de débogage Gdb (gestion de projet Makfile)

Un, outil de débogage gdb

gcc -g main.c -o principales
commandes couramment utilisées:

  • Fonction de raccourci de commande
  • help h Liste des classes de commandes par module
  • classe d'aide Rechercher des commandes spécifiques d'un certain type
  • liste l code de vue, peut être suivi du numéro de ligne et du nom de la fonction
  • list-l Voir le code en ligne
  • quitter q Quitter gdb
  • exécuter r exécuter le programme à pleine vitesse
  • démarrer une seule étape, exécuter le programme, arrêter à la première ligne pour exécuter l'instruction
  • prochaine exécution étape par étape
  • étape s exécution instruction par instruction, lorsqu'une fonction est rencontrée, transfert à la fonction pour exécution
  • backtrace b Afficher le cadre de la pile des appels de fonction et la relation hiérarchique
  • info I Afficher la valeur des variables locales à l'intérieur de la fonction
  • cadre f fonction de commutateur cadre de pile
  • finish termine la fonction en cours et revient au point d'appel de la fonction
  • set définit la valeur de la variable
  • exécuter la ligne de commande arvg [1] argv [2] en passant des paramètres pendant le débogage
  • print p imprimer des variables et des adresses
  • break b définir le point d'arrêt, en fonction du numéro de ligne et du nom de la fonction
  • supprimer d supprimer les points d'arrêt d points d'arrêt NUM
  • afficher les variables d'observation du jeu
  • undisplay Annuler la variable d'observation
  • continuer à exécuter le code restant à pleine vitesse
  • activer les points d'arrêt activer les points d'arrêt
  • désactiver les points d'arrêt désactiver les points d'arrêt
  • x Afficher la mémoire x / 20xw affiche 20 unités, hexadécimal, 4 octets par unité
  • regarder Imprimer et afficher lorsque la variable du point d'observation réglé est envoyée et modifiée
  • Je regarde le point d'observation d'affichage
  • fichier core ulimit -c 1024 fichier core ouvert, gdb a.out core pendant le débogage
  • set var Définit la valeur de la variable dans le débogage, par exemple n = 10 set var n = 100

Deux, mode de débogage gdb

  • mode de débogage gdb
  • courir à pleine vitesse
  • démarrer le débogage en une seule étape
  • set follow-fork-mode enfant / parent #Makefile gestion de projet suivi du processus enfant et du processus parent

Troisièmement, la gestion de projet Makfile

  • Gestion de la compilation de code de projet
  • Gagnez du temps de compilation du projet
  • Bénéfice à vie une fois rédigé

Fichier d'exemple d'opération: add.c sub.c mul.c dive.c main.c

Principes de base
Trois éléments: objectifs, conditions et ordres.

Quatrièmement, le principe de fonctionnement de Makefile

  1. Analyser la relation entre chaque objectif et dépendance
  2. Exécuter des commandes de bas en haut en fonction des dépendances
  3. Déterminez la mise à jour en fonction de l'heure de modification qui est plus récente que la cible

Si la cible ne dépend d'aucune condition, exécutez la commande correspondante pour afficher la mise à jour.
nettoyer

  • Objectif: effacer les fichiers o intermédiaires et les fichiers cibles finaux produits par compilation
  • make clean S'il y a un fichier clean avec le même nom dans le répertoire courant, la commande correspondant à clean ne sera pas exécutée
  • Déclaration cible fausse: .PHONY: clean
  • Symboles spéciaux dans la commande de nettoyage

"-" Cette commande est erronée, make continuera d'exécuter les commandes suivantes. Par exemple: "-rm main.o"
"@" n'affiche pas la commande elle-même, seulement le résultat. Tels que: "@echo" clean done ""

autre

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

Cinq, utilisez simplement MakeFile

python @ ubuntu: ~ / linuxC / calc $ cat Makefile
cible: commande dépendante (condition)
phase un

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

Deuxième étape

#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

Troisième étape

#$@表示目标,$^表示所有依赖,$<表示依赖中的第一个
#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 $@

Quatrième étape

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)

Insérez la description de l'image ici

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/m0_50662680/article/details/110232731
conseillé
Classement