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
- Analyser la relation entre chaque objectif et dépendance
- Exécuter des commandes de bas en haut en fonction des dépendances
- 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)