GDB

Traduction

française

Table des matières

ISommaire de GDB	15

1Un exemple d'un debuggage GDB	15

IIEntrée et sortir de GDB	18

1Appel de GDB	19

aChoix des fichiers	19

bChoix des modes	21

2Stopper GDB	22

3Commandes de shell	23

4Les traces de sortie	23

IIICommandes de GDB	23

1Syntaxe de commande	23

2Complétion de commande	24

3Obtenir l'aide	25

IVProgrammes Courants Sous GDB	28

1Compilation pour la correction	28

2Commencer votre programme	28

34,3 Les arguments de votre programme	29

44,4 Votre environnement de programme	30

54,5 Annuaire de fonctionnement de votre programme	30

64,6 L'entrée et la sortiede votre programme	31

74,7 Correction d'un processus déjà-courant	31

84,8 Tuer le processus d'enfant	32

94,9 Programmes de correction avec les fils multiples	32

104,10 Programmes de correction avec des processus multiples	34

V5. Arrêt et continuer	35

15,1 breaks, watchpoints, et catchpoints	35

a5,1,2 Réglage des watchpoints	38

b5,1,3 Réglage des catchpoints	40

c5,1,4 Supprimer des breaks	41

d5,1,5 breaks de neutralisation	41

e5,1,3 Réglage des catchpoints	43

f5,1,4 Supprimer des breaks	44

g5,1,5 breaks de neutralisation	45

h5,1,6 Cassez les conditions	45

i5,1,7 Listes de commandes de break	46

j5,1,8 Menus de break	47

k5,1,9 "ne peuvent pas insérer des breaks"	48

l5,1,10 "adresse de break ajustée..."	49

25,2 Continuer et faire un pas	49

35,3 Signaux	52

45,4 S'arrêtant et commencer des programmes à lecture multiple	53

VI6. Examiner la pile	54

16,2 Backtraces	55

26,3 Choix d'une armature	56

36,4 Informations sur une armature	56

VII7. Fichiers source D'Examiner	57

17,2 Edition des fichiers source	59

a7,2,1 Choix de votre rédacteur	59

27,3 Recherche des fichiers source	59

37,4 Indication des répertoires source	60

47,5 Source et code machine	60

VIII8. Données D'Examiner	61

18,2 Variables de programme	62

28,3 Rangées artificielles	64

38,4 Formats de rendement	64

48,5 Mémoire d'examiner	65

58,6 Affichage automatique	67

68,7 Arrangements d'impression	68

78,8 histoire de valeur	71

88,9 Variables de convenance	72

a10,1,2 Permettez et neutralisez Tracepoints	73

b10,1,3 Tracepoint Passcounts	73

c10,1,4 Listes D'Action De Tracepoint	74

d10,1,5 Liste Tracepoints	75

e10,1,6 Commençant et arrêt de l'expérience de trace	75

910,2 Employer les données rassemblées	75

a10,2,1 tfind n	76

b10,2,2 tdump	77

c10,2,3 sauvez-tracepoints nom de fichier	78

1010,3 Variables de convenance pour Tracepoints	78

IX11. Programmes De Correction Qui Emploient Des Recouvrements	78

111,1 Comment Les Recouvrements Fonctionnent	79

211,2 Commandes De Recouvrement	80

311,3 Correction Automatique De Recouvrement	82

411,4 Programme D'Echantillon De Recouvrement	82

X12. Employer GDB avec différentes langues	83

112,1 Changement entre les langues source	83

a12,1,1 Liste de prolongements et de langues de nom de fichier	84

b12,1,2 Réglage de la langue de travail	84

c12,1,3 En ayant GDB impliquez la langue source	85

212,2 Montrer la langue	85

312,3 Vérification de type et de gamme	85

a12,3,1 Une vue d'ensemble de la vérification de type	86

b12,3,2 Une vue d'ensemble de la vérification de gamme	86

412,4 Langues soutenues	87

a12,4,1 C et C ++	87

12,4,1,1 Opérateurs de C et de C ++	88

12,4,1,2 Constantes de C et de C ++	89

12,4,1,4 C et C ++ se transfère	91

12,4,1,5 C et C ++ tapeznt et s'étendent des contrôles	91

12,4,1,6 GDB et C	91

12,4,1,7 devices de GDB pour C ++	91

b12,4,2 Objectif-C	92

12,4,2,1 Noms de méthode dans les commandes	92

12,4,2,2 La Commande print Avec Objectif-C	93

c12,4,3 Modula-2	93

12,4,3,1 Opérateurs	94

12,4,3,2 Fonctions et procédures intégrées	95

12,4,3,3 Constantes	96

12,4,3,4 Modula-2 se transfère	96

12,4,3,5 Déviations de Modula-2 standard	97

12,4,3,6 Contrôles du type Modula-2 et de la gamme	97

12,4,3,7 Les opérateurs de portée :: et .	97

12,4,3,8 GDB et Modula-2	97

512,5 Langues non soutenues	98

XI13. Examiner le Tableau de symbole	98

XII14. Changement De l'Exécution	102

114,2 Continuer à une adresse différente	103

214,3 Donnant à votre programme un signal	104

314,4 Renvoi d'une fonction	104

414,5 Fonctions de programme d'appel	104

514,6 Programmes de raccordement	104

XIII15. Dossiers de GDB	105

115,2 Information de mise en point dans les dossiers séparés	110

215,3 Dossiers de symbole de lecture d'erreurs	112

XIV16. Indication d'une cible de correction	112

116,1 Cibles actives	113

216,2 Commandes pour des cibles de gestion	113

316,3 Ordre de choix de byte de cible	114

416,4 Correction à distance	115

516,5 Affichage D'Objet De Grain	115

XV17. Programmes à distance de correction	116

117,1 Se relier à une cible à distance	116

217,2 Employer gdbserver programme	117

317,3 Employer gdbserve.nlm programme	118

417,4 Configuration à distance	119

517,5 Mettre en application un moignon à distance	119

a17,5,1 Ce que le moignon peut faire pour vous	120

b17,5,2 Ce que vous devez faire pour le moignon	120

c17,5,3 Le remontant tout	121

XVI19. GDB De Contrôle	122

119,2 Edition de commande	122

219,3 Histoire de commande	123

319,4 Taille d'écran	123

419,5 Nombres	124

519,6 Configuration de l'cAbi courant	124

619,7 Avertissements et messages facultatifs	125

719,8 Messages facultatifs au sujet des happenings internes	126

XVII20. Ordres en boîte des commandes	127

120,2 Crochets définis pour l'utilisateur de commande	128

220,3 Fichiers de commande	129

320,4 Commandes pour la sortiecommandé	130

XVIII21. Interprètes De Commande	131

XIX22. Interface utilisateur Des Textes de GDB	131

122,1 Vue d'ensemble de TUI	131

222,2 Attaches Principales de TUI	133

322,3 TUI Choisissent Le Mode Principal	134

422,4 Commandes de détail de TUI	134

522,5 Variables de configuration de TUI	135

XX23. Employer GDB sous GNU Emacs	135

XXI24. L'Interface de GDB/mi	137

1Fonction et but	137

2Notation et terminologie	137

3Remerciements	137

424,1 Syntaxe De Commande de GDB/mi	137

a24,1,1 Syntaxe D'Entrée de GDB/mi	138

b24,1,2 GDB/mi A produit La Syntaxe	138

c24,1,3 Exemples simples d'interaction de GDB/mi	140

Arrêt De Cible	140

Commande Simple de CLI	140

Commande Avec Des Effets Secondaires	140

Une Mauvaise Commande	140

524,2 Compatibilité de GDB/mi avec CLI	140

624,3 Disques De Rendement de GDB/mi	141

a24,3,1 Disques De Résultat de GDB/mi	141

b24,3,2 Disques De Jet de GDB/mi	141

c24,3,3 Disques Hors bande de GDB/mi	141

724,4 Format De Description De Commande de GDB/mi	141

aMotivation	142

bIntroduction	142

cCommandes	142

Synthèse	142

Commande de GDB	142

Résultat	142

Hors bande	142

Notes	142

Exemple	142

824,5 Commandes de table de break de GDB/mi	142

a- casser-après Commande	142

Synthèse	142

Commande de GDB	142

Exemple	143

b- casser-condition Commande	143

Synthèse	143

Commande de GDB	143

Exemple	143

c- casser-supprimez Commande	144

Synthèse	144

Commande de GDB	144

Exemple	144

d- casser-neutralisez Commande	144

Synthèse	144

Commande de GDB	144

Exemple	144

e- casser-permettez Commande	145

Synthèse	145

Commande de GDB	145

Exemple	145

f- casser-information Commande	145

Synthèse	145

Commande de GDB	146

Exemple	146

g- casser-insérez Commande	146

Synthèse	146

Résultat	146

Commande de GDB	146

Exemple	147

h- casser-liste Commande	147

Synthèse	147

Commande de GDB	147

Exemple	148

i- donnée-évaluer-expression Commande	153

Synthèse	153

Commande de GDB	153

Exemple	153

j- donnée-liste-changer-s'enregistre Commande	154

Synthèse	154

Commande de GDB	154

Exemple	154

k- montrer-supprimez Commande	158

Synthèse	158

Commande de GDB	159

Exemple	159

l- montrer-neutralisez Commande	159

Synthèse	159

Commande de GDB	159

Exemple	159

m- montrer-permettez Commande	159

Synthèse	159

Commande de GDB	159

Exemple	159

n- montrer-insérez Commande	159

Synthèse	159

Commande de GDB	160

Exemple	160

o- montrer-liste Commande	160

Synthèse	160

Commande de GDB	160

Exemple	160

p- environnement-CD Commande	160

Synthèse	160

Commande de GDB	160

Exemple	160

q- environnement-annuaire Commande	160

Synthèse	160

Commande de GDB	161

Exemple	161

r- environnement-chemin Commande	161

Synthèse	161

Commande de GDB	161

Exemple	161

s- environnement-pwd Commande	162

Synthèse	162

Commande de GDB	162

Exemple	162

924,7 Commande de programme de GDB/mi	162

Arrêt de programme	162

Exemples	162

a- exec-avortez Commande	163

Synthèse	163

Commande de GDB	163

Exemple	163

b- exec-arguments Commande	163

Synthèse	163

Commande de GDB	163

Exemple	163

c- exec-continuez Commande	163

Synthèse	163

Commande de GDB	163

Exemple	164

d- exec-finissez Commande	164

Synthèse	164

Commande de GDB	164

Exemple	164

e- exec-interrompez Commande	164

Synthèse	164

Commande de GDB	165

Exemple	165

f- exec-prochain Commande	165

Synthèse	165

Commande de GDB	165

Exemple	165

g- exec-prochain-instruction Commande	165

Synthèse	165

Commande de GDB	165

Exemple	166

h- exec-retournez Commande	166

Synthèse	166

Commande de GDB	166

Exemple	166

i- exec-executez Commande	166

Synthèse	166

Commande de GDB	166

Exemple	167

j- exec-montrer-arguments Commande	167

Synthèse	167

Commande de GDB	167

Exemple	167

k- exec-step Commande	167

Synthèse	167

Commande de GDB	167

Exemple	167

l- exec-step-instruction Commande	168

Synthèse	168

Commande de GDB	168

Exemple	168

m- exec-jusqu'à ce que Commande	168

Synthèse	168

Commande de GDB	168

Exemple	168

n- dossier-exec-et-symboles Commande	169

Synthèse	169

Commande de GDB	169

Exemple	169

o- dossier-exec-dossier Commande	169

Synthèse	169

Commande de GDB	169

Exemple	169

p- dossier-liste-exec-sections Commande	169

Synthèse	169

Commande de GDB	170

Exemple	170

q- dossier-liste-exec-source-dossier Commande	170

Synthèse	170

Commande de GDB	170

Exemple	170

r- dossier-liste-exec-source-dossiers Commande	170

Synthèse	170

Commande de GDB	170

Exemple	170

s- dossier-liste-partager-bibliothèques Commande	170

Synthèse	170

Commande de GDB	171

Exemple	171

t- dossier-liste-symbole-dossiers Commande	171

Synthèse	171

Commande de GDB	171

Exemple	171

u- dossier-symbole-dossier Commande	171

Synthèse	171

Commande de GDB	171

Exemple	171

1024,8 Commandes diverses de GDB dans GDB/mi	172

a- gdb-sortie Commande	172

Synthèse	172

Commande de GDB	172

Exemple	172

b- gdb-placez Commande	172

Synthèse	172

Commande de GDB	172

Exemple	172

c- gdb-montrez Commande	172

Synthèse	172

Commande de GDB	172

Exemple	173

d- gdb-version Commande	173

Synthèse	173

Commande de GDB	173

Exemple	173

e- interprète-exec Commande	173

fSynthèse	173

gCommande de GDB	173

hExemple	174

1124,9 Commandes De Manipulation De Pile de GDB/mi	174

a- empiler-information-armature Commande	174

Synthèse	174

Commande de GDB	174

Exemple	174

b- empiler-information-profondeur Commande	174

Synthèse	174

Commande de GDB	174

Exemple	174

c- empiler-liste-arguments Commande	175

Synthèse	175

Commande de GDB	175

Exemple	175

d- empiler-liste-armatures Commande	176

Synthèse	176

Commande de GDB	176

Exemple	176

e- empiler-liste-locals Commande	177

Synthèse	177

Commande de GDB	177

Exemple	177

f- empiler-choisir-armature Commande	178

Synthèse	178

Commande de GDB	178

Exemple	178

1224,10 Commandes De Question De Symbole de GDB/mi	178

a- symbole-information-adressez Commande	178

Synthèse	178

Commande de GDB	178

Exemple	178

b- symbole-information-dossier Commande	178

Synthèse	178

Commande de GDB	179

Exemple	179

c- symbole-information-fonction Commande	179

Synthèse	179

Commande de GDB	179

Exemple	179

d- symbole-information-ligne Commande	179

Synthèse	179

Commande de GDB	179

Exemple	179

e- symbole-information-symbole Commande	179

Synthèse	179

Commande de GDB	180

Exemple	180

f- symbole-liste-fonctions Commande	180

Synthèse	180

Commande de GDB	180

Exemple	180

g- symbole-liste-lignes Commande	180

Synthèse	180

Commande de GDB	180

Exemple	180

h- symbole-liste-types Commande	180

Synthèse	180

Commande de GDB	181

Exemple	181

i- symbole-liste-variables Commande	181

Synthèse	181

Commande de GDB	181

Exemple	181

j- symbole-placez Commande	181

Synthèse	181

Commande de GDB	181

Exemple	181

k- symbole-type Commande	181

Synthèse	181

Commande de GDB	182

Exemple	182

1324,11 Commandes De Manipulation De Cible de GDB/mi	182

a- cible-attachez Commande	182

Synthèse	182

Commande de GDB	182

Exemple	182

b- cible-comparer-sections Commande	182

Synthèse	182

Commande de GDB	182

Exemple	182

c- cible-détachez Commande	182

Synthèse	182

Commande de GDB	183

Exemple	183

d- cible-débranchez Commande	183

Synthèse	183

Commande de GDB	183

Exemple	183

e- cible-téléchargez Commande	183

Synthèse	183

GDB Command	184

Example	184

f- cible-exec-statut Commande	185

Synthèse	185

Commande de GDB	185

Exemple	185

g- cible-liste-disponible-cibles Commande	185

Synthèse	185

Commande de GDB	185

Exemple	185

h- cible-liste-courant-cibles Commande	185

Synthèse	185

Commande de GDB	186

Exemple	186

i- cible-liste-paramètres Commande	186

Synthèse	186

Commande de GDB	186

Exemple	186

j- cible-choisissez Commande	186

Synthèse	186

Commande de GDB	186

Exemple	186

1424,12 Le Fil de GDB/mi Commande	187

a- fileter-information Commande	187

Synthèse	187

Commande de GDB	187

Exemple	187

b- fileter-liste-tout-filète Commande	187

Synthèse	187

Commande de GDB	187

Exemple	187

c- fileter-liste-identifications Commande	187

Synthèse	187

Commande de GDB	187

Exemple	188

d- fileter-choisissez Commande	188

Synthèse	188

Commande de GDB	188

Exemple	188

1524,13 GDB/mi Tracepoint Commande	188

1624,14 La Variable de GDB/mi Objecte	188

aMotivation pour les objets variables dans GDB/mi	188

bIntroduction aux objets variables dans GDB/mi	189

cDescription et utilisation des opérations sur les objets variables	189

d- variété-créez Commande	189

Synthèse	189

Résultat	190

e- variété-supprimez Commande	190

Synthèse	190

f- variété-placer-format Commande	190

Synthèse	190

g- variété-montrer-format Commande	190

Synthèse	190

h- variété-information-numérique-enfants Commande	191

Synthèse	191

i- variété-liste-enfants Commande	191

Synthèse	191

j- variété-information-type Commande	191

Synthèse	191

k- variété-information-expression Commande	191

Synthèse	191

l- variété-montrer-attribue Commande	192

Synthèse	192

m- variété-évaluer-expression Commande	192

Synthèse	192

n- variété-assignez Commande	192

Synthèse	192

Exemple	192

o- variété-mise à jour Commande	193

Synthèse	193

XXII25. Annotations de GDB	193

125,1 Quelle est une annotation?	193

225,2 Le Préfixe De Serveur	194

325,3 Annotation pour l'entrée de GDB	194

425,4 Erreurs	195

525,5 Notices D'Invalidation	195

625,6 Exécuter le programme	195

725,7 Montrer La Source	196

XXIII26. Reportage des bogues dans GDB	196

a27,2,2 Commandes De Mouvement De Readline	196

b27,2,3 Commandes De Massacre De Readline	197

c27,2,4 Arguments De Readline	197

d27,2,5 Recherche des commandes dans l'histoire	198

127,3 Dossier De Readline Init	198

a27,3,1 Syntaxe De Dossier De Readline Init	198

b27,3,2 Constructions Conditionnelles D'Init	202

c27,3,3 Dossier D'Init D'Echantillon	202

227,4 Commandes De Bindable Readline	204

a27,4,1 Commandes Pour Se déplacer	204

b27,4,2 Commandes Pour Manoeuvrer L'Histoire	204

c27,4,3 Commandes Pour Le Texte Changeant	205

d27,4,4 Tuer Et Tirer	206

e27,4,5 Indication Des Arguments Numériques	207

f27,4,6 Laissant Readline tapezr Pour Vous	207

g27,4,7 Macros De Clavier	207

h27,4,8 Quelques Commandes Diverses	207

327,5 Mode de Readline vi	208

XXIVA. Documentation De Formatage	209

XXVB. Installation de GDB	210

1B.1 compilant GDB dans un autre annuaire	211

2B.2 indiquant des noms pour des centres serveurs et des cibles	212

3B.3 configurez options	213

XXVIC. Commandes D'Entretien	213

XXVIIProtocole De Publication périodique De D. GDB Remote	215

1Paquets D.2	216

2Paquets De Réponse De l'Arrêt D.3	222

3Paquets Généraux De la Question D.4	222

4Format De Paquet Du Registre D.5	224

5Exemples D.6	225

6Prolongation à distance de protocole de D.7 File-I/O	225

aVue d'ensemble De D.7.1 File-I/O	225

bFondations du protocole D.7.2	226

cD.7.3 F paquet de demande	226

dD.7.4 F paquet de réponse	226

eTransfert de la mémoire D.7.5	227

fD.7.6 le message de Ctrl-C	227

gD.7.7 Console I/o	227

hD.7.8 isatty(3) l'appel	228

iD.7.9 system(3) l'appel	228

jListe D.7.10 d'appels soutenus	228

ouvert	228

fin	230

lu	230

écrivez	230

lseek	231

retitrez	231

détachez	232

stat/fstat	232

gettimeofday	233

isatty	233

système	233

kReprésentation spécifique du protocole D.7.11 des datatypes	234

Datatypes intégraux	234

Valeurs d'indicateur	234

statut de struct	235

struct timeval	235

lConstantes D.7.12	236

Ouvrez les drapeaux	236

valeurs de mode_t	236

Valeurs d'Errno	236

Drapeaux de Lseek	236

Limites	237

mExemples De D.7.13 File-I/O	237

XXVIIIE. Le Mécanisme D'Expression D'Agent de GDB	237

1E.1 Le Général Bytecode Design	238

2Descriptions D'E.2 Bytecode	239

3E.3 En utilisant Des Expressions D'Agent	242

4Possibilités Variables De la Cible E.4	243

5E.5 traçant sur Symmetrix	243

6Raisonnement E.6	245

Sommaire de GDB

Le but d'un programme de mise au point tel que GDB est de vous permettre de voir ce qui va sur l'"intérieur" un autre programme tandis qu'il s'exécute -- ou ce qu'un autre programme faisait où il s'est mise en erreur.

GDB peut faire quatre choses principales (plus d'autres choses à l'appui de ces derniers) pour vous aider à attraper des bogues:

Commencez votre programme, en indiquant tout ce qui pourrait affecter son comportement.

Faites votre arrêt de programme sur des conditions indiquées.

Examinez ce qui s'est produit, quand votre programme s'est arrêté.

Changez les choses dans votre programme, ainsi vous pouvez expérimenter avec corriger les effets d'un bogue et continuer pour se renseigner sur des autres.

Vous pouvez employer GDB pour mettre des programmes au point écrits dans C et C++.

Le soutien de Modula-2 est partiel.

Les programmes de Pascal de correction qui emploient des ensembles, les subranges, les variables de dossier, ou les fonctions nichées ne fonctionne pas actuellement. GDB ne soutient pas des expressions entrantes, imprimant des valeurs, ou des devices semblables en utilisant la syntaxe de Pascal.

GDB peut être employé pour mettre des programmes au point écrits en Fortran, bien qu'il puisse être nécessaire de se rapporter à quelques variables avec un soulignage de remorquage.

GDB peut être employé pour mettre des programmes au point écrits dans Objectif-C, en utilisant l'Apple/NeXT ou le temps d'exécution Objectif-C de GNU.

Un exemple d'un debuggage GDB

Vous pouvez employer ce manuel à vos loisirs pour tout lire au sujet de GDB. Cependant, une partie de commandes sont à conaître pour commencée à à l'aide du programme de mise au point. Ce chapitre illustre ces commandes.

Une des versions préliminaires de GNU m4 (un macro processeur générique) montre le bogue suivant : parfois, quand nous changeons les doubles quotes du défaut, les commandes capturaient une macro définition dans un autre fonctionnement d'arrêt. En session executee m4 suivante, nous définissons un macro foo au lequel augmente 0000; nous employons alors m4 la fonction intégrée defn pour définir bar identique. Cependant, quand nous changeons la double quote de départ de citation en <QUOTE> et la double quote de citation en <UNQUOTE>, le même procédé ne définit pas un nouveau synonyme baz:

	$ cd gnu/m4 $ ./m4 define(foo,0000) foo 0000 define(bar,defn(`foo')) bar 0000 changequote(<QUOTE>,<UNQUOTE>) define(baz,defn(<QUOTE>foo<UNQUOTE>)) baz C-d m4: End of input: 0: fatal error: EOF in string

Employons GDB pour essayer de voir ce qui continue.

$ de gdb m4

GDB est

logiciel libre et vous êtes bienvenu pour distribuer des copies

de lui dans certaines conditions ;

tapez l'"exposition copiant" pour voir les conditions.

Il n'y a absolument aucune garantie pour GDB ;

tapez l'"garantie d'exposition"

pour

des détails.

GDB 20031016, base libre de logiciel

de copyright 1999, inc....

(gdb)

GDB lit seulement assez de données de symbole pour savoir où s'arrêter; en conséquence, le premier message de sollicitation est soulevé très rapidement. Nous disons maintenant GDB d'employer une largeur plus étroite d'affichage qu'habituelle, pour des exemples adaptés à ce manuel.

(gdb) set width 70

Nous devons voir comment m4 la fonction intégrée changequote fonctionne. Après avoir regardé la source, nous savons que le sous-programme approprié est m4_changequote, ainsi nous plaçons un break là avec la commande break de GDB.

gdb) break m4_changequote Breakpoint 1 at 0x62f4: file builtin.c, line 879.

En utilisant run la commande, nous faisons m4 à démarrer sous la commande de GDB ; aussi longtemps que la commande n'atteint pas m4_changequote le sous-programme, le programme fonctionne comme d'habitude :

((gdb) run

Starting program: /work/Editorial/gdb/gnu/m4/m4

define(foo,0000)

foo

0000

Pour déclencher le break, nous appelons changequote. GDB suspend l'exécution de m4, des informations montrantes sur le contexte où il s'arrête.

changequote(<QUOTE>, <UNQUOTE >)

Breakpoint 1, m4_changequote (argc=3, argv=0x33c70)

at builtin.c:879

879 if (bad_argc(TOKEN_DATA_TEXT(argv[0]),argc,1,3))

Maintenant nous employons la commande n (next) d'avancer l'exécution à la prochaine ligne de la fonction courante.

(gdb) n

882 set_quotes((argc >= 2) ? TOKEN_DATA_TEXT(argv[1])\

: nil,

set_quotes ressemble à un sous-programme prometteur. Nous pouvons y entrer en employant la commande s (step) au lieu de next.step va à la prochaine ligne à exécuter dans n'importe quel sous-programme, ainsi il fait un pas dans set_quotes.

(gdb) s

set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "")

at input.c:530

530 if (lquote != def_lquote)

L'affichage qui montre au sous-programme où m4 est maintenant suspendu (et ses arguments) s'appelle un affichage d'armature de pile. Il montre un sommaire de la pile. Nous pouvons employer backtrace la commande (qui peut également être orthographiée bt), pour voir où nous sommes dans la pile dans l'ensemble : backtrace la commande montre le contenu de la pile pour chaque sous-programme actif.

(gdb) bt

#0 set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "")

at input.c:530

#1 0x6344 in m4_changequote (argc=3, argv=0x33c70)

at builtin.c:882

#2 0x8174 in expand_macro (sym=0x33320) at macro.c:242

#3 0x7a88 in expand_token (obs=0x0, t=209696, td=0xf7fffa30)

at macro.c:71

#4 0x79dc in expand_input () at macro.c:40

#5 0x2930 in main (argc=0, argv=0xf7fffb20) at m4.c:195

Nous faisons pas par quelques de lignes de plus pour voir ce qui se produit. Les deux premiers temps, nous pouvons employer `s'; les deux temps suivants nous employons n pour éviter de tomber dans xstrdup le sous-programme.

(gdb) s

0x3b5c 532 if (rquote != def_rquote)

(gdb) s

0x3b80 535 lquote = (lq == nil || *lq == '\0') ? \

def_lquote : xstrdup(lq);

(gdb) n

536 rquote = (rq == nil || *rq == '\0') ? def_rquote\

: xstrdup(rq);

(gdb) n

538 len_lquote = strlen(rquote);

La dernière ligne montrée regarde impair ; nous pouvons examiner les variables lquote et rquote voir s'ils sont en fait les nouvelles variables gauches et droites que nous avons indiquées. Nous employons la commande p (print) de voir leurs valeurs.

(gdb) p lquote

$1 = 0x35d40 "<QUOTE>"

(gdb) p rquote

$2 = 0x35d50 "<UNQUOTE>"

lquote et rquote sont en effet les nouvelles variables gauches et droites. Pour regarder un certain contexte, nous pouvons montrer dix lignes de source entourant la ligne courante avec l (list) la commande.

(gdb) l

533 xfree(rquote);

534

535 lquote = (lq == nil || *lq == '\0') ? def_lquote\

: xstrdup (lq);

536 rquote = (rq == nil || *rq == '\0') ? def_rquote\

: xstrdup (rq);

537

538 len_lquote = strlen(rquote);

539 len_rquote = strlen(lquote);

540 }

541

542 void

Faisons un pas après les deux lignes qui placent len_lquote et len_rquote, et puis examinez les valeurs de ces variables.

(gdb) n

539 len_rquote = strlen(lquote);

(gdb) n

540 }

(gdb) p len_lquote

$3 = 9

(gdb) p len_rquote

$4 = 7

Cela semble erroné, supposant que len_lquote et len_rquote sont censés être les longueurs de lquote et rquote respectivement. Nous pouvons les placer pour améliorer des valeurs en utilisant p la commande, puisqu'elle peut imprimer la valeur de n'importe quelle expression -- et cette expression peut inclure des appels et des tâches de sous-programme.

(gdb) p len_lquote=strlen(lquote)

$5 = 7

(gdb) p len_rquote=strlen(rquote)

$6 = 9

Est-ce que la difficulté est le problème d'employer les nouvelles quotes avec m4 la fonction intégrée defn? Nous pouvons laisser m4 continuer de s'exécuter avec c (continue) la commande, et puis essayons l'exemple cet ennui causé au commencement :

(gdb) c

Continuing.

define(baz,defn(<QUOTE>foo<UNQUOTE>))

baz

0000

Succès ! Les nouvelles quotes fonctionnent maintenant aussi bien que ceux par défaut. Le problème semble avoir été juste que les deux typos définissant les longueurs fausses. Nous permettons m4 la sortie en lui donnant un EOF comme entrée :

C-d

Program exited normally.

Le message `Program exited normally.' est de GDB ; il indique m4 a fini l'exécution. Nous pouvons finir notre session de GDB avec la commande quit de GDB.

(gdb) quit

Entrée et sortie de GDB

Ce chapitre discute comment commencer GDB, et comment en sortir. Les bases sont :

tapez `gdb' au début GDB.

tapez quit or C-d pour sortir..

Appel de GDB

Appelez GDB en exécutant le programme gdb. Une fois commencé, GDB lit les commandes du terminal jusqu'à ce que vous lui disiez de sortir.

Vous pouvez également démarrer gdb avec une variété d'arguments et d'options, pour indiquer plus que votre environnement de correction au départ.

La commande-ligne options décrites ici sont conçues pour couvrir une variété de situations ; dans quelques environnements, certaines de ces options peuvent efficacement être indisponibles.

La manière la plus habituelle de commencer GDB est avec un argument, indiquant un programme exécutable :

gdb program

Vous pouvez également commencer par un programme exécutable et un core file indiqués :

gdb program core

Vous pouvez, au lieu de cela, indiquer une identification de processus comme deuxième argument, si vous voulez corriger un processus courant :

gdb program 1234

qui attachera GDB au processus 1234 (à moins que vous avez également un dossier appelé `1234'; GDB vérifie un core file d'abord).

Tirer profit de la deuxième commande-ligne argument exige un logiciel d'exploitation assez complet ; quand vous employez GDB comme programme de mise au point à distance, il peut ne pas y avoir toute les notions de processus, et il n'y a souvent aucune manière d'obtenir un core dump. GDB vous avertira s'il ne peut pas attacher ou lire des core dump.

Vous pouvez sur option avoir gdb le passage de tous les arguments après le dossier exécutable à employer inférieur --args. Cette option arrête le traitement d'option.

gdb -- GCC d'args - O2 - c foo.c

Ceci causera gdb pour corriger gcc, et pour placer gccla 'commande-ligne arguments de s (voir la section 4.3 arguments de votre programme) à `-O2 -c foo.c'.

Vous pouvez démarrer gdb sans imprimer l'en tête, qui décrit la non-garantie de GDB, par l'indication -silent:

gdb -silent

Vous pouvez plus loin commander comment GDB commence vers le haut par employer la commande-ligne options. GDB lui-même peut vous rappeler les options disponibles.

Type

gdb -help

pour montrer toutes les options disponibles et décrire brièvement leur utilisation (`gdb -h' est un équivalent plus execute).

Toutes les options et ligne de commande arguments que vous donnez sont traitées dans l'ordre séquentiel. L'ordre fait une différence quand `-x' l'option est employée.

Choix des fichiers

Quand GDB commence, il lit tous les arguments autres que des options tel qu'un fichier exécutable ou un core file (ou identification de processus). C'est identique comme si les arguments ont été indiqués par `-se' et `-c' (ou `-p' des options respectivement. (GDB lit le premier argument qui n'a pas un drapeau associé d'option en tant qu'équivalent `-se' à l'option suivie de cet argument ; et le deuxième argument qui n'a pas un drapeau associé d'option, le cas échéant, en tant qu'équivalent au `-c'/`-p' à option suivis de cet argument.) Si le deuxième argument commence par un chiffre décimal, tentative d'attacher un process, et si cela échoue, tentative de l'ouvrir en tant que corefile. Si vous avez un corefile dont le nom commence par un chiffre, vous pouvez empêcher GDB de le traiter comme pid en le mettant en tête avec . de `/', par exemple. `./12345 '.

Si GDB n'a pas été configuré pour inclure le core file, comme pour la plupart des cibles incluses, alors il prendra un autre argument et l'ignorera.

Beaucoup d'options ont des formes executees ou longues; tous les deux sont montrés dans la liste suivante. GDB identifie également les formes longues si vous les tronquez, si il n'y a pas pas d'ambiguëté(si vous préférez, vous pouvez marquer des arguments d'option avec `--' plutôt que `-', bien que nous illustrions la convention plus habituelle.)

-symbols file

-s file

Lisez la table de symbole à partir du dossier file.

-exec file

-e file

Employez le fichier file un exécutable pour s'exécuter si approprié, et pour examiner des données pures en même temps qu'un core dump.

-se file

Lisez la table de symbole à partir du dossier file et employez-la comme dossier exécutable.

-core file

-c file

Utilisez le fichier file comme core dump à examiner.

-c number

-pid number

-p number

Reliez à l'identification de processus number, comme attach à la commande. S'il n'y a aucun un tel processus, GDB essayera d'ouvrir un core file appelé number.

-command file

-x file

Exécutez les commandes de GDB à partir du dossier file. Voir les fichiers de commande de section.

-directory directory

-d directory

Ajoutez directory au chemin à la recherche des fichiers sources.

-m

-mapped

Avertissement : cette option dépend des équipements du logiciel d'exploitation qui ne sont pas soutenus sur tous les systèmes.
Si les dossiers mémoire-tracés sont disponibles sur votre système par mmap l'appel de système, vous pouvez employer cette option pour faire écrire GDB les symboles de votre programme dans un dossier réutilisable dans l'annuaire courant. Si le programme que vous mettez au point s'appelle le `/tmp/fred ', le dossier tracé de symbole est `/tmp/fred.syms'. Les sessions de correction du futur GDB notent la présence de ce dossier, et peuvent rapidement tracer dans l'information de symbole d'elle, plutôt que de lire la table de symbole du programme exécutable.

Le dossier de `.syms'est spécifique à l'ordinateur central où GDB est run. Il tient une image exacte de la table de symbole interne de GDB. Il ne peut pas être partagé à travers les plateformes multiples de centre serveur.

-r

-readnow

Lisez la table de symbole entière de chaque dossier de symbole immédiatement, plutôt que le défaut, qui doit la lire incrémentalement juste ce qu'il est nécessaire. Ceci permet des opérations de démarrage plus lentes, mais de marques plus rapides.

Vous combinez typiquement -mapped et -readnow des options afin de construire un dossier de `.syms'qui contient l'information complète de symbole. Une invocation simple de GDB pour ne rien faire mais pour construire un dossier de `.syms'pour le futur usage est :

gdb -batch -nx -mapped -readnow programname

Choix des modes

Vous pouvez démarrer GDB dans divers modes alternatifs -- par exemple, en lots ou mode silencieux.

-nx

-n

N'exécutez pas les commandes non trouvées dans aucun dossier d'initialisation. Normalement, GDB exécute les commandes dans ces dossiers après que tous les options et arguments de commande aient été traités. Voir les fichiers de commande de section.

-quiet

-silent

-q

"Silencieux". N'imprimez pas les messages d'introduction et de copyright. Ces messages également sont supprimés en lots.

-batch

Démarrez en mode batch. Sortez avec le statut 0 après traitement de tous les fichiers de commande indiqués avec `-x' (et de toutes les commandes à partir des dossiers d'initialisation, si non empêché avec `-n'). Sortez avec le statut de non zéro si une erreur se produit en exécutant les commandes de GDB dans les fichiers de commande.

L'exploitation par lots peut être utile pour démarrer GDB comme filtre, par exemple pour télécharger et exécuter un programme sur un autre ordinateur ; afin d'écrire ce message utile

Le programme a sorti normalement.(Program exited normally.)

(qui est d'habitude publié toutes les fois qu'un programme fonctionnant sous la commande de GDB se termine) n'est pas publié en courant en lots.

-nowindows

-nw

"aucunes fenêtres". Si GDB vient avec une interface utilisateur graphique (GUI) incorporée, alors cette option indique GDB employer seulement la commande-ligne interface. Si aucun GUI n'est disponible, cette option n'a aucun effet.

-windows

-w

Si GDB inclut un GUI, alors cette option exige de lui d'être employé si possible.

-cd directory

executez GDB en utilisant directory en tant que son annuaire de fonctionnement, au lieu de l'annuaire courant.

-fullname

-f

Gnu Emacs place cette option quand il execute GDB comme sous-process. Il indique à GDB de produire le nom complet du fichier et le nombre de ligne d'un mode standard et reconnaissable chaque fois que le contenu de la pile est montrée (ce qui inclut chaque fois vos arrêts de programme). Ce format reconnaissable ressemble à deux `\032' caractères, suivis du nom de fichier, de la ligne nombre et de la position d'impression séparée par des deux points, et d'un caractère NL. Emacs--GDB au programme d'interface emploie les deux `\032' caractères comme signal pour montrer le code source de l'armature.

-epoch

L'interface d'Emacs-GDB d'époque place cette option quand elle execute GDB comme sous-processus. Elle indique à GDB de modifier ses routines d'impression afin de permettre à Epoch de montrer des valeurs des expressions dans une fenêtre séparée.

-annotate level

Cette option place l'annotation de niveau à l'intérieur de GDB. Son effet est identique à employer `set annotate level' (voir la section 25. Annotations de GDB). L'annotation level commande combien l'information GDB imprime ainsi que son message de sollicitation, valeurs des expressions, lignes de source, et d'autres types de rendement. Le niveau 0 est le normal, 1 de niveau sert quand GDB est run comme sous-processus de GNU Emacs, le niveau 3 est l'annotation maximum appropriée aux programmes qui commandent GDB, et 2 de niveau a été désapprouvés.

Le mécanisme d'annotation a en grande partie été superseeded par GDB/MI (voir la section 24. L'Interface de GDB/MI).

-async

Employez la boucle asynchrone d'événement pour la commande-ligne interface. GDB traite tous les événements, tels que l'entrée de clavier d'utilisateur, par l'intermédiaire d'une boucle spéciale d'événement. Ceci permet à GDB d'accepter et traiter des ordres d'utilisateur parallèlement au processus corrigé étant run(1), ainsi vous n'avez pas besoin d'attendre la commande pour renvoyer à GDB avant vous le type la prochaine commande (note : en date de la version 5.1, le côté de cible de l'opération asynchrone n'est pas encore en place, ainsi `-async' ne fonctionne pas entièrement encore.)

Quand l'entrée standard est reliée à un device terminal, GDB emploie la boucle asynchrone d'événement par défaut, à moins que neutralisé par `-noasync' l'option.

-noasync

Neutralisez la boucle asynchrone d'événement pour la commande-ligne interface.

--args

Changez l'interprétation de la ligne de commande de sorte que des arguments suivant le dossier exécutable soient passés comme ligne de commande arguments au subordonné. Cette option arrête le traitement d'option.

-baud bps

-b bps

Placez la ligne vitesse (vitesse baud ou bits par seconde) de n'importe quel interface série employé par GDB pour la correction à distance.

-tty device

-t device

executez en utilisant device pour les entrées sorties du programme.

- tui

Activez l'interface utilisateur en démarant. L'interface utilisateur terminale contrôle plusieurs fenêtres, les textes sur le terminal, les sorties montrant la source, l'assemblée, les registres et de GDB commande (voir l'interface utilisateur des textes de la section GDB ). N'employez pas cette option si vous executez GDB d'Emacs (voir la section en utilisant GDB sous GNU Emacs ).

- interprète interp

Utilisez l'interprète interp pour l'interface avec le programme ou le device de gestion. Cette option est censée être placée par les programmes qui communiquent avec GDB en utilisant le comme extrémité arrière. Voir la section commander des interprètes .

`-- interpreter=mi' (ou ` -- interpreter=mi2 'fait employer GDB l'interface de GDB/mi (voir la section l'interface de GDB/mi ) incluse dedans GDBN version 6,0. L'interface précédente de GDB/mi, incluse dans la version 5,3 de GDB, peut être choisie avec ` -- interpreter=mi1 '. De premières interfaces de GDB/mi ne sont pas soutenues.

-write

Ouvrez les dossiers exécutables et de noyau pour la lecture et l'écriture. C'est équivalent au `set write on' voir l'intérieur de GDB (voir les programmes de raccordement de la section 14,6 ).

-statistiques

Cette option fait imprimer GDB des statistiques au sujet d'utilisation de temps et de mémoire après qu'elle accomplisse chaque commande et revienne au message de sollicitation.

-version

Cette option fait imprimer GDB sa version et la non-garantie et sort.

Stopper GDB

quit [expression]

q

Pour sortir GDB, employez quit commandez (a abrégé q ou tapez un caractère de fin de fichier (habituellement C-D Si vous ne fournissez pas expression GDB se terminera normalement; autrement il se terminera en utilisant le résultat de expression comme code d'erreur.

Une interruption (souvent C-c ne sort pas de GDB, mais termine plutôt l'action de toute commande de GDB qui est en marche et revient au niveau commande de GDB. Il est sûr de taper le caractère d'interruption à tout moment parce que GDB ne lui permet pas d'entrer en vigueur jusqu'à un moment où il est sûr.

Si vous aviez employé GDB pour commander un processus ou un device joint, vous pouvez le libérer avec détach commande (voir la section corriger un processus déjà-courant ).

Commandes de shell

Si vous devez exécuter une commande shell pendant votre session de correction, il n'y a aucun besoin de laisser ou suspendre GDB; vous pouvez juste employer shell commande.

shell command string

Appelez une shell standard pour exécuter des commandes. Si elle existe, la variable d'environnement shell détermine quelle shell à démarrer. Autrement GDB emploie la shell de défaut ( `/bin/sh' sur les systèmes d'Unix, le `COMMAND.COM' sur le MSDOS, etc.).

L'utilitaire make est nécessaire souvent dans des environnements de développement. Vous ne devez pas employer shell commande à cette fin dans GDB:

make make-args

Exécutez make programme avec les arguments indiqués. C'est équivalent à `shell make make-args'.

Les traces de sortie

Vous pouvez vouloir sauver la sortie des commandes de GDB dans un fichier. Il y a plusieurs commandes pour controler les sorties GDB.

set logging on

Permettre le login

set logging off

Neutralisez la notation.

set logging file file

Changez le nom du fichier journal courant. Le fichier journal de défaut est le ` gdb.txt '.

set logging overwrite [on|off]

Par défaut, GDB un nouveau fichier journal. Set overwrite si vous voulez set logging on pour continuer le fichier journal existant.

set logging redirect [on|off]

Par défaut, la sortiede GDB ira sur le terminal et au fichier journal. Set redirect si vous voulez que la sortie aille seulement au fichier de log.

show logging

Montrez les valeurs courantes des arrangements de notation.

Commandes de GDB

Vous pouvez abréger une commande de GDB aux lettres premières du nom de commande, si cette abréviation est non ambigue et vous pouvez répéter certaines commandes de GDB en tapant juste return. Vous pouvez également employer TAB clef pour obtenir GDB pour compléter le reste d'un mot dans une commande (ou pour vous montrer les solutions de rechange disponibles, s'il y a plus d'une possibilité).

Syntaxe de commande

Une commande de GDB est une ligne simple d'entrée. Il n'y a aucune limite de temps. Cela commence par un nom de commande, qui est suivi des arguments dont la signification dépend de la commande. Par exemple, la commande step accepte un argument qui est le nombre de pas, par exemple `step 5'. Vous pouvez également utiliser step commande sans les arguments. Quelques commandes ne permettent aucun argument.

Des noms de commande de GDB peuvent toujours être tronqués si cette abréviation est non ambigue. D'autres abréviations possibles de commande sont énumérées dans la documentation pour différentes commandes. Dans certains cas, même on permet des abréviations ambiguës; par exemple, s est particulièrement défini en tant qu'équivalent à step quoiqu'il y ait d'autres commandes par dont les noms commencent s. Vous pouvez examiner ces abréviations en les employant comme arguments de la commande help.

Une ligne blanche comme entrée à GDB (taper juste return) est un moyen de répéter la commande précédente. Certaines commandes (par exemple, run) ne se répéteront pas de cette façon; ce sont des commandes dont la répétition involontaire pourrait causer des problèmes et que vous êtes peu susceptible de vouloir répéter.

list et X commandes, quand vous les répétez avec return écrivez les nouveaux arguments plutôt que de les répéter exactement comme tapé. Ceci permet le balayage facile de la source ou de la mémoire.

GDB peut également employer Return d'une autre manière: pour diviser la sortie prolongée, d'une manière semblable à l'utilitaire more (voir la taille d'écran de section ). Puisqu'il est facile de taper un Retour un trop grand nombre de fois dans cette situation, GDB neutralise la répétition de commande après n'importe quelle commande qui produit cette sorte d'affichage.

Tout texte de a # à l'extrémité de la ligne est un commentaire; il ne fait rien. C'est utile principalement aux commandes des dossiers (voir les fichiers de commande de section ).

C-o

est utile pour répéter des commandes compliquées. Cette commande accepte la ligne courante, comme le Return et cherche alors la prochaine ligne relativement à la ligne courante de l'histoire pour l'édition.

Complétion de commande

GDB peut compléter le reste d'un mot dans une commande, s'il y a seulement une possibilité; il peut également vous montrer ce qui sont les possibilités valides pour le prochain mot dans une commande, à tout moment. Ceci fonctionne pour des commandes de GDB, des commandes secondaires de GDB, et les noms des symboles dans votre programme.

Tapez Tab clef toutes les fois que vous voulez que GDB complète le reste d'un mot. S'il y a seulement une possibilité, GDB complète le mot, et vous attend pour finir la commande (ou taper Return ). Par exemple, si vous tapez

(gdb) info bre TAB

GDB complète le reste du mot `breakpoints' puisque c'est la commande secondaire commençant par bre;

(gdb) info breakpoints

Vous pouvez taper Return à ce moment, pour démarrer info breakpoints commandez, ou backspace et écrivez autre chose, si `breakpoints' ne ressemble pas à la commande que vous avez prévue. (si vous étiez sûr d'avoir info breakpoints en premier lieu, vous pourriez aussi bien pu taper juste Return après `info bre' pour exploiter des abréviations de commande plutôt que le nom commande complette).

S'il y a plus d'une possibilité pour le prochain mot quand vous TAB GDB actionne une cloche. Vous pouvez fournir plus de caractères et essayer encore, ou tapez juste sur Tab une deuxième fois; GDB montre tous les accomplissements possibles pour ce mot. Par exemple, vous pourriez vouloir placer un break sur un sous-programme par dont le nom commence par `make_` mais quand vous tapez `b make-tab` GDB retentit juste la cloche. tapez Tab montre encore tous les noms de fonction dans votre programme qui commencent par ces caractères, par exemple:

(gdb) b make_ TAB GDB sounds bell; press TAB again, to see: make_a_section_from_file make_environ make_abs_section make_function_type make_blockvector make_pointer_type make_cleanup make_reference_type make_command make_symbol_completion_list (gdb) b make_

Après avoir montré les possibilités disponibles, GDB copie votre entrée partielle (`make_' dans cet exemple) ainsi vous pouvez finir la commande.

Si vous voulez juste voir la liste de solutions de rechange en premier lieu, vous pouvez taper M-? plutôt que Tab deux fois. M-? signifie META . Vous pouvez taper l'un ou l'autre en maintenant une clef indiquée en tant que META décalez sur votre clavier (s'il y a d'un) tout en tapant ?ou As ESC suivi ?.

Parfois la chaîne de caractères que vous avez besoin peut contenir des parenthèses ou autres que GDB exclut normalement de sa notion d'un mot. Pour permettre l'écriture de cette chaîne , vous pouvez l'encadrer par un ' (marques de citation simple) dans GDB commande.

La situation le plus susceptible où vous pourriez avoir besoin de ceci est en tapant le nom d'une fonction de C++. C'est parce que C++ permet la surcharge de fonction (des définitions de la même fonction, distinguées multiples par le type d'argument). Par exemple, quand vous voulez placer un break vous pouvez devoir distinguer de si vous voulez dire la version name ou prendre un int paramètre, name(int)ou la version qui prend un float paramètre, name(float). Pour utilser les possibilités de complétion dans cette situation, tapez une simple quote ' au début du nom de fonction. Ceci alerte GDB qu'il va devoir considérer plus d'information qu'habituelle quand vous serrez Tab ou M -? pour demander lla complétion de mot:

((gdb) b 'bubble( M-?

bubble(double,double) bubble(int,int)

(gdb) b 'bubble(

Dans certains cas, GDB peut indiquer qu'un nom exige des quotes. Quand ceci se produit, GDB insère la citation pour vous (tout en complétant autant qu'il peut) si vous ne tapez pas la citation en premier lieu:

(gdb) b bub TAB

GDB alters your input line to the following, and rings a bell:

(gdb) b 'bubble(

En général, GDB peut indiquer qu'une citation est nécessaire (et des insertions il) si vous n'avez pas encore commencé à tapezr la liste d'argument quand vous demandez l'accomplissement sur un symbole surchargé.

Pour plus d'informations sur des fonctions surchargées, voir les expressions de C ++ . Vous pouvez employer la commande placez la surcharge-résolution au loin pour neutraliser la résolution de surcharge; voir les devices de GDB pour C ++ .

Obtenir l'aide

Vous pouvez toujours demander GDB lui-même l'information sur ses commandes, en utilisant la commande aide.

help

h

Vous pouvez employer help (abrégé h) sans des arguments pour montrer une liste executee de classes appelées des commandes:

(gdb) help

List of classes of commands:

aliases -- Aliases of other commands

breakpoints -- Making program stop at certain points

data -- Examining data

files -- Specifying and examining files

internals -- Maintenance commands

obscure -- Obscure features

running -- Running the program

stack -- Examining the stack

status -- Status inquiries

support -- Support facilities

tracepoints -- Tracing of program execution without

stopping the program

user-defined -- User-defined commands

Type "help" followed by a class name for a list of

commands in that class.

Type "help" followed by command name for full

documentation.

Command name abbreviations are allowed if unambiguous.

(gdb)

help class

Employer un mot de l'aide générale des classes comme argument, vous peut obtenir une liste des différentes commandes dans cette classe. Par exemple, voici l'affichage d'aide pour la classe status

(gdb) help status

Status inquiries.

List of commands:

info -- Generic command for showing things

about the program being debugged

show -- Generic command for showing things

about the debugger

Type "help" followed by command name for full

documentation.

Command name abbreviations are allowed if unambiguous.

(gdb)

aide commande

Avec un nom de commande aide, GDB montre un paragraphe execute sur la façon dont employer cette commande.

apropos args

La commande apropos args recherche toutes les commandes de GDB, et leur documentation, parce que l'expression régulière indiquée dedans args. Elle imprime toutes les formes trouvées. Par exemple:

apropos reload

résultats dans:

set symbol-reloading -- Set dynamic symbol table reloading

multiple times in one run

show symbol-reloading -- Show dynamic symbol table reloading

multiple times in one run

complete args

Listes des commandes tous les accomplissements possibles pour le commencement d'une commande. Utilisation args pour indiquer le commencement de la commande que vous voulez compléter. Par exemple:

complete i

résultats dans:

if

ignore

info

inspect

Ceci est prévu à l'usage de GNU Emacs.

En plus de aidevous pouvez employer les commandes de GDB information et exposition pour s'enquérir au sujet de l'état de votre programme, ou de l'état de GDB lui-même. Chaque commande soutient beaucoup de matières d'enquête; ce manuel présente chacune d'elles dans le contexte approprié. Les listes dessous information et dessous exposition dans le point d'index à tous les commandes secondaires. Voir l'index de section .

info

Cette commande (abrégée i) est pour décrire l'état de votre programme. Par exemple, vous pouvez énumérer les arguments donnés à votre programme avec info args, énumérez les registres actuellement en service avec info registers,ou énumérez les breaks que vous avez placés avec info breakpoints. Vous pouvez obtenir une liste complète de info sous-commandes avec help info.

set

Vous pouvez assigner le résultat d'une expression à une variable d'environnement avec set. Par exemple, vous pouvez setter le prompt GDB à un $-sign avec set prompt $.

show

Contrairement à information exposition est pour décrire l'état de GDB lui-même. Vous pouvez changer la plupart des choses que vous pouvez expositionen employant la commande relative ensemblepar exemple, vous pouvez commander avec quel système de numération est employé pour des affichages placez la baseou enquérez-vous simplement avec lequel est actuellement en service montrez la base.

Pour montrer tous les paramètres settable et leurs valeurs de courant, vous pouvez employer exposition sans des arguments; vous pouvez également employer ensemble d'information. Les deux commandes produisent le même affichage.

Voici trois divers exposition commandes secondaires, qui sont exceptionnels en manquant de la correspondance ensemble commandes:

montrez la version

Montrez quelle version de GDB fonctionne. Vous devriez inclure cette information dans des bogue-rapports de GDB. Si les versions multiples de GDB sont en service à votre emplacement, vous pouvez devoir déterminer quelle version de GDB vous executez; pendant que GDB évolue, de nouvelles commandes sont présentées, et les vieilles peuvent se défraîchir loin. En outre, beaucoup de fournisseurs de système embarquent des versions variables de GDB, et il y a des versions variables de GDB dans des distributions de GNU/Linux aussi bien. Le nombre de version est identique à celui annoncé quand vous commencez GDB.

montrez copier

Informations d'affichage sur la permission pour copier GDB.

montrez la garantie

Montrez le GNU rapport d'"AUCUNE GARANTIE", ou une garantie, si votre version de GDB vient avec un.

Programmes Courants Sous GDB

Quand vous exécutez un programme sous GDB, vous devez d'abord produire de l'information de mise en point quand vous le compilez.

Vous pouvez commencer GDB avec ses arguments, le cas échéant, dans un environnement de votre choix. Si vous faites la correction indigène, vous pouvez réorienter l'entrée et la sortiede votre programme, corrigez un processus fonctionnant déjà, ou tuez un processus d'enfant.

Compilation pour la correction

Afin de mettre un programme au point efficacement, vous devez produire de l'information de mise en point quand vous le compilez. Cette information de mise en point est stockée dans le fichier d'exécution; elle décrit le type de données de chaque variable ou la fonction et la correspondance entre la ligne de source numérote et des adresses dans le code exécutable.

Pour demander l'information de mise en point, indiquez `-g ' option quand vous executez le compilateur.

La plupart des compilateurs n'incluent pas des informations sur des macros de préprocesseur dans l'information de mise en point si vous indiquez `-g ' seul diminuez, parce que cette information est plutôt grande. La version 3,1 de GCC, le compilateur de GNU C, fournit de macro informations si vous indiquez les options `-gdwarf-2 ' et `-g3 'l'ancienne option demande l'information de mise en point dans le format du nain 2, et les dernières demandes "l'information supplémentaire". Ã€ l'avenir, nous espérons trouver des moyens plus compacts de représenter la macro information, de sorte qu'elle puisse être incluse avec `-g ' seulement.

Beaucoup de compilateurs de C ne peuvent pas manipuler `-g ' et `-O ' options ensemble. En utilisant ces compilateurs, vous ne pouvez pas produire des executables optimisés contenant l'information de mise en point.

GCC, le compilateur de GNU C, appuis `-g ' avec ou sans `-O 'permettre pour corriger a optimisé le code. Nous recommandons que vous employez toujours `-g ' toutes les fois que vous compilez un programme. Vous pouvez penser que votre programme est correct, mais il n'y a aucun sens en poussant votre chance.

Quand vous mettez un programme au point compilé avec `-g - O 'rappelez-vous que l'optimiseur réarrange votre code; le programme de mise au point vous montre ce qui est vraiment là. Ne sont pas trop étonnés quand le chemin d'exécution n'assortit pas exactement votre fichier source! Un exemple extrême: si vous définissez une variable, mais ne l'employez jamais, GDB ne voit jamais cette variable -- parce que le compilateur la optimise hors de l'existence.

Quelques choses ne fonctionnent pas aussi bien avec `-g - O ' comme avec juste `-g 'en particulier sur des machines avec l'établissement du programme d'instruction. En cas de doute, recompile avec `-g ' seulement, et si ceci fixe le problème, rapportez-svp le nous comme bogue (cas y compris d'essai!).

Des versions plus anciennes du compilateur de GNU C ont permis une option variable `-gg ' pour l'information de mise en point. GDB ne soutient plus ce format; si votre compilateur de GNU C a cette option, ne l'employez pas.

Commencer votre programme

course

r

Employez executez la commande de commencer votre programme sous GDB. You doit d'abord indiquer le nom de programme (excepté sur VxWorks) avec un argument à GDB (voir la section obtenir dans et hors de GDB ), ou en employant dossier ou exec-dossier commande (voir les commandes de section d'indiquer des dossiers ).

Si vous exécutez votre programme dans un environnement d'exécution qui soutient des processus, executez crée un processus inférieur et les marques qui traitent la course votre programme. (dans les environnements sans processus, course sauts au début de votre programme.)

L'exécution d'un programme est affectée par certaine information qu'il reçoit de son supérieur. GDB fournit des manières d'indiquer cette information, que vous devez faire avant de commencer votre programme. (vous pouvez le changer après avoir commencé votre programme, mais de tels changements affectent seulement votre programme la prochaine fois que vous le commencez.) Cette information peut être divisée en quatre catégories:

Les arguments.

Indiquez les arguments pour donner votre programme comme arguments de executez commande. Si une shell est disponible sur votre cible, la shell est employée pour passer les arguments, de sorte que vous puissiez employer des conventions normales (telles que l'expansion de wildcard ou la substitution variable) en décrivant les arguments. Dans des systèmes d'Unix, vous pouvez commander quelle shell est employée avec shell variable d'environnement. Voir la section les arguments de votre programme .

L'environnement.

Votre programme hérite normalement de son environnement de GDB, mais vous pouvez employer les commandes de GDB placez l'environnement et supprimez l'environnement pour changer les parties de l'environnement qui affectent votre programme. Voir la section votre environnement de programme .

L'annuaire de fonctionnement.

Votre programme hérite de son annuaire de fonctionnement de GDB. Vous pouvez placer l'annuaire de fonctionnement de GDB avec CD commande dans GDB. Voir la section l'annuaire de fonctionnement de votre programme .

L'entrée et la sortiestandard.

Votre programme utilise normalement le même device pour l'entrée standard et la sortiestandard que GDB emploie. Vous pouvez réorienter l'entrée et la sortiedans course la ligne de commande, ou vous peut employer téléscripteur commandez de placer un device différent pour votre programme. Voir la section l'entrée et la sortiede votre programme .

Avertissement: Tandis que la redirection d'entrée et de rendement fonctionnent, vous ne pouvez pas utiliser des pipes pour passer la sortiedu programme que vous mettez à un autre programme; si vous essayez ceci, GDB est susceptible de s'enrouler vers le haut de mettre le programme au point faux.

Quand vous publiez course commandez, votre programme commence à s'exécuter immédiatement. Voir la section s'arrêter et continuer , pour la discussion de la façon assurer votre programme pour s'arrêter. Une fois que votre programme s'est arrêté, vous pouvez appeler des fonctions dans votre programme, employer copie ou appel commandes. Voir les données d'examiner de section .

Si la période de modification de votre dossier de symbole a changé depuis la dernière fois GDB lisait ses symboles, écarts de GDB sa table de symbole, et les lit encore. Quand elle fait ceci, GDB essaye de maintenir vos breaks courants.

4,3 Les arguments de votre programme

Les arguments à votre programme peuvent être indiqués par les arguments du course commande. Ils sont passés à une shell, qui augmente des caractères de wildcard et effectue la redirection d'cI/o, et de là à votre programme. Votre shell la variable d'environnement (si elle existe) indique ce que la shell GDB emploie. Si vous ne définissez pas shellGDB emploie la shell de défaut ( `/bin/sh ' sur Unix).

Sur des systèmes de non-Non-Unix, le programme est habituellement appelé directement par GDB, qui émule la redirection d'cI/o par l'intermédiaire des appels appropriés de système, et les caractères de wildcard sont augmentés par le code de démarrage du programme, pas par la shell.

course sans des utilisations d'arguments les mêmes arguments employés par le précédent courseou ceux ont placé par placez les args commande.

placez les args

Indiquez les arguments à employer la prochaine fois que votre programme est exécuté. Si placez les args n'a aucun argument, course exécute votre programme sans des arguments. Une fois que vous avez exécuté votre programme avec des arguments, employer placez les args avant le prochain course est la seule manière de la démarrer encore sans arguments.

montrez les args

Montrez que les arguments donnaient votre programme quand elle est commencée.

4,4 Votre environnement de programme

L'environnement se compose d'un ensemble de variables d'environnement et de leurs valeurs. Les variables d'environnement enregistrent par convention des choses telles que votre nom d'utilisateur, votre répertoire local, votre type terminal, et votre chemin de recherche pour que les programmes fonctionnent. Habituellement vous installez des variables d'environnement avec la shell et elles sont héritées par tous les autres programmes que vous exécutez. En corrigeant, il peut être utile d'essayer d'exécuter votre programme avec un environnement modifié sans devoir commencer GDB plus d'encore.

chemin annuaire

Ajoutez annuaire à l'avant du CHEMIN variable d'environnement (le chemin de recherche pour des executables) qui sera passée à votre programme. La valeur de CHEMIN utilisé par GDB ne change pas. Vous pouvez indiquer plusieurs noms d'annuaire, séparés par le whitespace ou par un caractère system-dependent de séparateur (`: ' sur Unix, `;' sur le MSDOS et le Mme.-Windows). Si annuaire est déjà dans le chemin, il est déplacé à l'avant, ainsi il est recherché plus tôt.

Vous pouvez employer la corde `$cwd ' pour se rapporter à celui qui soit les recherches de l'annuaire de fonctionnement courant alors GDB le chemin. Si vous employez `.' au lieu de cela, il se rapporte à l'annuaire où vous avez exécuté chemin commande. GDB remplace `.' dans annuaire argument (avec le chemin courant) avant de s'ajouter annuaire au chemin de recherche.

montrez les chemins

Montrez la liste de chemins de recherche pour des executables ( CHEMIN variable d'environnement).

montrez l'environnement [varname]

Imprimez la valeur de la variable d'environnement varname être donné à votre programme quand il commence. Si vous ne fournissez pas varnameimprimez les noms et les valeurs de toutes les variables d'environnement à donner à votre programme. Vous pouvez abréger environnement As env.

placez l'environnement varname [ =valeur]

Placez la variable d'environnement varname à valeur. La valeur change pour votre programme seulement, pas pour GDB lui-même. valeur peut être n'importe quelle corde; les valeurs des variables d'environnement sont les cordes justes, et n'importe quelle interprétation est fournie par votre programme lui-même. valeur le paramètre est facultatif; si on l'élimine, la variable est placée à une valeur nulle.

Par exemple, cette commande:

placez l'cUtilisateur = le foo d'env

dit le programme mis au point, une fois plus tard run, que son utilisateur est appelé foo de ` '. (les espaces autour ` = ' sont employés pour la clarté ici; ils ne sont pas exigés réellement.)

supprimez l'environnement varname

Enlevez la variable varname de l'environnement à passer à votre programme. C'est différent de env réglé de ` varname = ' supprimez l'environnement enlève la variable de l'environnement, plutôt que de de lui assigner une valeur vide.

Avertissement: Sur des systèmes d'Unix, GDB exécute votre programme en utilisant la shell indiquée par votre shell variable d'environnement si elle existe (ou /bin/sh si pas). Si votre shell la variable appelle une shell qui execute un dossier d'initialisation -- tel que `.cshrc ' pour la C-shell, ou `.bashrc ' pour le coup -- toutes les variables que vous placez du fait le dossier affectent votre programme. Vous pouvez souhaiter déplacer l'arrangement des variables d'environnement aux dossiers qui sont seulement runs quand vous signez sur, comme `.login ' ou `.profile '.

4,5 Annuaire de fonctionnement de votre programme

Chaque fois que vous commencez votre programme avec courseelle hérite de son annuaire de fonctionnement à partir de l'annuaire de fonctionnement courant de GDB. L'annuaire de fonctionnement de GDB est au commencement de celui qu'il ait hérité de son processus de parent (typiquement la shell), mais vous pouvez indiquer un nouvel annuaire de fonctionnement dans GDB avec CD commande.

L'annuaire de fonctionnement de GDB sert également de défaut aux commandes qui indiquent des dossiers pour GDB pour opérer. Voir les commandes de section d'indiquer des dossiers .

CD annuaire

Placez l'annuaire de fonctionnement de GDB à annuaire.

pwd

Imprimez l'annuaire de fonctionnement de GDB.

4,6 L'entrée et la sortiede votre programme

Par défaut, le programme que vous exécutez sous GDB entre et produit à la même borne que GDB utilise. GDB commute la borne à ses propres modes terminaux pour agir l'un sur l'autre avec vous, mais il enregistre les modes terminaux que votre programme employait et commute de nouveau à eux quand vous continuez d'exécuter votre programme.

borne d'information

L'information d'affichages enregistrée par GDB au sujet des modes terminaux que votre programme emploie.

Vous pouvez réorienter l'entrée et/ou la sortiede votre programme en utilisant la redirection de shell avec course commande. Par exemple,

Â

course > outfile

commence votre programme, détournant son rendement au ` de dossier outfile '.

Une autre manière d'indiquer où votre programme devrait faire l'entrée et la sortieest avec téléscripteur commande. Cette commande accepte un nom de fichier comme argument, et cause ce dossier être le défaut pour le futur course commandes. Elle remet à zéro également la borne de contrôle pour le processus d'enfant, pour le futur course commandes. Par exemple,

Â

téléscripteur/dev/ttyb

ordonne que les processus ont commencé par suivant course les commandes se transfèrent pour faire l'entrée et la sortiesur la borne `/dev/ttyb ' et pour les avoir qui en tant que leur borne de contrôle.

Une redirection explicite dedans course dépasse téléscripteur ont commandé la borne d'effet sur le device d'entrée-sortie, mais non son effet sur de contrôle.

Quand vous employez téléscripteur commandez ou réorientez l'entrée dans executez commandez, seulement l'entrée pour votre programme est affectée. L'entrée pour GDB vient toujours de votre borne.

4,7 Correction d'un processus déjà-courant

attache processus-identification

Attaches de cette commande à un processus courant -- un qui a été commencé en dehors de GDB. (dossiers d'information montre vos cibles actives.) La commande prend comme argument une identification de processus. La manière habituelle de découvrir l'processus-identification d'un processus d'Unix est avec picoseconde utilité, ou avec les travaux de ` - l ' commande de shell.

attache ne répète pas si vous serrez Retour une deuxième fois après exécution de la commande.

Pour employer attachevotre programme doit fonctionner dans un environnement qui soutient des processus; par exemple, attache ne travaille pas pour des programmes sur les cibles de nu-conseil qui manquent d'un logiciel d'exploitation. Vous devez également avoir la permission d'envoyer au processus un signal.

Quand vous employez attachele programme de mise au point trouve le programme fonctionner dans le de processus d'abord en regardant dans l'annuaire de fonctionnement courant, puis (si le programme n'est pas trouvé) en utilisant le chemin de recherche de fichier source (voir la section indiquer des répertoires source ). Vous pouvez également employer dossier commande de charger le programme. Voir les commandes de section d'indiquer des dossiers .

La première chose GDB fait après s'être chargé de corriger le processus indiqué est de l'arrêter. Vous pouvez examiner et modifier un processus joint avec toutes les commandes de GDB qui sont d'habitude disponibles quand vous commencez des processus avec course. Vous pouvez insérer des breaks; vous pouvez faire un pas et continuer; vous pouvez modifier le stockage. Si vous plutôt le processus continueriez de démarrer, vous pouvez employer continuez commandez après GDB de fixation au processus.

détachez

Quand vous avez fini de corriger le processus joint, vous pouvez employer détachez commandez de le libérer de la commande de GDB. Le détachement du processus continue son exécution. Après détachez commandez, ces processus et GDB deviennent complètement indépendants une fois de plus, et vous êtes prêt à attache un autre processus ou commencent un avec course. détachez ne répète pas si vous serrez Retour encore après exécution de la commande.

Si vous sortez GDB ou employez course commandez tandis que vous ont un processus ci-joint, vous tuez ce processus. Par défaut, GDB demande la confirmation si vous essayez de faire l'une ou l'autre de ces choses; vous pouvez commander si vous devez confirmer en employant placez confirment commande (voir des avertissements et les messages facultatifs de section ).

4,8 Tuer le processus d'enfant

mise à mort

Tuez le processus d'enfant dans lequel votre programme fonctionne sous GDB.

Cette commande est utile si vous souhaitez corriger un vidage d'mémoire au lieu d'un processus courant. GDB ignore n'importe quel dossier de vidage d'mémoire tandis que votre programme fonctionne.

Sur quelques logiciels d'exploitation, un programme ne peut pas être exécuté en dehors de GDB tandis que vous avez des breaks réglés là-dessus que l'intérieur GDB. You peut employer mise à mort commandez dans cette situation de laisser exécuter votre programme en dehors du programme de mise au point.

mise à mort la commande est également utile si vous souhaitez à recompile et au relink votre programme, puisque sur beaucoup de systèmes il est impossible de modifier un dossier exécutable tandis qu'il fonctionne dans un processus. Dans ce cas-ci, quand vous prochain type courseGDB note que le dossier a changé, et lit la table de symbole encore (tout en essayant de préserver vos arrangements courants de break).

4,9 Programmes de correction avec les fils multiples

Dans quelques logiciels d'exploitation, tels que HP-ux et Solaris, un programme simple peut avoir plus d'un fil d'exécution. La sémantique précise des fils diffèrent d'un logiciel d'exploitation à l'autre, mais en général les fils d'un programme simple sont apparentés aux processus multiples -- sauf qu'ils partagent une espace adresse (c'est-à-dire, ils peuvent tout examiner et modifier les mêmes variables). D'autre part, chaque fil a ses propre registres et pile d'exécution, et mémoire peut-être privée.

GDB fournit ces équipements pour mettre des programmes au point à lecture multiple:

avis automatique de nouveaux fils

fil de ` threadno'une commande de commuter parmi des fils

fils d'information de `une commande de s'enquérir au sujet des fils existants

le fil de ` s'appliquent [threadno] [tous] args'une commande de s'appliquer une commande à une liste de fils

breaks fileter-spécifiques

Avertissement: Ces équipements ne sont pas encore disponibles sur chaque configuration de GDB où les appuis de logiciel d'exploitation filète. Si votre GDB ne soutient pas des fils, ces commandes n'ont aucun effet. Par exemple, un système sans appui de fil ne montre aucun rendement de fils d'information de `et rejette toujours fil commande, comme ceci:

(gdb) identification 1 de fil du fil 1 de fils d'information (gdb) non connue. Employez l'"information filète" la commande de voir les identifications des fils actuellement connus.

La fonction de mise au point de fil de GDB vous permet d'observer tous les fils tandis que votre programme fonctionne le fil -- mais toutes les fois que GDB prend la commande, un est en particulier toujours le centre de la correction. Ce fil s'appelle le fil courant . Les commandes de correction montrent l'information de programme de la perspective du fil courant.

Toutes les fois que GDB détecte un nouveau fil dans votre programme, il montre l'identification de système de cible pour le fil avec un message sous la forme `[New systag] '. systag est une marque de fil dont la forme change selon le système particulier. Par exemple, sur LynxOS, vous pourriez voir

Â

[ nouveau fil 27 de processus 35 ]

quand GDB note un nouveau pour fileter. En revanche, sur un système de SGI, systag est simplement quelque chose comme ` 368'de processussans davantage de qualificateur.

Pour la correction, GDB associe son propre nombre de fil -- toujours un seul nombre entier -- à chaque fil dans votre programme.

fils d'information

Montrez un sommaire de tous les fils actuellement dans votre programme. Affichages de GDB pour chaque fil (dans cet ordre):

le nombre de fil assigné par GDB

la marque du fil de système de cible (systag

le sommaire courant d'armature de pile pour ce fil

Un astérisque ` * ' à la gauche du fil de GDB le nombre indique le fil courant.

Par exemple,

Â

(gdb) fil du processus 35 des fils 3 d'information 27 0x3ê5 dans le sigpause () 2 fil du processus 35 23 0x3ê5 dans le sigpause () * 1 force du fil 13 du processus 35 (argc=1, argv=0x7ffffff8) à threadtest.c:68

Sur les systèmes HP-ux:

Pour la correction, GDB associe son propre nombre de fil -- un petit nombre entier assigné dans l'ordre de fileter-création -- à chaque fil dans votre programme.

Toutes les fois que GDB détecte un nouveau fil dans votre programme, il montre du fil de GDB le nombre et l'identification de système de cible pour le fil avec un message sous la forme `[New systag] '. systag est une marque de fil dont la forme change selon le système particulier. Par exemple, sur HP-ux, vous voyez

Â

[ nouveau fil 2 (fil 26594 de système) ]

quand GDB note un nouveau pour fileter.

fils d'information

Montrez un sommaire de tous les fils actuellement dans votre programme. Affichages de GDB pour chaque fil (dans cet ordre):

le nombre de fil assigné par GDB

la marque du fil de système de cible (systag

le sommaire courant d'armature de pile pour ce fil

Un astérisque ` * ' à la gauche du fil de GDB le nombre indique le fil courant.

Par exemple,

Â

(gdb) information filète * 3 système fil 26607 ouvrier (wptr=0x7b09c318 "@") \ à quicksort.c:137 2 système fil 26606 0x7b0030d8 dans __ ksleep () \ de/usr/lib/libc.2 1 système fil 27905 0x7b003498 dans _ brk () \ de/usr/lib/libc.2

fil threadno

Faites le nombre de fil threadno le fil courant. L'argument de commande threadno est le nombre interne de fil de GDB, comme montré dans le premier domaine du fils d'information de ` affichage. GDB répond en montrant la marque de système du fil que vous avez choisi, et son sommaire courant d'armature de pile:

fil (de gdb) 2 [ commutation à fil 23 de processus 35 ] 0x3ê5 dans le sigpause ()

Comme avec `[New ... ] ' message, la forme du texte ensuite ` commutant à ' dépend des conventions de votre système pour identifier des fils.

le fil s'appliquent [threadno] [tous] args

le fil s'appliquent la commande vous permet de vous appliquer une commande à un ou plusieurs fils. Indiquez les nombres de fils que vous voulez affecté avec l'argument de commande threadno. threadno est le nombre interne de fil de GDB, comme montré dans le premier domaine du fils d'information de ` affichage. S'appliquer une commande à toute filète, emploie le fil appliquent tous args.

Toutes les fois que GDB arrête votre programme, dû à un break ou à un signal, il choisit automatiquement le fil où ce break ou signal s'est produit. GDB vous alerte au commutateur de contexte avec un message de la forme `[Switching à systag] ' pour identifier le fil.

Voir la section des programmes à lecture multiple s'arrêter et commencer , pour plus d'informations sur la façon dont GDB se comporte quand vous arrêtez et commencez des programmes avec les fils multiples.

Voir la section placer des watchpoints , pour information au sujet des watchpoints dans les programmes avec les fils multiples.

4,10 Programmes de correction avec des processus multiples

Sur la plupart des systèmes, GDB n'a aucun soutien spécial des programmes de correction qui créent employer additionnel de processus fourchette fonction. Quand un programme bifurque, GDB continuera à corriger le processus de parent et le processus d'enfant courra sans difficulté. Si vous avez placé un break en n'importe quel code que l'enfant exécute alors, l'enfant obtiendra a SIGTRAP signalez ce que (à moins qu'il attrape le signal) le fera terminer.

Cependant, si vous voulez corriger le processus d'enfant il y a un workaround qui n'est pas trop douloureux. Mettez un appel à sommeil dans le code que le processus d'enfant exécute après la fourchette. Il peut être utile de dormir seulement si une certaine variable d'environnement est placée, ou un certain dossier existe, de sorte que retarde n'aient pas besoin de se produire quand vous ne voulez pas démarrer GDB sur l'enfant. Tandis que l'enfant dort, employez picoseconde programme pour obtenir sa identification de processus. Dites alors GDB (une nouvelle invocation de GDB si vous corrigez également le processus de parent) d'attacher au processus d'enfant (voir la section 4,7 corriger un processus déjà-courant ). De ce point sur vous peut corriger le processus d'enfant juste comme n'importe quel autre processus au lequel vous avez attaché.

Sur HP-ux (11.x et plus tard seulement?), GDB fournit l'appui pour les programmes de correction qui créent employer additionnel de processus fourchette ou vfork fonction.

Par défaut, quand un programme bifurque, GDB continuera à corriger le processus de parent et le processus d'enfant courra sans difficulté.

Si vous voulez suivre le processus d'enfant au lieu du processus de parent, employez la commande placez le suivre-fourchette-mode.

placez le suivre-fourchette-mode mode

Placez la réponse de programme de mise au point à un appel de programme de fourchette ou vfork. Un appel à fourchette ou vfork crée un nouveau processus. mode peut être:

parent

Le processus original est corrigé après une fourchette. Le processus d'enfant execute sans difficulté. C'est le défaut.

enfant

Le nouveau processus est corrigé après une fourchette. Le processus de parent execute sans difficulté.

demandez

Le programme de mise au point demandera un des choix ci-dessus.

montrez le suivre-fourchette-mode

Montrez la réponse courante de programme de mise au point à a fourchette ou vfork appel.

Si vous demandez à corriger un processus d'enfant et a vfork est suivi d' execGDB exécute la nouvelle cible jusqu'au premier break dans la nouvelle cible. Si vous faites placer un break dessus principal dans votre programme original, le break sera également placé sur le processus d'enfant principal.

Quand un processus d'enfant est engendré près vforkvous ne pouvez pas corriger l'enfant ou parent jusqu'à l' exec l'appel accomplit.

Si vous publiez a course commande à GDB après exec l'appel s'exécute, les nouveaux relancements de cible. Pour remettre en marche le processus de parent, employez dossier commande avec le nom exécutable de parent en tant que son argument.

Vous pouvez employer crochet commande de faire l'arrêt de GDB toutes les fois qu'a fourchette vforkou exec l'appel est fait. Voir la section placer des catchpoints .

5. Arrêt et continuer

Les principaux buts d'utiliser un programme de mise au point sont de sorte que vous puissiez arrêter votre programme avant qu'il se termine; ou de sorte que, si votre programme fonctionne dans l'ennui, vous puissiez étudier et découvrir pourquoi.

Ã€ l'intérieur de GDB, votre programme peut s'arrêter pour n'importe laquelle de plusieurs raisons, telles qu'un signal, d'un break, ou d'atteindre une nouvelle ligne après une commande de GDB comme step. Vous pouvez alors examiner et changer des variables, nouveaux breaks d'ensemble ou enlever les vieux, et puis continuez l'exécution. Habituellement, les messages montrés par GDB fournissent l'explication suffisante du statut de votre programme -- mais vous pouvez également explicitement demander cette information à tout moment.

programme d'information

Informations d'affichage sur le statut de votre programme: qu'il fonctionne ou pas, quel processus c'est, et pourquoi il s'est arrêté.

5,1 breaks, watchpoints, et catchpoints

Un break fait votre arrêt de programme toutes les fois qu'un certain point dans le programme est atteint. Pour chaque break, vous pouvez ajouter des conditions à la commande dans un détail plus fin si votre programme s'arrête. Vous pouvez placer des breaks avec coupure commande et ses variantes (voir la section placer des breaks ), d'indiquer l'endroit où votre programme devrait s'arrêter par le nombre de ligne, nom de fonction ou exiger l'adresse dans le programme.

Dans HP-ux, SunOS 4.x, SVR4, et configurations de l'alpha OSF/1, vous pouvez placer des breaks dans les bibliothèques partagées avant que l'exécutable soit run. Il y a une limitation mineure sur les systèmes HP-ux: vous devez attendre jusqu'à ce que l'exécutable soit run afin de placer des breaks dans les routines de bibliothèque partagée qui ne s'appellent pas directement par le programme (par exemple, les routines qui sont des arguments dans a pthread_create appel).

Un watchpoint est un break spécial qui arrête votre programme quand la valeur d'une expression change. Vous devez employer une commande différente de placer des watchpoints (voir la section placer des watchpoints ), mais hormis celui, vous pouvez contrôler un watchpoint comme n'importe quel autre break: vous permettez, neutralisez, et supprimez des breaks et des watchpoints en utilisant les mêmes commandes.

Vous pouvez vous charger d'avoir des valeurs de votre programme montré automatiquement toutes les fois que GDB s'arrête à un break. Voir l'affichage automatique de section .

Un catchpoint est un autre break spécial qui arrête votre programme quand un certain genre d'événement se produit, comme le lancement d'une exception de C ++ ou du chargement d'une bibliothèque. Comme avec des watchpoints, vous employez une commande différente de placer un catchpoint (voir la section placer des catchpoints ), mais hormis celui, vous pouvez contrôler un catchpoint comme n'importe quel autre break. (pour s'arrêter quand votre programme reçoit un signal, employez poignée commande; voir les signaux .)

GDB assigne un nombre à chaque break, watchpoint, ou catchpoint quand vous le créez; ces nombres sont des nombres entiers successifs commençant par un. Dans plusieurs des commandes pour commander de divers devices des breaks vous employez le nombre de break pour dire quel break vous voulez changer. Chaque break peut être permis ou neutralisé ; si neutralisé, il n'a aucun effet sur votre programme jusqu'à ce que vous le permettiez encore.

Les commandes d'un certain GDB acceptent une gamme des breaks sur lesquels pour fonctionner. Une gamme de break est l'une ou l'autre par nombre simple de break, comme ` 5'ou deux tels nombres, dans l'ordre croissant, ont séparé par un trait d'union, comme ` 5-7 '. Quand une gamme de break est indiquée à une commande, tout le break du fait la gamme sont opérées.

5,1,1 Réglage des breaks

Des breaks sont placés avec coupure commande (abrégée bLa variable de convenance de programme de mise au point `$bpnum ' enregistre le nombre du break que vous avez placé le plus récemment; voir les variables de convenance , pour une discussion de ce que vous pouvez faire avec des variables de convenance.

Vous avez plusieurs manières de dire où le break devrait disparaître.

coupure fonction

Placez un break à l'entrée pour fonctionner fonction. En utilisant les langues source qui permettent la surcharge des symboles, tels que C ++ , fonction peut se rapporter à plus d'un endroit possible pour se casser. Voir les menus de break de section , pour une discussion de cette situation.

coupure +excentrage

coupure -excentrage

Placez un break un certain nombre de lignes en avant ou en arrière de la position à laquelle l'exécution s'est arrêtée dans l'armature actuellement choisie de pile . (voir les vues de section , pour une description des armatures de pile.)

coupure linenum

Placez un break à la ligne linenum dans le fichier source courant. Le fichier source courant est le dernier dossier dont le texte source a été imprimé. Le break arrêtera votre programme juste avant qu'il exécute n'importe lequel du code sur cette ligne.

coupure nom de fichierlinenum

Placez un break à la ligne linenum dans le fichier source nom de fichier.

coupure nom de fichierfonction

Placez un break à l'entrée pour fonctionner fonction trouvé dans le dossier nom de fichier. L'indication d'un nom de fichier comme un nom de fonction est superflue à moins que si multiples les dossiers contiennent des fonctions pareillement appelées.

coupure *adresse

Placez un break à l'adresse adresse. Vous pouvez employer ceci pour placer des breaks dans les parties de votre programme qui n'ont pas des fichiers source d'information de mise en point ou.

coupure

Une fois appelé sans tous arguments, coupure place un break à la prochaine instruction d'être exécuté dans l'armature choisie de pile (voir la section examiner la pile ). Dans n'importe quelle armature choisie mais le les plus secrets, ceci fait votre arrêt de programme dès que la commande reviendra à cette armature. C'est semblable à l'effet de a finition commandez dans l'armature à l'intérieur de l'armature choisie -- sauf que finition ne laisse pas un break actif. Si vous employez coupure sans argument dans l'armature les plus secrets, GDB s'arrête la prochaine fois qu'il atteint l'endroit courant; ceci peut être les boucles intérieures utiles.

GDB ignore normalement des breaks quand il reprend l'exécution, jusqu'au moins à une instruction a été exécuté. S'il ne faisait pas ceci, vous ne pourriez pas procéder après un break sans neutraliser d'abord le break. Cette règle s'applique si le break a déjà existé quand votre programme s'est arrêté.

coupure ... si cond

Placez un break dans la condition condévaluez l'expression cond chaque fois que le break est atteint, et arrêt seulement si la valeur est de non zéro -- c'est-à-dire, si cond évalue comme vrai. ` ... ' stands pour un des arguments possibles décrits au-dessus (ou d'aucun argument) d'indiquer où se casser. Voir la section casser des conditions , pour plus d'information sur des états de break.

tbreak args

Placez un break permis seulement pour un arrêt. args sont les mêmes que pour coupure commandez, et le break est placé de la même manière, mais le break est automatiquement supprimé ensuite la première fois que votre programme s'arrête là. Voir les breaks de neutralisation de section .

hbreak args

Placez un break assisté par le matériel. args sont les mêmes que pour coupure la commande et le break est placée de la même manière, mais le break exige l'appui de matériel et du matériel de cible peut ne pas avoir cet appui. Le but principal de ceci est correction de code d'cEprom/rom, ainsi vous pouvez placer un break à une instruction sans changer l'instruction. Ceci peut être employé avec la nouvelle emprisonner-génération fournie par SPARClite DSU et cibles d'un certain x86-based. Ces cibles produiront des pièges quand un programme accède à quelques données ou l'adresse d'instruction qui est assignée à la correction s'enregistre. Cependant les registres de break de matériel peuvent prendre un nombre limité de breaks. Par exemple, sur le DSU, seulement deux breaks de données peuvent être placés à la fois, et GDB rejettera cette commande si plus de deux sont employés. Supprimez ou neutralisez les breaks inutilisés de matériel avant le réglage des neufs (voir la section neutraliser ). Voir la section casser des conditions . Voir la matériel-break-limite à distance réglée .

thbreak args

Placez un break assisté par le matériel permis seulement pour un arrêt. args sont les mêmes que pour hbreak la commande et le break est placée de la même manière. Cependant, comme tbreak commandez, le break est automatiquement supprimé ensuite la première fois que votre programme s'arrête là. En outre, comme hbreak commandez, le break exige l'appui de matériel et du matériel de cible peut ne pas avoir cet appui. Voir les breaks de neutralisation de section . Voir également les états de coupure .

rbreak regex

Placez les breaks sur toutes les fonctions assortissant l'expression régulière regex. Des jeux de ces commandes un break sans conditions sur toutes les allumettes, imprimant une liste de tous les breaks il a placé. Une fois que ces breaks sont placés, ils sont justes traité comme les breaks réglés avec coupure commande. Vous pouvez les supprimer, les neutraliser, ou leur faire le conditionnel la même manière que n'importe quel autre break.

La syntaxe de l'expression régulière est la standard utilisée avec des outils comme le grep de ` '. Notez que c'est différent de la syntaxe employée par des shells, ainsi par exemple foo * assortit toutes les fonctions qui incluent fo suivi de zéro ou davantage os. Il y a un implicite . * menant et traînant l'expression régulière vous fournissez, ainsi aux fonctions d'allumette seulement par lesquelles commencez fooutilisation ^foo.

Quand programmes de la correction C ++, rbreak est utile pour placer des breaks sur les fonctions surchargées qui ne sont pas des membres d'aucune classe spéciale.

breaks d'information [n]

coupure d'information [n]

watchpoints d'information [n]

Imprimez une table de tous les breaks, watchpoints, et catchpoints réglés et non supprimés, avec les colonnes suivantes pour chaque break:

Nombres De break

Type

break, watchpoint, ou catchpoint.

Disposition

Si le break est marqué pour être neutralisé ou supprimé une fois frappé.

Permis ou neutralisé

Des breaks permis sont identifiés par ` y '. ` n ' marque les breaks qui ne sont pas permis.

Adresse

Là où le break est dans votre programme, comme adresse de mémoire.

Ce qui

Là où le break est dans la source pour votre programme, comme nombre de dossier et de ligne.

Si un break est conditionnel, coupure d'information montre la condition sur la ligne suivant le break affecté; des commandes de break, le cas échéant, sont énumérées ensuite cela.

coupure d'information avec un nombre de break n comme l'argument énumère seulement ce break. La variable de convenance $ _ et le défaut examiner-adressent pour X la commande sont placées à l'adresse du dernier break énuméré (voir la mémoire d'examiner de section ).

coupure d'information montre un compte du nombre de fois où le break a été frappé. C'est particulièrement utile en même temps que ignorez commande. Vous pouvez ignorer un grand nombre de coups de break, regardez l'information de break pour voir combien de fois le break a été frappées, et puis pour démarrer encore, ignorant un moins que ce nombre. Ceci vous obtiendra rapidement au dernier coup de ce break.

GDB vous permet de placer tout nombre de breaks au même endroit dans votre programme. Il n'y a rien idiot ou sans signification à ce sujet. Quand les breaks sont conditionnels, c'est même utile (voir la section casser des conditions ).

GDB lui-même place parfois des breaks dans votre programme pour des buts spéciaux, tels que la manipulation appropriée de longjmp (dans des programmes C). Ces breaks internes sont assignés des nombres négatifs, commençant par -1 breaks d'information de ` ne les montre pas. Vous pouvez voir ces breaks avec la commande d'entretien de GDB breaks d'information de maint de ` (voir les breaks d'information de maint ).

5,1,2 Réglage des watchpoints

Vous pouvez employer un watchpoint pour arrêter l'exécution toutes les fois que la valeur d'une expression change, sans devoir prévoir un endroit particulier où ceci peut se produire.

Selon votre système, des watchpoints peuvent être mis en application dans le logiciel ou le matériel. GDB fait le logiciel watchpointing simple-en faisant un pas votre programme et en examinant la valeur de la variable chaque fois, qui est des centaines d'une exécution plus lente que normalement de périodes. (mais ceci peut encore se produire en valeur lui, pour déceler des erreurs où vous n'avez aucun indice quelle partie de votre programme est le coupable.)

Sur quelques systèmes, tels que HP-ux, GNU/Linux et quelques autres cibles de x86-based, GDB inclut le soutien des watchpoints de matériel, qui ne ralentissent pas le fonctionnement de votre programme.

watch expr

Set a watchpoint for an expression. GDB will break when expr is written into by the program and its value changes.

rwatch expr

Placez un watchpoint qui se cassera quand montre expr est lu par le programme.

awatch expr

Placez un watchpoint qui se cassera quand expr est lu ou écrit dans par le programme.

watchpoints d'information

Cette commande imprime une liste de watchpoints, de breaks, et de catchpoints; c'est pareil As coupure d'information.

GDB place un watchpoint de matériel si possible. Les watchpoints de matériel s'exécutent très rapidement, et le programme de mise au point rapporte un changement de valeur à l'instruction exacte où le changement se produit. Si GDB ne peut pas placer un watchpoint de matériel, il place un watchpoint de logiciel, qui s'exécute plus lentement et rapporte le changement de la valeur au prochain rapport, pas l'instruction, après que le changement se produise.

Quand vous publiez montre commande, rapports de GDB

Â

Watchpoint de matériel numérique: expr

s'il pouvait placer un watchpoint de matériel.

Actuellement, awatch et rwatch les commandes peuvent seulement placer des watchpoints de matériel, parce que des accès aux données qui ne changent pas la valeur de l'expression observée ne peuvent pas être détectés sans examiner chaque instruction pendant qu'elle est exécutée, et GDB ne fait pas cela actuellement. Si GDB constate qu'il ne peut pas placer un break de matériel avec awatch ou rwatch commandez, il imprimera un message comme ceci:

Â

L'expression ne peut pas être mise en application avec le watchpoint de read/access.

Parfois, GDB ne peut pas placer un watchpoint de matériel parce que le type de données de l'expression observée est plus large que quel watchpoint de matériel sur la machine cible peut manipuler. Par exemple, quelques systèmes peuvent seulement observer les régions qui sont jusqu'à 4 bytes au loin; sur de tels systèmes vous ne pouvez pas placer des watchpoints de matériel pour une expression qui rapporte un nombre à point mobile à double précision (qui est en général 8 bytes au loin). Comme work-around, il pourrait être possible de casser la grande région en série de la plus petite et de les observer avec les watchpoints séparés.

Si vous placiez trop de watchpoints de matériel, GDB pourrait ne pouvoir pas insérer tous quand vous reprenez l'exécution de votre programme. Puisque le nombre précis de watchpoints actifs est inconnu jusqu'au moment où le programme est sur le point d'être reprise, GDB ne pourrait pas pouvoir vous avertir à ce sujet quand vous réglé les watchpoints, et l'avertissement serez imprimés seulement quand le programme est repris:

Â

Watchpoint de matériel numérique: N'a pas pu insérer le watchpoint

Si ceci se produit, supprimez ou neutralisez certains des watchpoints.

Le SPARClite DSU produira des pièges quand un programme accède à quelques données ou l'adresse d'instruction qui est assignée à la correction s'enregistre. Pour les adresses de données, DSU facilite montre commande. Cependant les registres de break de matériel peuvent seulement prendre deux watchpoints de données, et les deux watchpoints doivent être la même sorte. Par exemple, vous pouvez placer deux watchpoints avec montre commandes, deux avec rwatch commandes, ou deux avec awatch les commandes, mais vous ne pouvez pas placer un watchpoint avec une commande et l'autre avec une commande différente. GDB rejettera la commande si vous essayez de mélanger des watchpoints. Supprimez ou neutralisez les commandes inutilisées de watchpoint avant de placer des neufs.

Si vous appelez une fonction employant interactivement copie ou appeltous les watchpoints que vous avez placés seront inactifs jusqu'à ce que GDB atteigne un autre genre de break ou l'appel accomplit.

GDB supprime automatiquement les watchpoints qui observent des variables (automatiques) locales, ou les expressions qui impliquent de telles variables, quand elles sortent de la portée, c.-à-d., quand l'exécution part du bloc dans lequel ces variables ont été définies. En particulier, quand le programme étant corrigé se termine, toutes les variables locales sortent de la portée, et ainsi seulement des watchpoints qui observent des variables globales demeurer réglées. Si vous réexécutez le programme, vous devrez placer tous tels watchpoints encore. One-way de faire qui devrait placer un break de code à l'entrée au principal la fonction et quand elle se casse, a placé tous les watchpoints.

Avertissement: Dans des programmes à lecture multiple, les watchpoints ont seulement limité l'utilité. Avec l'exécution courante de watchpoint, GDB peut seulement observer la valeur d'une expression dans un fil simple . Si vous êtes confiant que l'expression puisse seulement changer en raison de l'activité du fil courant (et si vous êtes également confiant qui aucun autre fil ne peut devenir courant), alors vous pouvez employer des watchpoints comme d'habitude. Cependant, GDB peut ne pas noter quand l'activité d'un fil non-current change l'expression.

Avertissement HP-ux: Dans des programmes à lecture multiple, les watchpoints de logiciel ont seulement limité l'utilité. Si GDB crée un watchpoint de logiciel, il peut seulement observer la valeur d'une expression dans un fil simple . Si vous êtes confiant que l'expression puisse seulement changer en raison de l'activité du fil courant (et si vous êtes également confiant qui aucun autre fil ne peut devenir courant), alors vous pouvez employer des watchpoints de logiciel comme d'habitude. Cependant, GDB peut ne pas noter quand l'activité d'un fil non-current change l'expression. (les watchpoints de matériel, en revanche, observent une expression en tous les fils.)

Voir la matériel-watchpoint-limite à distance réglée .

5,1,3 Réglage des catchpoints

Vous pouvez employer tels que des catchpoints pour causer le programme de mise au point à l'arrêt pour certains genres d'événements de programme, des exceptions de C ++ ou le chargement d'une bibliothèque partagée. Employez crochet commande de placer un catchpoint.

crochet événement

Arrêtez quand événement se produit. événement peut être n'importe lequel de ce qui suit:

jet

Le lancement d'une exception de C ++.

crochet

Attraper d'une exception de C ++.

exec

Un appel à exec. C'est actuellement seulement disponible pour HP-ux.

fourchette

Un appel à fourchette. C'est actuellement seulement disponible pour HP-ux.

vfork

Un appel à vfork. C'est actuellement seulement disponible pour HP-ux.

charge

charge libname

Le chargement dynamique de toute bibliothèque partagée, ou le chargement de la bibliothèque libname. C'est actuellement seulement disponible pour HP-ux.

déchargez

déchargez libname

Le déchargement de en a dynamiquement chargé la bibliothèque partagée, ou le déchargement de la bibliothèque libname. C'est actuellement seulement disponible pour HP-ux.

tcatch événement

Placez un catchpoint qui est permis seulement pour un arrêt. Le catchpoint est automatiquement supprimé ensuite la première fois que l'événement est attrapé.

Employez coupure d'information commande d'énumérer les catchpoints courants.

Il y a actuellement quelques limitations à la manipulation d'exception de C ++ (jet de crochet et crochet de crochetdans GDB:

Si vous appelez une fonction interactivement, GDB vous renvoie normalement la commande quand la fonction a fini l'exécution. Si l'appel soulève une exception, cependant, l'appel peut dévier le mécanisme qui vous renvoie la commande et cause votre programme à l'arrêt ou simplement continuer de démarrer jusqu'à ce qu'il frappe un break, attrape un signal que GDB écoute, ou sort. C'est le cas même si vous placez un catchpoint pour l'exception; les catchpoints sur des exceptions sont handicapés dans des appels interactifs.

Vous ne pouvez pas soulever une exception interactivement.

Vous ne pouvez pas installer un traiteur d'exception interactivement.

Parfois crochet n'est pas la meilleure manière de corriger la manipulation d'exception: si vous devez savoir exactement où une exception est augmentée, il vaut mieux de s'arrêter avant que le traiteur d'exception s'appelle, depuis que la manière vous peut voir la pile avant que le déroulement ait lieu. Si vous placez un break dans un traiteur d'exception à la place, il peut ne pas être facile de découvrir où l'exception a été augmentée.

Pour s'arrêter juste avant qu'un traiteur d'exception s'appelle, vous avez besoin de la connaissance de l'exécution. Dans le cas de GNU C ++ , exceptions sont augmentés en appelant une fonction de bibliothèque appelée raise_exception de __ ce qui a l'interface suivante de la norme ANSI C:

Â

/* l'addr est où la marque d'exception est stockée. l'identification est la marque d'exception. */raise_exception vide de __ (addr de **, vide vides * identification);

Pour faire le programme de mise au point attraper toutes les exceptions avant que tout déroulement de pile ait lieu, placez un break dessus raise_exception de __ (voir les breaks de section; watchpoints; et exceptions ).

Avec un break conditionnel (voir la section casser des conditions ) que dépend de la valeur de identificationvous pouvez arrêter votre programme quand une exception spécifique est augmentée. Vous pouvez employer des breaks conditionnels multiples pour arrêter votre programme quand n'importe laquelle d'un certain nombre d'exceptions est augmenté.

5,1,4 Supprimer des breaks

Il est souvent nécessaire d'éliminer un break, watchpoint, ou le catchpoint une fois qu'il a fait son travail et vous ne veulent plus que votre programme s'arrête là. Ceci s'appelle supprimer le break. Un break qui a été supprimé n'existe plus; on l'oublie.

Avec espace libre commande vous pouvez supprimer des breaks selon où ils sont dans votre programme. Avec effacement commande vous pouvez supprimer différents breaks, watchpoints, ou catchpoints en indiquant leurs nombres de break.

Il n'est pas nécessaire de supprimer un break pour procéder après lui. GDB ignore automatiquement des breaks sur la première instruction d'être exécuté quand vous continuez l'exécution sans changer l'adresse d'exécution.

espace libre

Supprimez tous les breaks à la prochaine instruction d'être exécuté dans l'armature choisie de pile (voir la section choisir une armature ). Quand l'armature les plus secrets est choisie, c'est une bonne manière de supprimer un break où votre programme s'est juste arrêté.

espace libre fonction

espace libre nom de fichierfonction

Supprimez tous les breaks réglés à l'entrée à la fonction fonction.

espace libre linenum

espace libre nom de fichierlinenum

Supprimez tous les breaks réglés ou dans au code de la ligne indiquée.

supprimez [ breaks ] [gamme... ]

Supprimez les breaks, les watchpoints, ou les catchpoints des gammes de break indiquées comme arguments. Si aucun argument n'est indiqué, supprimez tous les breaks (GDB demande la confirmation, à moins que vous ayez l'ensemble confirment au loinVous pouvez abréger cette commande As d.

5,1,5 breaks de neutralisation

Plutôt que de supprimer un break, un watchpoint, ou un catchpoint, vous pourriez préférer le neutraliser . Ceci rend le break inopérant comme si il avait été supprimé, mais se rappelle l'information sur le break de sorte que vous puissiez le permettre encore plus tard.

Vous neutralisez et permettez des breaks, des watchpoints, et des catchpoints avec permettez et neutralisez commandes, indiquant sur option un ou plusieurs nombres de break comme arguments. Utilisation coupure d'information ou montre d'information pour imprimer une liste de breaks, de watchpoints, et de catchpoints si vous ne savez pas quels nombres à employer.

Un break, un watchpoint, ou un catchpoint peuvent avoir n'importe lequel de quatre états différents d'enablement:

Permis. Le break arrête votre programme. Un break a placé avec coupure

rwatch expr

Placez un watchpoint qui se cassera quand montre expr est lu par le programme.

awatch expr

Placez un watchpoint qui se cassera quand expr est lu ou écrit dans par le programme.

watchpoints d'information

Cette commande imprime une liste de watchpoints, de breaks, et de catchpoints; c'est pareil As coupure d'information.

GDB place un watchpoint de matériel si possible. Les watchpoints de matériel s'exécutent très rapidement, et le programme de mise au point rapporte un changement de valeur à l'instruction exacte où le changement se produit. Si GDB ne peut pas placer un watchpoint de matériel, il place un watchpoint de logiciel, qui s'exécute plus lentement et rapporte le changement de la valeur au prochain rapport, pas l'instruction, après que le changement se produise.

Quand vous publiez montre commande, rapports de GDB

Â

Watchpoint de matériel numérique: expr

s'il pouvait placer un watchpoint de matériel.

Actuellement, awatch et rwatch les commandes peuvent seulement placer des watchpoints de matériel, parce que des accès aux données qui ne changent pas la valeur de l'expression observée ne peuvent pas être détectés sans examiner chaque instruction pendant qu'elle est exécutée, et GDB ne fait pas cela actuellement. Si GDB constate qu'il ne peut pas placer un break de matériel avec awatch ou rwatch commandez, il imprimera un message comme ceci:

Â

L'expression ne peut pas être mise en application avec le watchpoint de read/access.

Parfois, GDB ne peut pas placer un watchpoint de matériel parce que le type de données de l'expression observée est plus large que quel watchpoint de matériel sur la machine cible peut manipuler. Par exemple, quelques systèmes peuvent seulement observer les régions qui sont jusqu'à 4 bytes au loin; sur de tels systèmes vous ne pouvez pas placer des watchpoints de matériel pour une expression qui rapporte un nombre à point mobile à double précision (qui est en général 8 bytes au loin). Comme work-around, il pourrait être possible de casser la grande région en série de la plus petite et de les observer avec les watchpoints séparés.

Si vous placiez trop de watchpoints de matériel, GDB pourrait ne pouvoir pas insérer tous quand vous reprenez l'exécution de votre programme. Puisque le nombre précis de watchpoints actifs est inconnu jusqu'au moment où le programme est sur le point d'être reprise, GDB ne pourrait pas pouvoir vous avertir à ce sujet quand vous réglé les watchpoints, et l'avertissement serez imprimés seulement quand le programme est repris:

Â

Watchpoint de matériel numérique: N'a pas pu insérer le watchpoint

Si ceci se produit, supprimez ou neutralisez certains des watchpoints.

Le SPARClite DSU produira des pièges quand un programme accède à quelques données ou l'adresse d'instruction qui est assignée à la correction s'enregistre. Pour les adresses de données, DSU facilite montre commande. Cependant les registres de break de matériel peuvent seulement prendre deux watchpoints de données, et les deux watchpoints doivent être la même sorte. Par exemple, vous pouvez placer deux watchpoints avec montre commandes, deux avec rwatch commandes, ou deux avec awatch les commandes, mais vous ne pouvez pas placer un watchpoint avec une commande et l'autre avec une commande différente. GDB rejettera la commande si vous essayez de mélanger des watchpoints. Supprimez ou neutralisez les commandes inutilisées de watchpoint avant de placer des neufs.

Si vous appelez une fonction employant interactivement copie ou appeltous les watchpoints que vous avez placés seront inactifs jusqu'à ce que GDB atteigne un autre genre de break ou l'appel accomplit.

GDB supprime automatiquement les watchpoints qui observent des variables (automatiques) locales, ou les expressions qui impliquent de telles variables, quand elles sortent de la portée, c.-à-d., quand l'exécution part du bloc dans lequel ces variables ont été définies. En particulier, quand le programme étant corrigé se termine, toutes les variables locales sortent de la portée, et ainsi seulement des watchpoints qui observent des variables globales demeurer réglées. Si vous réexécutez le programme, vous devrez placer tous tels watchpoints encore. One-way de faire qui devrait placer un break de code à l'entrée au principal la fonction et quand elle se casse, a placé tous les watchpoints.

Avertissement: Dans des programmes à lecture multiple, les watchpoints ont seulement limité l'utilité. Avec l'exécution courante de watchpoint, GDB peut seulement observer la valeur d'une expression dans un fil simple . Si vous êtes confiant que l'expression puisse seulement changer en raison de l'activité du fil courant (et si vous êtes également confiant qui aucun autre fil ne peut devenir courant), alors vous pouvez employer des watchpoints comme d'habitude. Cependant, GDB peut ne pas noter quand l'activité d'un fil non-current change l'expression.

Avertissement HP-ux: Dans des programmes à lecture multiple, les watchpoints de logiciel ont seulement limité l'utilité. Si GDB crée un watchpoint de logiciel, il peut seulement observer la valeur d'une expression dans un fil simple . Si vous êtes confiant que l'expression puisse seulement changer en raison de l'activité du fil courant (et si vous êtes également confiant qui aucun autre fil ne peut devenir courant), alors vous pouvez employer des watchpoints de logiciel comme d'habitude. Cependant, GDB peut ne pas noter quand l'activité d'un fil non-current change l'expression. (les watchpoints de matériel, en revanche, observent une expression en tous les fils.)

Voir la matériel-watchpoint-limite à distance réglée .

5,1,3 Réglage des catchpoints

Vous pouvez employer tels que des catchpoints pour causer le programme de mise au point à l'arrêt pour certains genres d'événements de programme, des exceptions de C ++ ou le chargement d'une bibliothèque partagée. Employez crochet commande de placer un catchpoint.

crochet événement

Arrêtez quand événement se produit. événement peut être n'importe lequel de ce qui suit:

jet

Le lancement d'une exception de C ++.

crochet

Attraper d'une exception de C ++.

exec

Un appel à exec. C'est actuellement seulement disponible pour HP-ux.

fourchette

Un appel à fourchette. C'est actuellement seulement disponible pour HP-ux.

vfork

Un appel à vfork. C'est actuellement seulement disponible pour HP-ux.

charge

charge libname

Le chargement dynamique de toute bibliothèque partagée, ou le chargement de la bibliothèque libname. C'est actuellement seulement disponible pour HP-ux.

déchargez

déchargez libname

Le déchargement de en a dynamiquement chargé la bibliothèque partagée, ou le déchargement de la bibliothèque libname. C'est actuellement seulement disponible pour HP-ux.

tcatch événement

Placez un catchpoint qui est permis seulement pour un arrêt. Le catchpoint est automatiquement supprimé ensuite la première fois que l'événement est attrapé.

Employez coupure d'information commande d'énumérer les catchpoints courants.

Il y a actuellement quelques limitations à la manipulation d'exception de C ++ (jet de crochet et crochet de crochetdans GDB:

Si vous appelez une fonction interactivement, GDB vous renvoie normalement la commande quand la fonction a fini l'exécution. Si l'appel soulève une exception, cependant, l'appel peut dévier le mécanisme qui vous renvoie la commande et cause votre programme à l'arrêt ou simplement continuer de démarrer jusqu'à ce qu'il frappe un break, attrape un signal que GDB écoute, ou sort. C'est le cas même si vous placez un catchpoint pour l'exception; les catchpoints sur des exceptions sont handicapés dans des appels interactifs.

Vous ne pouvez pas soulever une exception interactivement.

Vous ne pouvez pas installer un traiteur d'exception interactivement.

Parfois crochet n'est pas la meilleure manière de corriger la manipulation d'exception: si vous devez savoir exactement où une exception est augmentée, il vaut mieux de s'arrêter avant que le traiteur d'exception s'appelle, depuis que la manière vous peut voir la pile avant que le déroulement ait lieu. Si vous placez un break dans un traiteur d'exception à la place, il peut ne pas être facile de découvrir où l'exception a été augmentée.

Pour s'arrêter juste avant qu'un traiteur d'exception s'appelle, vous avez besoin de la connaissance de l'exécution. Dans le cas de GNU C ++ , exceptions sont augmentés en appelant une fonction de bibliothèque appelée raise_exception de __ ce qui a l'interface suivante de la norme ANSI C:

Â

/* l'addr est où la marque d'exception est stockée. l'identification est la marque d'exception. */raise_exception vide de __ (addr de **, vide vides * identification);

Pour faire le programme de mise au point attraper toutes les exceptions avant que tout déroulement de pile ait lieu, placez un break dessus raise_exception de __ (voir les breaks de section; watchpoints; et exceptions ).

Avec un break conditionnel (voir la section casser des conditions ) que dépend de la valeur de identificationvous pouvez arrêter votre programme quand une exception spécifique est augmentée. Vous pouvez employer des breaks conditionnels multiples pour arrêter votre programme quand n'importe laquelle d'un certain nombre d'exceptions est augmenté.

5,1,4 Supprimer des breaks

Il est souvent nécessaire d'éliminer un break, watchpoint, ou le catchpoint une fois qu'il a fait son travail et vous ne veulent plus que votre programme s'arrête là. Ceci s'appelle supprimer le break. Un break qui a été supprimé n'existe plus; on l'oublie.

Avec espace libre commande vous pouvez supprimer des breaks selon où ils sont dans votre programme. Avec effacement commande vous pouvez supprimer différents breaks, watchpoints, ou catchpoints en indiquant leurs nombres de break.

Il n'est pas nécessaire de supprimer un break pour procéder après lui. GDB ignore automatiquement des breaks sur la première instruction d'être exécuté quand vous continuez l'exécution sans changer l'adresse d'exécution.

espace libre

Supprimez tous les breaks à la prochaine instruction d'être exécuté dans l'armature choisie de pile (voir la section choisir une armature ). Quand l'armature les plus secrets est choisie, c'est une bonne manière de supprimer un break où votre programme s'est juste arrêté.

espace libre fonction

espace libre nom de fichierfonction

Supprimez tous les breaks réglés à l'entrée à la fonction fonction.

espace libre linenum

espace libre nom de fichierlinenum

Supprimez tous les breaks réglés ou dans au code de la ligne indiquée.

supprimez [ breaks ] [gamme... ]

Supprimez les breaks, les watchpoints, ou les catchpoints des gammes de break indiquées comme arguments. Si aucun argument n'est indiqué, supprimez tous les breaks (GDB demande la confirmation, à moins que vous ayez l'ensemble confirment au loinVous pouvez abréger cette commande As d.

5,1,5 breaks de neutralisation

Plutôt que de supprimer un break, un watchpoint, ou un catchpoint, vous pourriez préférer le neutraliser . Ceci rend le break inopérant comme si il avait été supprimé, mais se rappelle l'information sur le break de sorte que vous puissiez le permettre encore plus tard.

Vous neutralisez et permettez des breaks, des watchpoints, et des catchpoints avec permettez et neutralisez commandes, indiquant sur option un ou plusieurs nombres de break comme arguments. Utilisation coupure d'information ou montre d'information pour imprimer une liste de breaks, de watchpoints, et de catchpoints si vous ne savez pas quels nombres à employer.

Un break, un watchpoint, ou un catchpoint peuvent avoir n'importe lequel de quatre états différents d'enablement:

Permis. Le break arrête votre programme. Un break a placé avec coupure

la commande commence dehors dans cet état.

Handicapé. Le break n'a aucun effet sur votre programme.

Permis une fois. Le break arrête votre programme, mais puis devient handicapé.

Permis pour la suppression. Le break arrête votre programme, mais juste après qu'il fait ainsi il est supprimé de manière permanente. Un break a placé avec tbreak la commande commence dehors dans cet état.

Vous pouvez employer les commandes suivantes de permettre ou neutraliser des breaks, des watchpoints, et des catchpoints:

neutralisez [ breaks ] [gamme... ]

Neutralisez les breaks indiqués breaks -- ou tous les, si aucun n'est énuméré. Un break handicapé n'a aucun effet mais n'est pas oublié. Toutes les options comme ignorer-compte, des conditions et des commandes sont rappelées au cas où le break serait permis encore plus tard. Vous pouvez abréger neutralisez As dis.

permettez [ breaks ] [gamme... ]

Permettez les breaks indiqués (ou tous breaks définis). Ils deviennent efficaces de nouveau en arrêtant votre programme.

permettez [ breaks ] une fois gamme...

Permettez les breaks indiqués temporairement. GDB neutralise n'importe lequel de ces breaks juste après arrêter votre programme.

permettez [ l'effacement de breaks ] gamme...

Permettez aux breaks indiqués de travailler une fois, puis mourez. GDB supprime n'importe lequel de ces breaks dès que votre programme s'arrêtera là.

Excepté un break réglé avec tbreak (voir la section placer des breaks ), des breaks que vous placez sont au commencement permis; plus tard, ils deviennent handicapés ou permis seulement quand vous employez un des commandes ci-dessus. (la commande jusque à peut placer et supprimer un break de ses propres, mais il ne change pas l'état de vos autres breaks; voyez continuer et faire un pas .)

5,1,6 Cassez les conditions

La sorte la plus simple de break se casse chaque fois que votre programme atteint un endroit indiqué. Vous pouvez également indiquer une condition pour un break. Une condition est juste une expression booléenne en votre langage de programmation (voir les expressions de section ). Un break dans une condition évalue l'expression chaque fois que votre programme l'atteint, et vos arrêts de programme seulement si la condition est vraie .

C'est l'inverse d'employer des affirmations pour la validation de programme; dans cette situation, vous voulez vous arrêter quand l'affirmation est violée -- c'est-à-dire, quand la condition est fausse. En C, si vous voulez examiner une affirmation exprimée par la condition affirmezvous devriez placer la condition `! affirmez' sur le break approprié.

Des conditions sont également acceptées pour des watchpoints; vous ne pouvez pas avoir besoin d'elles, puisqu'un watchpoint inspecte la valeur d'une expression de toute façon -- mais il pourrait être plus simple par exemple de placer juste un watchpoint sur un nom variable, et indique une condition cette des essais si la nouvelle valeur est intéressante.

Les états de coupure peuvent avoir des effets secondaires, et peuvent même appeler des fonctions dans votre programme. Ceci peut être utile, par exemple, pour activer les fonctions que le progrès de programme de notation, ou pour employer votre propre copie fonctionne pour composer les structures de données spéciales. Les effets sont complètement prévisibles à moins qu'il y ait un autre break permis à la même adresse. (dans ce cas, GDB pourrait voir l'autre break d'abord et arrêter votre programme sans vérifier l'état de celui-ci.) Notez que les commandes de break sont habituellement plus commodes et flexibles que des états de coupure afin d'exécuter des effets secondaires quand un break est atteint (voir les listes de commandes de break de section ).

Des états de coupure peuvent être indiqués quand un break est placé, en employant ` si ' dans les arguments au coupure commande. Voir la section placer des breaks . Ils peuvent également être changés à tout moment avec condition commande.

Vous pouvez également employer si mot-clé avec montre commande. crochet la commande n'identifie pas si mot-clé; condition est la seule manière d'imposer un autre état à un catchpoint.

condition bnum expression

Indiquez expression comme la condition de coupure pour le break, le watchpoint, ou le nombre de catchpoint bnum. Après que vous ayez placé une condition, break bnum arrête votre programme seulement si la valeur de expression est vrai (de non zéro, en C). Quand vous employez conditioncontrôles de GDB expression immédiatement pour l'exactitude syntactique, et pour déterminer si les symboles dans elle ont des referents dans le contexte de votre break. Si expression emploie des symboles non référencés dans le contexte du break, copies de GDB un message d'erreur:

Aucun symbole "foo" dans le contexte courant.

GDB n'évalue pas réellement expression lorsque condition commande (ou une commande qui place un break dans une condition, comme cassez si ... est donné, cependant. Voir les expressions de section .

condition bnum

Enlevez la condition du nombre de break bnum. Ce devient un break sans conditions ordinaire.

Un cas spécial d'un état de break doit s'arrêter seulement quand le break a été atteint un certain nombre de fois. C'est si utile qu'il y ait une manière spéciale de la faire, en utilisant le compte d'ignorer du break. Chaque break a un compte d'ignorer, qui est un nombre entier. La majeure partie du temps, le compte d'ignorer est zéro, et n'a donc aucun effet. Mais si votre programme atteint un break dont ignorent le compte sont positives, puis au lieu de l'arrêt, il les décroissances justes le compte d'ignorer par un et continue. En conséquence, si la valeur de compte d'ignorer est nle break n'arrête pas le prochain n chronomètre votre programme l'atteint.

ignorez bnum compte

Placez le compte d'ignorer du nombre de break bnum à compte. Le prochain compte chronomètre le break est atteint, votre exécution du programme ne s'arrête pas; autre que décrémenter le compte d'ignorer, GDB ne prend aucune mesure.

Pour faire le break cessez la prochaine fois qu'il est atteint, indiquez un compte de zéro.

Quand vous employez continuez pour reprendre l'exécution de votre programme d'un break, vous pouvez indiquer un compte d'ignorer directement comme argument à continuezplutôt que d'en utilisant ignorez. Voir la section continuer et faire un pas .

Si un break fait ignorer un positif le compte et une condition, la condition n'est pas vérifiée. Une fois le compte d'ignorer atteint zéro, GDB reprend vérifier la condition.

Vous pourriez réaliser l'effet du compte d'ignorer avec une condition comme `$foo -- < = 0 ' en utilisant une variable de convenance de programme de mise au point qui est décrémentée chaque fois. Voir les variables de convenance de section .

Ignorez les comptes s'appliquent aux breaks, aux watchpoints, et aux catchpoints.

5,1,7 Listes de commandes de break

Vous pouvez donner à n'importe quel break (ou à watchpoint ou à catchpoint) une série d'instructions d'exécuter quand vos arrêts de programme dus à ce break. Par exemple, vous pourriez vouloir imprimer les valeurs de certaines expressions, ou permettez d'autres breaks.

commandes [bnum]

... commande-liste ...

extrémité

Indiquez une liste de commandes pour le nombre de break bnum. Les commandes elles-mêmes apparaissent sur les lignes suivantes. tapez une ligne contenant juste extrémité pour terminer les commandes.

Pour enlever toutes les commandes d'un break, tapez commandes et suivez-l'immédiatement avec extrémitéc'est-à-dire, ne donnez aucune instruction.

Sans bnum argument, commandes se rapporte au dernier break, watchpoint, ou ensemble de catchpoint (pas au break le plus récemment produit).

Pression Retour comme les moyens de répéter la dernière commande de GDB est handicapé dans a commande-liste.

Vous pouvez employer des commandes de break de commencer votre programme vers le haut encore. Employez simplement continuez commandez, ou stepou toute autre commande qui reprend l'exécution.

Toutes les autres commandes dans la liste de commandes, après une commande qui reprend l'exécution, sont ignorées. C'est parce que quand vous reprenez l'exécution (même avec un simple après ou stepvous pouvez rencontrer un autre break -- qui pourrait avoir sa propre liste de commandes, en menant aux ambiguÃ¯tés au sujet dont énumérez pour s'exécuter.

Si la première commande que vous indiquez dans une liste de commandes est silencieuxle message habituel au sujet de l'arrêt à un break n'est pas imprimé. Ceci peut être souhaitable pour les breaks qui doivent imprimer un message spécifique et puis continuer. Si aucune des commandes restantes n'imprime n'importe quoi, vous ne voyez aucun signe que le break a été atteint. silencieux est signicatif seulement au début d'une liste de commandes de break.

Les commandes écho rendementet printf permettez-vous d'imprimer la sortieavec précision commandé, et soyez souvent utile dans des breaks silencieux. Voir les commandes de section pour la sortiecommandé .

Par exemple, voici de la façon dont vous pourriez employer des commandes de break d'imprimer la valeur X à l'entrée à foo toutes les fois que X est positif.

Â

cassez le foo si le printf silencieux " x des commandes x>0 est %d\n", extrémité à suivre de x

Une demande de commandes de break doit compenser un bogue ainsi vous pouvez déterminer des autres. Mettez un break juste aprés la ligne incorrecte du code, donnez-lui une condition pour détecter le cas dans lequel quelque chose de incorrect a été fait, et pour lui donner des instructions d'assigner des valeurs correctes à toutes les variables qui ont besoin d'elles. Finissez avec continuez commandez de sorte que votre programme ne s'arrête pas, et commencez par silencieux commandez de sorte qu'aucun rendement ne soit produit. Voici un exemple:

Â

cassez l'ensemble silencieux X de 403 commandes = y + l'extrémité 4 à suivre

5,1,8 Menus de break

Quelques langages de programmation (notamment C ++ et Objectif-C) permettent à un nom simple de fonction d'être défini plusieurs fois, pour l'application dans différents contextes. Ceci s'appelle surcharge . Quand un nom de fonction est surchargé, coupure de ` fonction' n'est pas assez pour dire à GDB où vous voulez un break. Si vous réalisez c'est un problème, vous peut employer quelque chose comme coupure de ` fonction(types' pour indiquer quelle version particulière de la fonction vous voulez. Autrement, GDB vous offre un menu des choix numérotés pour différents breaks possibles, et attend votre choix avec le message de sollicitation ` > '. Les deux premières options sont toujours ] annulation `[0 ' et `[1 ] tout '. tapez 1 place un break à chaque définition de fonctionet tapez 0 avorte coupure commande sans placer tous nouveaux breaks.

Par exemple, l'extrait suivant de session montre une tentative de placer un break au symbole surchargé String::after. Nous choisissons trois définitions particulières de ce nom de fonction:

Â

(gdb) 0 ] annulations de b String::after [ [ 1 ] tout le [ 2 ] file:String.cc; ligne number:867 [ 3 ] file:String.cc; ligne number:860 [ 4 ] file:String.cc; ligne number:875 [ 5 ] file:String.cc; ligne number:853 [ 6 ] file:String.cc; ligne number:846 [ 7 ] file:String.cc; ligne number:735 > 2 4 6 break 1 à 0xb26c: dossier String.cc, ligne 867. break 2 à 0xb344: dossier String.cc, ligne 875. break 3 à 0xafcc: dossier String.cc, ligne 846. Des breaks multiples ont été placés. Employez la commande d'"effacement" de supprimer des breaks n/ns désiré.

(gdb)

5,1,9 "ne peuvent pas insérer des breaks"

Sous quelques logiciels d'exploitation, des breaks ne peuvent pas être employés dans un programme si n'importe quel autre processus exécute ce programme. Dans cette situation, essayer d'exécuter ou continuer un programme avec un break fait imprimer GDB un message d'erreur:

Â

Ne peut pas insérer des breaks. Le même programme peut fonctionner dans un autre processus.

Quand ceci se produit, vous avez trois manières de procéder:

Enlevez ou neutralisez les breaks, puis continuez.

Suspendez GDB, et copiez le dossier contenant votre programme à un nouveau nom. Reprenez GDB et employez exec-dossier commandez d'indiquer que GDB devrait exécuter votre programme sous ce nom. Commencez alors votre programme encore.

Relink votre programme de sorte que le segment de texte soit non partageable, en utilisant l'option d'éditeur de liens `-N '. La limitation de logiciel d'exploitation peut ne pas s'appliquer aux executables non partageables.

Un message semblable peut être imprimé si vous demandez trop de breaks et de watchpoints assistés par le matériel actifs:

Â

Arrêté; ne peut pas insérer des breaks. Vous avez pu avoir demandé trop de breaks et de watchpoints de matériel.

Ce message est imprimé quand vous essayez de reprendre le programme, puisque seulement alors GDB connaît exactement combien de breaks et de watchpoints de matériel il doit insérer.

Quand ce message est imprimé, vous devez neutraliser ou enlever certains des breaks et des watchpoints assistés par le matériel, et puis continuez.

5,1,10 "adresse de break ajustée..."

Quelques architectures de processeur placent des contraintes sur les adresses auxquelles des breaks peuvent être placés. Aux architectures contraintes ainsi, GDB essayera d'ajuster l'adresse du break pour être conforme aux contraintes dictées par l'architecture.

Un exemple d'une telle architecture est Fujitsu Franc-v. Le Franc-v est une architecture de VLIW dans laquelle un certain nombre RISC-comme des instructions peut être empaqueté ensemble pour l'exécution parallèle. L'architecture Franc-v contraint l'endroit d'une instruction de renvoi dans un tel paquet à l'instruction avec la plus basse adresse. GDB honore cette contrainte en ajustant l'adresse d'un break sur le premier dans le paquet.

Il n'est pas rare que le code optimisé ait des paquets qui contiennent des instructions de différents rapports de source, ainsi ils peuvent se produire que l'adresse d'un break sera ajustée d'un rapport de source à l'autre. Puisque cet ajustement peut de manière significative changer le comportement relié par break de GDB de ce que l'utilisateur compte, un avertissement est imprimé quand le break est d'abord placé et aussi quand le break est frappé.

Un avertissement comme celui ci-dessous est imprimé en plaçant un break qui est été sujet au réglage d'adresses:

Â

avertissement: L'adresse de break s'est ajustée de 0x00010414 sur 0x00010410.

De tels avertissements sont imprimés pour l'utilisateur settable et les breaks internes de GDB. Si vous voyez un de ces avertissements, vous devriez vérifier qu'un ensemble de break à l'adresse ajustée aura désiré pour affecter. Si pas, le break en question peut être enlevé et on peut placer d'autres breaks qui auront le comportement désiré. Par exemple, il peut être suffisant de placer le break à une instruction postérieure. Un break conditionnel peut également être utile dans certains cas pour empêcher le break de déclencher trop souvent.

GDB publiera également un avertissement en s'arrêtant à un de ces breaks ajustés:

Â

avertissement: L'adresse du break 1 s'est précédemment ajustée de 0x00010414 sur 0x00010410.

Quand cet avertissement est produit, il peut être trop tardif pour prendre une mesure réparatrice à moins que dans les cas où le break est frappé plus tôt ou plus fréquemment que prévu.

5,2 Continuer et faire un pas

Continuer signifie reprendre l'exécution du programme jusqu'à ce que votre programme accomplisse normalement. En revanche, l'progression signifie exécuter juste une davantage "step" de votre programme, où l'"step" peut signifier une ligne de code source, ou d'une instruction de machine (selon quelle commande particulière vous utilisation). L'un ou l'autre en continuant ou quand faisant un pas, votre programme peut s'arrêter encore plus tôt, en raison d'un break ou d'un signal. (s'il arrête en raison d'un signal, vous pouvez vouloir employer poignéeou utilisation signal 0'de ` pour reprendre l'exécution. Voir les signaux de section .)

continuez [ignorer-comptez]

c [ignorer-comptez]

fg [ignorer-comptez]

Reprenez l'exécution du programme, à l'adresse où votre programme s'est pour la dernière fois arrêté; tous les breaks réglés à cette adresse sont déviés. L'argument facultatif ignorer-comptez vous permet d'indiquer un autre nombre de fois d'ignorer un break à cet endroit; son effet est comme celui de ignorez (voir la section casser des conditions ).

L'argument ignorer-comptez est signicatif seulement quand votre programme a arrêté en raison d'un break. Ã€ d'autres fois, l'argument à continuez est ignoré.

Les synonymes c et fg (pour le premier plan , comme programme mis au point est considéré être le programme de premier plan) sont donnés purement pour la convenance, et avoir exactement le même comportement As continuez.

Pour reprendre l'exécution à un endroit différent, vous pouvez employer retour (voir la section retourner d'une fonction ) pour aller de nouveau à la fonction d'appeler; ou saut (voir la section continuer à une adresse différente ) pour aller à un endroit arbitraire dans votre programme.

Une technique typique pour l'usage de l'progression doit placer un break (voir les breaks de section; watchpoints; et les catchpoints ) au début la fonction ou la section de votre programme où un problème est censé pour se trouver, d'd'exécut votre programme jusqu'à ce qu'il s'arrête à ce break, et puis de de l'progression par le secteur suspect, examinant les variables qui sont intéressantes, jusqu'à ce que vous voyiez le problème se produire.

step

Continuez d'exécuter votre programme jusqu'à ce que la commande atteigne une ligne de source différente, alors l'arrêtent et renvoient la commande à GDB. Cette commande est abrégée s.

Avertissement: Si vous employez step commandez tandis que la commande est dans une fonction qui a été compilée sans information de mise en point, exécution procède jusqu'à ce que la commande atteigne une fonction qui a l'information de mise en point. De même, elle ne fera pas un pas dans une fonction qui est compilée sans information de mise en point. Pour faire un pas par des fonctions sans information de mise en point, employez stepi commande, décrite ci-dessous.

step la commande s'arrête seulement à la première instruction d'une ligne de source. Ceci empêche les arrêts multiples qui pourraient autrement se produire dedans commutateur rapports, pour boucles, etc... step continue à s'arrêter si une fonction qui a l'information de mise en point s'appelle dans la ligne. En d'autres termes, step les steps à l'intérieur de toutes les fonctions ont appelé dans la ligne.

En outre, step la commande écrit seulement une fonction s'il y a de l'information de nombre de ligne pour la fonction. Autrement elle agit comme après commande. Ceci évite des problèmes en utilisant cc - gl sur des machines de MIPS. Précédemment, step sous-programmes écrits s'il y avait n'importe quelle information de mise en point au sujet de la routine.

step compte

Continuez le fonctionnement en tant que dedans stepmais ainsi compte périodes. Si un break est atteint, ou un signal n'est pas lié à l'progression se produit avant compte les steps, faisant un pas s'arrête tout de suite.

après [compte]

Continuez à la prochaine ligne de source dans l'armature (les plus secrets) courante de pile. C'est semblable à stepmais des appels de fonction qui apparaissent dans la ligne du code sont exécutés sans arrêt. L'exécution s'arrête quand la commande atteint une ligne différente de code au niveau original de pile qui exécutait quand vous avez donné après commande. Cette commande est abrégée n.

Un argument compte est un compte de répétition, quant à step.

après la commande s'arrête seulement à la première instruction d'une ligne de source. Ceci empêche les arrêts multiples qui pourraient autrement se produire dedans commutateur rapports, pour boucles, etc...

placez le step-mode

placez le step-mode dessus

placez le step-mode dessus la commande cause step commandez de s'arrêter à la première instruction d'une fonction qui contient l'aucun corrige l'information de ligne plutôt que de faire un pas au-dessus d'elle.

C'est utile dans les cas où vous pouvez être intéressé à inspecter les instructions de machine d'une fonction qui n'a aucune information symbolique et ne voulez pas que GDB saute automatiquement au-dessus de cette fonction.

placez le step-mode au loin

Cause step commandez de faire un pas au-dessus de toutes les fonctions qui contient l'aucun corrige l'information. C'est le défaut.

finition

Continuez le fonctionnement jusqu'à ce que juste aprés que la fonction dans l'armature choisie de pile retourne. Imprimez la valeur retournée (si quel).

Contrastez ceci avec retournez commande (voir la section retourner d'une fonction ).

jusque à

u

Continuez le fonctionnement jusqu'à une ligne de source après la ligne courante, dans l'armature courante de pile, est atteint. Cette commande est utilisée comme moyen d'éviter l'progression simple par une boucle plus d'une fois. Elle est comme après commande, sauf que quand jusque à rencontre un saut, il continue automatiquement l'exécution jusqu'à ce que le compteur de programme soit plus grand que l'adresse du saut.

Ceci signifie cela quand vous atteignez l'extrémité d'une boucle après l'progression simple cependant il, jusque à fait votre programme continuer l'exécution jusqu'à ce qu'elle sorte la boucle. En revanche, a après commandez à l'extrémité d'une boucle fait un pas simplement de nouveau au commencement de la boucle, qui vous force à faire un pas par la prochaine itération.

jusque à arrête toujours votre programme s'il essaye de sortir l'armature courante de pile.

jusque à peut produire des résultats quelque peu counterintuitive si l'ordre du code machine n'assortit pas l'ordre des lignes de source. Par exemple, dans l'extrait suivant d'une session de correction, f (armaturela commande prouve que l'exécution est arrêtée à la ligne 206pourtant quand nous employons jusque ànous obtenons de rayer 195

(gdb) force de f #0 (argc=4, argv=0xf7fffae8) à l'expand_input() m4.c:206 206; (gdb) jusque à 195 pour (; argc > 0; NEXTARG) {

Ceci s'est produit parce que, pour l'efficacité d'exécution, le compilateur avait produit du code pour l'essai de fermeture de boucle à l'extrémité, plutôt que le début, de la boucle -- quoique l'essai dans un C pour- la boucle est écrite devant le corps de la boucle. jusque à la commande a semblé faire un pas de nouveau au commencement de la boucle quand elle a avancé à cette expression; cependant, elle n'est pas vraiment allée à un premier rapport -- pas en termes de code machine réel.

jusque à sans l'argument travaille au moyen d'instruction simple faisant un pas, et par conséquent est plus lent que jusque à avec un argument.

jusque à endroit

u endroit

Continuez d'exécuter votre programme jusqu'à ce qu'ou l'endroit indiqué soit atteint, ou l'armature courante de pile retourne. endroit est n'importe laquelle des formes d'argument acceptables pour coupure (voir la section placer des breaks ). Cette forme de la commande emploie des breaks, et par conséquent est plus rapide que jusque à sans argument. L'endroit indiqué est atteint réellement seulement s'il est dans l'armature courante. Ceci implique cela jusque à peut être employé pour sauter au-dessus des invocations récursives de fonction. Par exemple dans le code ci-dessous, si l'endroit courant est ligne 96publiant jusque à 99 exécutera le programme jusqu'à la ligne 99 dans la même invocation de factoriel, c.-à-d. après les invocations intérieures sont retournés.

94 (valeur interne) 95 factoriels internes {

96 si (valeur > 1) { valeur 97 * = factoriel (valeur - 1); 98 } 99 retournent (valeur); 100 }

avance endroit

Continuez d'exécuter le programme jusqu'à l'endroit donné. Un argument est exigé, quelque chose de la même forme que des arguments pour coupure commande. L'exécution s'arrêtera également sur la sortie de l'armature courante de pile. Cette commande est semblable à jusque àmais avance ne sautera pas au-dessus des appels récursifs de fonction, et l'endroit de cible ne doit pas être dans la même armature que la courante.

stepi

stepi arg

silicium

Exécutez un instruction de machine, puis arrêt et retour au programme de mise au point.

Il est souvent utile de faire ` display/i $$pc ' en faisant un pas par des instructions de machine. Ceci fait GDB automatiquement montrer la prochaine instruction d'être exécuté, chaque fois que votre programme s'arrête. Voir l'affichage automatique de section .

Un argument est un compte de répétition, en tant que dedans step.

nexti

nexti arg

Ni

Exécutez une instruction de machine, mais si c'est un appel de fonction, procédez jusqu'à ce que la fonction retourne.

Un argument est un compte de répétition, en tant que dedans après.

5,3 Signaux

Un signal est un événement asynchrone qui peut se produire dans un programme. Le logiciel d'exploitation définit les genres possibles de signaux, et donne à chacun aimable un nom et un nombre. Par exemple, dans Unix SIGINT est le signal que un programme obtient quand vous tapez un caractère d'interruption (souvent Cc SIGSEGV est le signal que un programme obtient de mettre en référence un endroit dans la mémoire loin loin de tous les secteurs en service; SIGALRM se produit quand le temporisateur de réveille-matin va au loin (qui se produit seulement si votre programme a demandé une alarme).

Quelques signaux, incluant SIGALRMsont une partie normale du fonctionnement de votre programme. D'autres, comme SIGSEGVindiquez les erreurs; ces signaux sont mortels (ils tuent votre programme immédiatement) si le programme n'a pas indiqué à l'avance une autre manière de manipuler le signal. SIGINT n'indique pas une erreur dans votre programme, mais il est normalement mortel ainsi il peut effectuer le but de l'interruption: pour tuer le programme.

GDB a la capacité de détecter n'importe quelle occurrence d'un signal dans votre programme. Vous pouvez dire à GDB à l'avance quoi faire pour chaque genre de signal.

Normalement, GDB est installé a laissé les signaux non-incorrects comme SIGALRM est silencieusement passé à votre programme (pour pour ne pas interférer leur rôle dans le programme fonctionnant) mais pour arrêter votre programme immédiatement toutes les fois qu'un signal d'erreur se produit. Vous pouvez changer ces arrangements avec poignée commande.

signaux d'information

poignée d'information

Imprimez une table de tous les genres de signaux et comment GDB a été dit pour manipuler chacun. Vous pouvez employer ceci pour voir les nombres de signal de tous les types définis de signaux.

poignée d'information est un nom d'emprunt pour signaux d'information.

poignée signal mots-clés...

Changez la manière que GDB manipule le signal signal. signal peut être le nombre un signal ou son nom de (avec ou sans SIG de ` ' au début); une liste de nombres de signal de la forme `bas-haut'ou le mot ` tout 'signifiant tous les signaux connus. mots-clés parole quel changement à faire.

Les mots-clés ont permis par poignée la commande peut être abrégée. Leurs noms et prénoms sont:

nostop

GDB ne devrait pas arrêter votre programme quand ce signal se produit. Il peut copie immobile un message vous indiquant que le signal est entré.

arrêt

GDB devrait arrêter votre programme quand ce signal se produit. Ceci implique copie mot-clé aussi bien.

copie

GDB devrait imprimer un message quand ce signal se produit.

noprint

GDB ne devrait pas mentionner l'occurrence du signal du tout. Ceci implique nostop mot-clé aussi bien.

passage

noignore

GDB devrait permettre à votre programme de voir ce signal; votre programme peut manipuler le signal, ou bien il peut se terminer si le signal est mortel et non manipulé. passage et noignore sont les synonymes.

nopass

ignorez

GDB ne devrait pas permettre à votre programme de voir ce signal. nopass et ignorez sont les synonymes.

Quand un signal arrête votre programme, le signal n'est pas évident au programme jusqu'à ce que vous continuiez. Votre programme voit le signal alors, si passage est en effet pour le signal en question à ce moment-là . En d'autres termes, après GDB rapporte un signal, vous peut employer poignée commande avec passage ou nopass pour commander si votre programme voit ce signal quand vous continuez.

Le défaut est placé à nostop noprint passage pour les signaux non-incorrects comme SIGALRM SIGWINCH et SIGCHLDet à arrêt copie passage pour les signaux incorrects.

Vous pouvez également employer signal commandez d'empêcher votre programme de voir un signal, ou faites-pour voir un signal qu'il normalement ne verrait pas, ou pour lui donner le n'importe quel signal à tout moment. Par exemple, si votre programme arrêtait en raison d'une certaine sorte d'erreur de référence de mémoire, vous pourriez stocker des valeurs correctes dans les variables incorrectes et continuer, espérant voir plus d'exécution; mais votre programme se terminerait probablement immédiatement en raison du signal mortel une fois qu'il voyait le signal. Pour empêcher ceci, vous pouvez continuer avec signal 0'de `. Voir la section donner à votre programme un signal .

5,4 S'arrêtant et commencer des programmes à lecture multiple

Quand votre programme a les fils multiples (voir les programmes de correction de section avec les fils multiples ), vous pouvez choisir si placer des breaks dans tous les fils, ou dans un fil particulier.

coupure linespec fil threadno

coupure linespec fil threadno si ...

linespec indique des lignes de source; il y a plusieurs manières de l'écriture elles, mais l'effet doit toujours indiquer une certaine ligne de source.

Employez le qualificateur fil de ` threadno' avec une commande de break d'indiquer que vous voulez seulement que GDB arrête le programme quand un fil particulier atteint ce break. threadno est un des marques numériques de fil assignées par GDB, montré dans la première colonne du fils d'information de ` affichage.

Si vous n'indiquez pas fil de ` threadno' quand vous placez un break, le break s'applique à tous les fils de votre programme.

Vous pouvez employer fil qualificateur sur des breaks conditionnels aussi bien; dans ce cas-ci, endroit fil de ` threadno' avant la condition de break, comme ceci:

fil 28 de la coupure frik.c:13 (de gdb) si bartab > lim

Toutes les fois que votre programme s'arrête sous GDB pour n'importe quelle raison, tous les fils d'exécution s'arrêtent, pas simplement le fil courant. Ceci vous permet d'examiner l'état global du programme, y compris le changement entre les fils, sans s'inquiéter ce des choses peut changer l'underfoot.

Réciproquement, toutes les fois que vous remettez en marche le programme, toute l' exécution de début de fils. C'est vrai même lorsque simple-faisant un pas avec des commandes aiment step ou après.

En particulier, GDB ne peut pas en pas à pas tous les fils dans le lockstep. Puisque l'établissement du programme de fil est jusqu'au logiciel d'exploitation de votre cible de correction (non commandé par GDB), d'autres fils peuvent exécuter plus d'un rapport tandis que le fil courant accomplit un pas à pas. D'ailleurs, en général d'autres fils s'arrêtent au milieu d'un rapport, plutôt qu'à une frontière propre de rapport, quand le programme s'arrête.

Vous pourriez même trouver votre programme arrêté en un autre fil après avoir continué ou même simple-fait un pas. Ceci se produit toutes les fois qu'un autre fil fonctionne dans un break, un signal, ou une exception avant que le premier fil accomplisse celui que vous ayez demandé.

Sur un certain OSes, vous pouvez fermer le programmateur à clef d'cOs et permettre ainsi seulement à un fil simple de démarrer.

programmateur-fermeture réglée mode

Placez le mode de fermeture de programmateur. S'il est outre dealors il n'y a aucune fermeture et n'importe quel fil peut fonctionner à tout moment. Si suralors seulement le fil courant peut fonctionner quand l'inférieur est repris. step le mode optimise pour l'simple-progression. Il arrête d'autres fils d'"saisir le message de sollicitation" en acquérant le fil courant tandis que vous faites un pas. D'autres fils veulent seulement rarement (ou) n'obtiennent jamais une chance de démarrer quand vous faites un pas. Ils sont pour démarrer quand vous ` après ' au-dessus un appel de fonction, et eux soyez complètement libre pour démarrer de le moment où vous employez des commandes comme le ` continuent ' ` jusque à 'ou finition de ` '. Cependant, à moins qu'un autre fil frappe un break pendant son timeslice, ils ne voleront jamais le message de sollicitation de GDB loin du fil que vous corrigez.

montrez la programmateur-fermeture

Montrez le mode de fermeture de programmateur courant.

6. Examiner la pile

Quand votre programme s'est arrêté, la première chose que vous devez savoir est où elle s'est arrêtée et comment elle y est arrivée.

Chaque fois que votre programme exécute un appel de fonction, des informations sur l'appel sont produites. Cette information inclut l'endroit de l'appel dans votre programme, les arguments de l'appel, et les variables locales de la fonction s'appelant. L'information est sauvée dans un bloc de données appelées le contenu de la pile . Les armatures de pile sont assignées dans une région de mémoire appelée la pile d'appel .

Quand votre programme s'arrête, les commandes de GDB pour examiner la pile vous permettent de voir toute cette information.

Un des armatures de pile est choisi par GDB et beaucoup de commandes de GDB se réfèrent implicitement à l'armature choisie. En particulier, toutes les fois que vous demandez GDB la valeur d'une variable dans votre programme, la valeur est trouvée dans l'armature choisie. Il y a des commandes spéciales de GDB de choisir par n'importe quelle armature vous êtes intéressé. Voir la section choisir une armature .

Quand votre programme s'arrête, GDB choisit automatiquement l'armature actuellement d'exécution et la décrit brièvement, semblable au armature commande (voir les informations de section sur une armature ).

6,1 Empilez les armatures

La pile d'appel est divisée en morceaux contigus appelés les armatures de pile , ou armatures pour le short; chaque armature est les données liées à un appel à une fonction. L'armature contient les arguments donnés à la fonction, les variables locales de la fonction, et l'adresse à laquelle la fonction s'exécute.

Quand votre programme est commencé, la pile a seulement une armature, qui de la fonction principal. Ceci s'appelle l'armature initiale ou l'armature extérieure. Chaque fois que une fonction s'appelle, une nouvelle armature est faite. Chaque fois que une fonction retourne, on élimine l'armature pour cette invocation de fonction. Si une fonction est récursive, il peut y avoir beaucoup d'armatures pour la même fonction. L'armature pour la fonction dans laquelle l'exécution se produit réellement s'appelle l'armature les plus secrets. C'est le plus récemment créé de toutes les armatures de pile qui existent toujours.

Ã€ l'intérieur de votre programme, des armatures de pile sont identifiées par leurs adresses. le contenu de la pile se compose de beaucoup de bytes, dont chacun a sa propre adresse; chaque genre d'ordinateur a une convention pour choisir un byte dont l'adresse sert d'adresse de l'armature. Habituellement cette adresse est maintenue dans un registre appelé le registre d'indicateur d'armature tandis que l'exécution continue dans cette armature.

GDB assigne des nombres à toutes les armatures existantes de pile, commençant par zéro pour l'armature les plus secrets, un pour l'armature qui l'a appelée, et ainsi de suite vers le haut. Ces nombres n'existent pas vraiment dans votre programme; ils sont assignés par GDB pour vous donner une manière d'indiquer des armatures de pile dans des commandes de GDB.

Quelques compilateurs fournissent une manière de compiler des fonctions de sorte qu'ils fonctionnent sans armatures de pile. (par exemple, l'option de GCC

`-fomit-armature-indicateur '

produit des fonctions sans armature.) Ceci est de temps en temps fait avec des fonctions de bibliothèque fortement utilisées pour sauver le temps d'installation d'armature. GDB a limité des équipements pour traiter ces invocations de fonction. Si l'invocation les plus secrets de fonction n'a aucle contenu de la pile, de GDB respect néanmoins il comme s'il a eu une armature séparée, qui numéro zéro comme d'habitude, permettant le traçage correct de la chaîne d'appel de fonction. Cependant, GDB ne prévoit aucun des fonctions frameless ailleurs dans la pile.

armature args

armature la commande vous permet de se déplacer d'le contenu de la pile à l'autre, et d'imprimer l'armature de pile vous choisi. args peut être l'adresse de l'armature ou le nombre d'armature de pile. Sans argument, armature imprime l'armature courante de pile.

choisir-armature

choisir-armature la commande vous permet de vous déplacer d'le contenu de la pile à l'autre sans imprimer l'armature. C'est la version silencieuse de armature.

6,2 Backtraces

Un backtrace est un sommaire de la façon dont votre programme a obtenu où il est. Il montre une ligne par armature, de beaucoup d'armatures, commençant par l'armature actuellement d'exécution (armature zéro), suivie de son visiteur (armature une), et sur vers le haut de la pile.

backtrace

bt

Imprimez un backtrace de la pile entière: une ligne par armature de toutes les armatures dans la pile.

Vous pouvez arrêter le backtrace à tout moment en tapant le caractère d'interruption de système, normalement Cc.

backtrace n

bt n

Semblable, mais copie seulement le les plus secrets n armatures.

backtrace -n

bt -n

Semblable, mais copie seulement l'extérieur n armatures.

Les noms là où et pile d'information (abrégé information ssont les noms d'emprunt additionnels pour backtrace.

Chaque ligne dans le backtrace montre le nombre d'armature et le nom de fonction. La valeur de compteur de programme est également montrée -- à moins que vous employez adresse réglée d'impression au loin. Le backtrace montre également le nom de fichier de source et le nombre de ligne, aussi bien que les arguments à la fonction. La valeur de compteur de programme est omise si elle est au début du code pour ce nombre de ligne.

Voici un exemple d'un backtrace. Il a été fait avec la commande bt 3'de `ainsi il montre les trois armatures les plus secrets.

Â

#0 m4_traceon (obs=0x2êb0, argc=1, argv=0x2b8c8) à builtin.c:993 #1 0x6e38 dans l'expand_macro (sym=0x2b600) à macro.c:242 #2 0x6840 expand_token dedans (obs=0x0, t=177664, td=0xf7fffb08) à macro.c:71 (plus d'armatures de pile suivent...)

L'affichage de l'armature zéro ne commence pas par une valeur de compteur de programme, indiquant que votre programme s'est arrêté au début du code pour la ligne 993 de builtin.c.

La plupart des programmes ont un point d'entrée standard d'utilisateur -- un endroit où des bibliothèques système et transition de démarrage de code dans le code d'utilisateur. Pour C c'est principal. Quand GDB trouve la fonction d'entrée dans un backtrace qu'elle terminera le backtrace, pour éviter de tracer dans le code fortement système-spécifique (et généralement inintéressant).

Si vous devez examiner le code de démarrage, ou limitez le nombre de niveaux dans un backtrace, vous pouvez changer ce comportement:

placez le backtrace après-principal

placez le backtrace après-principal dessus

Backtraces continuera après le point d'entrée d'utilisateur.

placez le backtrace après-principal au loin

Backtraces s'arrêtera quand ils rencontrent le point d'entrée d'utilisateur. C'est le défaut.

montrez le backtrace après-principal

Montrez la politique courante de backtrace de point d'entrée d'utilisateur.

fixez la limite de backtrace n

fixez la limite 0 de backtrace

Limitez le backtrace à n niveaux. Une valeur des moyens zéro illimités.

montrez la limite de backtrace

Montrez la limite courante aux niveaux de backtrace.

6,3 Choix d'une armature

La plupart des commandes pour examiner la pile et d'autres données dans votre travail de programme sur n'importe quelle armature de pile est choisie à l'heure actuelle. Voici les commandes pour choisir le contenu de la pile; tous finissent en imprimant une executee description de l'armature de pile juste choisie.

armature n

f n

Choisissez le nombre d'armature n. Rappelez-vous que l'armature zéro est l'armature (actuellement d'exécution) les plus secrets, l'armature une est l'armature qui a appelé le les plus secrets, et ainsi de suite. L'armature haut-numérotée est celle pour principal.

armature addr

f addr

Choisissez l'armature à l'adresse addr. C'est utile principalement si l'enchaînement des armatures de pile a été endommagé par un bogue, le rendant impossible pour que GDB assigne des nombres correctement à toutes les armatures. En outre, ceci peut être utile quand votre programme a les piles multiples et les commutateurs entre eux.

Sur l'architecture de SPARC, armature les besoins deux adresses de choisir une armature arbitraire: un indicateur d'armature et un indicateur de pile.

Sur les MIPS et l'architecture d'alpha, elle a besoin de deux adresses: un indicateur de pile et un compteur de programme.

Sur l'architecture 29k, il a besoin de trois adresses: un indicateur de pile de registre, un compteur de programme, et un indicateur de pile de mémoire.

vers le haut de n

Mouvement n armatures vers le haut de la pile. Pour des nombres positifs nceci avance vers l'armature extérieure, pour encadrer plus haut des nombres, aux armatures qui ont existé plus longtemps. n se transfère sur un.

vers le bas n

Mouvement n armatures en bas de la pile. Pour des nombres positifs nceci avance vers l'armature les plus secrets, pour abaisser des nombres d'armature, aux armatures qui ont été créées plus récemment. n se transfère sur un. Vous pouvez abréger vers le bas As .

Toutes ces commandes finissent en imprimant deux lignes de rendement décrivant l'armature. La première ligne montre le nombre d'armature, le nom de fonction, les arguments, et le nombre de fichier source et de ligne d'exécution dans cette armature. La deuxième ligne montre le texte de cette ligne de source.

Par exemple:

Â

(gdb) vers le haut de #1 0x22f0 dans la force (argc=1, argv=0xf7fffbf4, env=0xf7fffbfc) à env.c:10 10 read_input_file (argv[i ]);

Après une telle liste imprimée, liste la commande sans des arguments imprime dix lignes centrées sur le point d'exécution dans l'armature. Vous pouvez également éditer le programme au moment où l'exécution avec votre programme préféré d'édition par la tapez éditez. Voir la section imprimer des lignes de source , pour des détails.

up-silently n

down-silently n

Ces deux commandes sont des variantes de vers le haut de et vers le basrespectivement; elles diffèrent du fait elles effectuent leur travail silencieusement, sans causer l'affichage de la nouvelle armature. Elles sont prévues principalement pour l'usage en manuscrits de commande de GDB, où la sortiepourrait être inutile et distrayant.

6,4 Informations sur une armature

Il y a plusieurs autres commandes d'imprimer des informations sur l'armature choisie de pile.

armature

f

Une fois non utilisée sans aucun argument, cette commande ne change pas quelle armature est choisie, mais imprime une executee description de l'armature actuellement choisie de pile. Elle peut être abrégée f. Avec un argument, cette commande est utilisée comme moyen de choisir le contenu de la pile. Voir la section choisir une armature .

armature d'information

information f

Cette commande imprime une description bavarde de l'armature choisie de pile, incluant:

l'adresse de l'armature

l'adresse de la prochaine armature vers le bas (appelé par cette armature)

l'adresse de la prochaine armature vers le haut (visiteur de cette armature)

la langue dans laquelle le code source correspondant à cette armature est écrit

l'adresse des arguments de l'armature

l'adresse des variables locales de l'armature

le compteur de programme sauvé dans lui (l'adresse de l'exécution dans l'armature de visiteur)

quels registres ont été sauvés dans l'armature

La description bavarde est utile quand quelque chose a mal tourné qui a fait la pile composer l'échouer pour adapter les conventions habituelles.

armature d'information addr

information f addr

Imprimez une description bavarde de l'armature à l'adresse addrsans choisir cette armature. L'armature choisie demeure sans changement à côté de cette commande. Ceci exige le même genre d'adresse (plus d'une pour quelques architectures) ce vous indiquent dans armature commande. Voir la section choisir une armature .

args d'information

Imprimez les arguments de l'armature choisie, chacun sur une ligne séparée.

locals d'information

Imprimez les variables locales de l'armature choisie, chacune sur une ligne séparée. Ce sont toutes les variables (statique ou automatique avoué) accessibles au moment où l'exécution de l'armature choisie.

crochet d'information

Imprimez une liste de tous les traiteurs d'exception qui sont en activité dans l'armature courante de pile au point courant d'exécution. Pour voir d'autres traiteurs d'exception, visitez l'armature associée (employer vers le haut de vers le basou armature commandes); puis type crochet d'information. Voir la section placer des catchpoints .

7. Fichiers source D'Examiner

GDB peut imprimer des parties de la source de votre programme, puisque l'information de mise en point enregistrée dans le programme indique à GDB quels fichiers source ont été employés pour le construire. Quand votre programme s'arrête, GDB imprime spontanément la ligne où il s'est arrêté. De même, quand vous choisissez le contenu de la pile (voir la section choisir une armature ), GDB imprime la ligne où l'exécution dans cette armature s'est arrêtée. Vous pouvez imprimer d'autres parties de fichiers source par la commande explicite.

Si vous employez GDB par sa interface de GNU Emacs, vous pouvez préférer employer des équipements d'Emacs pour regarder la source; voyez en utilisant GDB sous GNU Emacs .

7,1 Impression des lignes de source

Pour imprimer des lignes à partir d'un fichier source, employez liste commande (abrégée lPar défaut, dix lignes sont imprimées. Il y a plusieurs manières d'indiquer quelle partie du dossier vous voulez imprimer.

Voici les formes de liste la commande le plus généralement a employé:

liste linenum

Les lignes d'impression se sont concentrées sur le nombre de ligne linenum dans le fichier source courant.

liste fonction

Imprimez les lignes concentrer sur le commencement de la fonction fonction.

liste

Imprimez plus de lignes. Si les dernières lignes imprimées étaient imprimées avec a liste commandez, ceci imprime des lignes après les dernières lignes imprimées; cependant, si la dernière ligne imprimée était une ligne solitaire imprimée en tant qu'élément de montrer le contenu de la pile (voir la section examiner la pile ), ceci imprime des lignes concentrer sur cette ligne.

liste -

Les lignes d'imtapez juste avant les lignes ont pour la dernière fois imprimé.

Par défaut, GDB imprime dix lignes de source avec n'importe laquelle de ces formes de liste commande. Vous pouvez changer cet employer placez listsize

l'ensemble listsize compte

Faites liste affichage de commande compte lignes de source (à moins que liste l'argument indique explicitement un autre nombre).

montrez listsize

Montrez le nombre de lignes cela liste copies.

Répétition de a liste commande avec Retour jette l'argument, ainsi il est équivalent à la tapez juste liste. C'est plus utile qu'énumérant les mêmes lignes encore. Une exception est faite pour un argument de ` - 'cet argument est préservé dans la répétition de sorte que chaque répétition se relève le fichier source.

En général, liste la commande s'attend à ce que vous fournissiez zéro, un ou deux linespecs . Linespecs indiquent des lignes de source; il y a plusieurs manières de l'écriture elles, mais l'effet doit toujours indiquer une certaine ligne de source. Voici une description complète des arguments possibles pour liste

liste linespec

Imprimez les lignes concentrer sur la ligne indiquée près linespec.

liste d'abordbout

Lignes d'impression de d'abord à bout. Les deux arguments sont des linespecs.

liste,bout

La copie raye la fin avec bout.

liste d'abord

Lignes d'impression commençant par d'abord.

liste +

Lignes d'imtapez juste aprés les lignes pour la dernière fois imprimées.

liste -

Lignes d'imtapez juste avant les lignes pour la dernière fois imprimées.

liste

Comme décrit dans la table précédente.

Voici les manières d'indiquer une ligne de source simple -- tous les genres de linespec.

nombre

Indique la ligne nombre du fichier source courant. Quand a liste la commande a deux linespecs, ceci se rapporte au même fichier source que le premier linespec.

+excentrage

Indique la ligne excentrage les lignes après la dernière ligne ont imprimé. Une fois utilisé comme deuxième linespec dans a liste commandez qu'a deux, ceci indique la ligne excentrage lignes vers le bas du premier linespec.

-excentrage

Indique la ligne excentrage les lignes avant la dernière ligne ont imprimé.

nom de fichiernombre

Indique la ligne nombre dans le fichier source nom de fichier.

fonction

Indique la ligne qui commence le corps de la fonction fonction. Par exemple: en C, c'est la ligne avec le croisillon ouvert.

nom de fichierfonction

Indique la ligne du ouvrir-attachent qui commence le corps de la fonction fonction dans le dossier nom de fichier. Vous avez besoin seulement du nom de fichier avec un nom de fonction pour éviter l'ambiguÃ¯té quand on appelle identiquement des fonctions dans différents fichiers source.

*adresse

Indique la ligne contenant le discours programme adresse. adresse peut être n'importe quelle expression.

7,2 Edition des fichiers source

Pour éditer les lignes dans un fichier source, employez éditez commande. Le programme d'édition de votre choix est appelé avec la ligne courante réglée à la ligne active dans le programme. Alternativement, il y a plusieurs manières d'indiquer quelle partie du dossier vous voulez imprimer si vous voulez voir d'autres parties du programme.

Voici les formes de éditez commandez le plus généralement utilisé:

éditez

Editez le fichier source courant au nombre actif de ligne dans le programme.

éditez nombre

Editez le fichier source courant avec nombre comme nombre actif de ligne.

éditez fonction

Editez contenir de dossier fonction au début de sa définition.

éditez nom de fichiernombre

Indique la ligne nombre dans le fichier source nom de fichier.

éditez nom de fichierfonction

Indique la ligne qui commence le corps de la fonction fonction dans le dossier nom de fichier. Vous avez besoin seulement du nom de fichier avec un nom de fonction pour éviter l'ambiguÃ¯té quand on appelle identiquement des fonctions dans différents fichiers source.

éditez *adresse

Indique la ligne contenant le discours programme adresse. adresse peut être n'importe quelle expression.

7,2,1 Choix de votre rédacteur

Vous pouvez adapter GDB aux besoins du client pour employer n'importe quel rédacteur que vous voulez (2) . Par défaut, il est/bin/ex, mais vous pouvez changer ceci en plaçant la variable d'environnement REDACTEUR avant d'employer GDB. Par exemple, pour configurer GDB pour employer vi rédacteur, vous pourriez employer ces commandes avec SH shell:

Gdb de REDACTEUR d'exportation d'EDITOR=/usr/bin/vi...

ou dans csh shell,

gdb du REDACTEUR de setenv/ usr/bin/vi...

7,3 Recherche des fichiers source

Il y a deux commandes pour rechercher par le fichier source courant une expression régulière.

vers l'avant-recherchez regexp

recherche regexp

La commande le ` vers l'avant-recherchent regexp' vérifie chaque ligne, commençant par celle après la dernière ligne énumérée, une allumette regexp. Il énumère la ligne qui est trouvée. Vous pouvez employer le synonyme recherche de ` regexp' ou abrégez le nom de commande As fo.

renversé-recherchez regexp

La commande le ` renversé-recherchent regexp' vérifie chaque ligne, commençant par celle avant que la dernière ligne énumérée et allante vers l'arrière, une allumette regexp. Il énumère la ligne qui est trouvée. Vous pouvez abréger cette commande As tour.

7,4 Indication des répertoires source

Les programmes exécutables parfois n'enregistrent pas les annuaires des fichiers source desquels ils ont été compilés, juste les noms. Même lorsqu'ils , les annuaires pourraient être déplacés entre la compilation et votre session de correction. GDB a une liste d'annuaires pour rechercher des fichiers source; ceci s'appelle le chemin de source . Chaque fois que GDB veut un fichier source, il essaye tous les annuaires dans la liste, dans l'ordre qu'ils sont présents dans la liste, jusqu'à ce qu'elle trouve un dossier avec le nom désiré. Notez que le chemin de recherche exécutable n'est pas utilisé à cette fin. Ni l'un ni l'autre n'est l'annuaire de fonctionnement courant, à moins qu'il s'avère justement être dans le chemin de source.

Si GDB ne peut pas trouver un fichier source dans le chemin de source, et le programme objet enregistre un annuaire, GDB essaye cet annuaire aussi. Si le chemin de source est vide, et il n'y a aucun disque de l'annuaire de compilation, GDB regarde dans l'annuaire courant en dernier recours.

Toutes les fois que vous remettez à zéro ou réarrangez le chemin de source, GDB dégage dehors n'importe quelle information qu'il a cachée environ où des fichiers source sont trouvés et où chaque ligne est dans le dossier.

Quand vous commencez GDB, son chemin de source inclut seulement cdir de ` ' et cwd de ` 'dans cet ordre. Pour ajouter d'autres annuaires, employez annuaire commande.

annuaire dirname ...

dir dirname ...

Ajoutez l'annuaire dirname à l'avant du chemin de source. Plusieurs noms d'annuaire peuvent être donnés à cette commande, séparée près `: ' (`;' sur le MSDOS et le Mme.-Windows, où `: ' apparaît habituellement en tant qu'élément des noms de dossier absolu) ou du whitespace. Vous pouvez indiquer un annuaire qui est déjà dans le chemin de source; ceci le fait avancer, ainsi GDB

recherches il plus tôt.

Vous pouvez employer la corde `$cdir ' pour se rapporter à l'annuaire de compilation (si un est enregistré), et `$cwd ' pour se rapporter à l'annuaire de fonctionnement courant. `$cwd ' n'est pas le même que `.'d'anciennes voies de ---the l'annuaire de fonctionnement courant pendant qu'il change pendant votre session de GDB, alors que le dernier est immédiatement augmenté à l'annuaire courant alors vous ajoutez une entrée au chemin de source.

annuaire

Remettez à zéro le chemin de source pour vider encore. Ceci exige la confirmation.

montrez les annuaires

Imprimez le chemin de source: montrez quels annuaires il contient.

Si votre chemin de source est encombré avec les annuaires qui ne sont plus d'intérêt, GDB peut parfois causer la confusion en trouvant les versions fausses de la source. Vous pouvez corriger la situation comme suit:

Utilisation annuaire sans l'argument pour remettre à zéro le chemin de source pour vider.

Utilisation annuaire avec des arguments appropriés pour réinstaller les annuaires vous voulez dans le chemin de source. Vous pouvez ajouter tous les annuaires dans une commande.

7,5 Source et code machine

Vous pouvez employer la commande ligne d'information pour tracer des lignes de source des discours programme (et vice versa), et la commande démontez pour montrer une gamme des adresses comme instructions de machine. Une fois run sous le mode de GNU Emacs, ligne d'information la commande fait diriger la flèche à la ligne indiquée. En outre, ligne d'information adresses d'impression en forme symbolique aussi bien que le sortilège.

ligne d'information linespec

Imprimez les adresses commençantes et terminales du code compilé pour la ligne de source linespec. Vous pouvez indiquer des lignes de source dans n'importe laquelle de ces manières comprises par liste commande (voir la section imprimer des lignes de source ).

Par exemple, nous pouvons employer ligne d'information pour découvrir l'endroit du code d'objet pour la première ligne de la fonction m4_changequote

Â

(gdb) ligne 895 de la ligne m4_changequote d'information des débuts de "builtin.c" au PC 0x634c et extrémités à 0x6350.

Nous pouvons également nous enquérir (en utilisant *addr comme forme pour linespecquelle ligne de source couvre une adresse particulière:

(gdb) ligne d'information * 0x63ff ligne 926 des débuts d'"builtin.c" au PC 0x6é4 et extrémités à 0x6404.

Ensuite ligne d'informationl'adresse de défaut pour X la commande est changée en adresse commençante de la ligne, de sorte que ` x/i' il est suffisant commencer à examiner le code machine (voir la mémoire d'examiner de section ). En outre, cette adresse est sauvée comme valeur de la variable de convenance $ _ (voir les variables de convenance de section ).

démontez

Cette commande spécialisée vide une gamme de mémoire comme instructions de machine. La gamme de mémoire de défaut est la fonction entourant le compteur de programme de l'armature choisie. Un argument simple à cette commande est une valeur de compteur de programme; GDB vide la fonction entourant cette valeur. Deux arguments indiquent une gamme des adresses (premiers inclus, en second lieu exclusif) pour vider.

L'exemple suivant montre le démontage d'une gamme des adresses du code de la HP PA-RISC 2,0:

Â

décharge des disas 0x32c4 0x3è4 (de gdb ) du code assembleur de 0x32c4 à 0x3è4: 0x32c4 < main+204 >: addil 0, DP 0x32c8 < main+208 >: ldw 0x22c(sr0, r1), r26 0x32cc < main+212 >: ldil 0x3000, r31 0x32d0 < main+216 >: ble 0x3f8(sr4, r31) 0x32d4 < main+220 >: ldo 0(r31), RP 0x32d8 < main+224 >: addil -0x800, DP 0x32dc < main+228 >: ldo 0x588(r1), r26 0x3è0 < main+232 >: ldil 0x3000, extrémité r31 de décharge d'assembleur.

Quelques architectures ont plus que celles ensemble utilisé généralement de mnémonique d'instruction ou de toute autre syntaxe.

placez la démontage-saveur instruction-placez

Choisissez l'ensemble d'instruction pour employer en démontant le programme par l'intermédiaire du démontez ou x/i commandes.

Actuellement cette commande est seulement définie pour la famille d'Intel x86. Vous pouvez placer instruction-placez à l'un ou l'autre Intel ou att. Le défaut est attla AT&t assaisonnent utilisé par défaut par des assembleurs d'Unix pour des cibles de x86-based.

8. Données D'Examiner

La manière habituelle d'examiner des données dans votre programme est avec copie commande (abrégée pou son synonyme inspectez. Il évalue et des copies la valeur d'une expression de la langue votre programme est écrites dedans (voir la section en utilisant GDB avec différentes langues ).

copie expr

copie/f expr

expr est une expression (dans la langue source). Par défaut la valeur de expr est imprimé dans un format approprié à son type de données; vous pouvez choisir un format différent par l'indication `/f'où f est une lettre indiquant le format; voyez pour produire des formats .

copie

copie/f

Si vous omettez exprGDB montre la dernière valeur encore ( de l'histoire de valeur ; voir la section évaluer l'histoire ). Ceci vous permet d'inspecter commodément la même valeur dans un format alternatif.

Une manière plus de bas niveau d'examiner des données est avec X commande. Elle examine des données dans la mémoire à une adresse indiquée et les imprime dans un format indiqué. Voir la mémoire d'examiner de section .

Si vous êtes intéressé par les informations sur des types, ou au sujet de la façon dont les champs d'un struct ou d'une classe sont déclarés, employez ptype exp commande plutôt que copie. Voir la section examiner le Tableau de symbole .

8,1 Expressions

copie et beaucoup d'autres commandes de GDB acceptent une expression et calculent sa valeur. N'importe quel genre de constante, de variable ou d'opérateur défini par le langage de programmation que vous employez est valide dans une expression dans GDB. Ceci inclut des expressions conditionnelles, des appels de fonction, des fontes, et des constantes de corde. Il inclut également des macros de préprocesseur, si vous compiliez votre programme pour inclure cette information; voyez 4,1 compiler pour la correction .

Les appuis de GDB rangent des constantes dans les expressions entrées par l'utilisateur. La syntaxe est {élément élément... }. Par exemple, vous pouvez employer la commande copie { 1, 2, 3 } pour accumuler une rangée dans la mémoire qui est mallocED dans le programme de cible.

Puisque C est si répandu, la plupart des expressions montrées dans les exemples en ce manuel sont en section de C. See en utilisant GDB avec différentes langues , pour information sur la façon dont employer des expressions dans d'autres langues.

Dans cette section, nous discutons les opérateurs que vous pouvez employer dans des expressions de GDB indépendamment de votre langage de programmation.

Des fontes sont soutenues dans toutes les langues, pas simplement en C, parce qu'il est si utile de mouler un nombre dans un indicateur afin d'examiner une structure à cette adresse dans la mémoire.

GDB soutient ces opérateurs, en plus de ceux communs aux langages de programmation:

@

` @ ' est un opérateur binaire pour traiter des parties de mémoire en tant que rangées. Voir les rangées artificielles de section , pour plus d'information.

::

`:: ' vous permet d'indiquer une variable en termes de dossier ou de fonctionner où il est défini. Voir la section programmer des variables .

{tapez} addr

Se rapporte à un objet de type type stocké à l'adresse addr dans la mémoire. addr peut être n'importe quelle expression dont la valeur est un nombre entier ou un indicateur (mais des parenthèses sont exigés autour des opérateurs binaires, juste comme dans une fonte). On permet cette construction indépendamment derrière de quel genre de données est normalement censé résider addr.

8,2 Variables de programme

Le genre le plus commun d'expression à l'utilisation est le nom d'une variable dans votre programme.

Des variables dans les expressions sont comprises dans l'armature choisie de pile (voir la section choisir une armature ); elles doivent être l'une ou l'autre:

global (ou dossier-statique)

ou

évident selon les règles de portée du langage de programmation du point d'exécution dans cette armature

Ceci signifie cela dans la fonction

Â

foo (a) a interne; { barre (a); { interne b = essai (); barre (b); } }

vous pouvez examiner et employer la variable a toutes les fois que votre programme s'exécute dans la fonction foomais vous pouvez seulement employer ou examiner la variable b tandis que votre programme s'exécute à l'intérieur du bloc où b est déclaré.

Il y a une exception: vous pouvez vous référer une variable ou la fonction dont la portée est un fichier source simple à même si le point courant d'exécution n'est pas dans ce dossier. Mais il est possible d'avoir plus d'un tel variable ou fonction avec le même nom (dans différents fichiers source). Si cela se produit, se rapportant que le nom a des effets imprévisibles. Dans si vous souhaitez, vous pouvez indiquer une variable statique une fonction particulière ou dossier, en utilisant la notation de deux points-deux points:

Â

file::variable function::variable

Ici dossier ou fonction est le nom du contexte pour la charge statique variable. Dans le cas des noms de dossier, vous pouvez employer des quotes pour vous assurer que GDB analyse le nom de fichier comme mot simple -- par exemple, pour imprimer une valeur globale de X défini dans le ` f2.c ':

Â

(gdb) p 'f2.c'::x

Cette utilisation de `:: ' est très rarement en conflit avec l'utilisation très semblable de la même notation en C ++ . De GDB utilisation de soutiens également de l'opérateur de résolution de portée de C ++ dans des expressions de GDB.

Avertissement: De temps en temps, une variable locale peut sembler avoir la valeur fausse à certains points dans une fonction -- juste aprés l'entrée à une nouvelle portée, et juste avant la sortie.

Vous pouvez voir ce problème quand vous faites un pas par des instructions de machine. C'est parce que, sur la plupart des machines, il prend plus d'une instruction d'installer le contenu de la pile (définitions variables locales y compris); si vous faites un pas par des instructions de machine, les variables peuvent sembler avoir les valeurs fausses jusqu'à ce que l'armature de pile soit complètement établie. Sur la sortie, elle prend habituellement également plus d'une instruction de machine de détruire le contenu de la pile; après que vous commenciez à faire un pas par ce groupe d'instructions, des définitions variables locales peuvent être allées.

Ceci peut également se produire quand le compilateur fait des optimisations significatives. Pour être sûr de voir toujours des valeurs précises, arrêtez toute l'optimisation en compilant.

Un autre effet possible des optimisations de compilateur doit optimiser des variables inutilisées hors de l'existence, ou assignez les variables aux registres (par opposition aux adresses de mémoire). Selon le soutien de tels cas offerts par le format d'information de correction employé par le compilateur, GDB ne pourrait pas pouvoir montrer des valeurs pour de telles variables locales. Si

cela se produit, GDB imprimera un message comme ceci:

Â

Aucun symbole "foo" dans le contexte courant.

Pour résoudre de tels problèmes, l'un ou l'autre recompile sans optimisations, ou employer un différent corrigent le format d'information, si le compilateur soutient plusieurs tels formats. Par exemple, le GCC, le compilateur de GNU C/c ++ soutient habituellement `-gstabs+ ' option. `-gstabs+ ' produit corrigent l'information dans un format qui est supérieur aux formats tels que COFF. Vous pouvez pouvoir employer le NAIN 2 (`-gdwarf-2 'pour laquelle est également une forme efficace corrigez l'information. Voir les options de ` de section pour corriger votre programme ou GNU cc ' en employant GNU cc .

8,3 Rangées artificielles

Il est souvent utile d'imprimer hors de plusieurs objets successifs de la même chose saisissent la mémoire; une section d'une rangée, ou un choix de taille dynamiquement déterminée pour lequel seulement un indicateur existe dans le programme.

Vous pouvez faire ceci en se rapportant à une envergure contiguë de mémoire comme rangée artificielle , en utilisant l'opérateur binaire ` @ '. L'opérande gauche de ` @ ' si soyez le premier élément de la rangée désirée et soyez un objet individuel. Le bon opérande devrait être la longueur désirée de la rangée. Le résultat est une valeur de rangée dont les éléments sont tout le type de l'argument gauche. Le premier élément est réellement l'argument gauche; le deuxième élément vient des bytes de mémoire juste après ceux qui tiennent le premier élément, et ainsi de suite. Voici un exemple. Si un programme indique

Â

interne * rangée = (interne *) malloc (len * le sizeof (interne));

vous pouvez imprimer les teneurs de rangée avec

Â

p * array@len

L'opérande gauche de ` @ ' doit résider dans la mémoire. Rangez les valeurs faites avec ` @ ' de cette façon comportez-vous juste comme d'autres rangées en termes d'indiçage, et êtes contraint aux indicateurs une fois utilisé dans les expressions. Les rangées artificielles apparaissent le plus souvent dans les expressions par l'intermédiaire de l'histoire de valeur (voir la section évaluer l'histoire ), après l'impression dehors.

Une autre manière de créer une rangée artificielle est d'employer une fonte. Ceci réinterprète une valeur comme si c'étaient une rangée. La valeur n'a pas besoin d'être dans la mémoire:

(gdb) p/x (short[2])0x12345678 $1 = { 0x1234, 0x5678 }

Comme convenance, si vous omettez la longueur de rangée (en tant que dedans ` (type[ ])valeur'GDB calcule la taille pour remplir valeur (As sizeof(de `valeurtype'

(gdb) p/x (short[])0x12345678 $2 = { 0x1234, 0x5678 }

Parfois le mécanisme artificiel de rangée n'est pas assez tout à fait; en structures de données modérément complexes, les éléments d'intérêt peuvent réellement ne pas être adjacents -- par exemple, si vous êtes intéressé par les valeurs des indicateurs dans une rangée. Un work-around utile dans cette situation doit employer une variable de convenance (voir les variables de convenance de section ) comme compteur dans une expression qui imprime la première valeur intéressante, et puis répète cette expression par l'intermédiaire de Retour. Par exemple, supposez que vous avez une rangée dtab des indicateurs aux structures, et à vous soyez intéressé par les valeurs d'un champ fv en chaque structure. Voici un exemple de ce que vous pourriez tapezr:

Â

ensemble $$i = 0 retours de retour de p dtab[$i++]->fv ...

8,4 Formats de rendement

Par défaut, GDB imprime une valeur selon son type de données. Parfois n'est pas ce ce que vous voulez. Par exemple, vous pourriez vouloir imprimer un nombre dans le sortilège, ou un indicateur dans la décimale. Ou vous pourriez vouloir regarder des données dans la mémoire à une certaine adresse comme chaîne de caractères ou comme instruction. Pour faire ces choses, indiquez un format de rendement quand vous imprimez une valeur.

L'utilisation la plus simple des formats de rendement doit dire comment imprimer une valeur déjà calculée. Ceci est fait en commençant les arguments du copie commandez avec une estafilade et une lettre de format. Les lettres de format soutenues sont:

X

Considérez le peu de la valeur comme un nombre entier, et imprimez le nombre entier dans l'hexadécimal.

d

Imprimez comme nombre entier dans la décimale signée.

u

Imprimez comme nombre entier dans la décimale non signée.

o

Imprimez comme nombre entier dans octal.

t

Imprimez comme nombre entier dans binaire. La lettre ` t ' stands pour "deux". (3)

a

Copie comme adresse, absolue dans l'hexadécimal et comme excentrage du symbole précédent le plus proche. Vous pouvez employer ce format employé pour découvrir où (dans quelle fonction) une adresse inconnue est localisée:

(gdb) p/a 0x54320 $3 = 0x54320 < _ initialize_vx+396 >

La commande symbole 0x54320 d'information donne les résultats semblables. Voir le symbole d'information de section .

c

Le respect comme nombre entier et l'imprime comme constante de caractère.

f

Considérez le peu de la valeur comme un nombre de virgule flottante et imprimez en utilisant la syntaxe typique de virgule flottante.

Par exemple, pour imprimer le compteur de programme dans le sortilège (voir les registres de la section 8,10 ), type

Â

p/x $$pc

Notez qu'aucun espace n'est exigé avant l'estafilade; c'est parce que les noms de commande dans GDB ne peuvent pas contenir une estafilade.

Pour réimprimer la dernière valeur dans l'histoire de valeur avec un format différent, vous pouvez employer copie commandez avec juste un format et aucune expression. Par exemple, ` p/x ' réimprime la dernière valeur dans le sortilège.

8,5 Mémoire d'examiner

Vous pouvez employer la commande X (pour "examinez") pour examiner la mémoire dans quels de plusieurs formats, indépendamment des types de données de votre programme.

X/nfu addr

X addr

X

Employez X commandez d'examiner la mémoire.

n fet u sont tous les paramètres facultatifs qui indiquent combien de mémoire à montrer et comment la composer; addr est une expression donnant l'adresse où vous voulez commencer à montrer la mémoire. Si vous employez des défauts pour nfuvous n'avez pas besoin de tapezr l'estafilade `/'. Plusieurs défauts commodes de jeu de commandes pour addr.

nle compte de répétition

Le compte de répétition est un nombre entier décimal; le défaut est 1. Il indique combien de mémoire (comptant par des unités upour montrer.

fle format d'affichage

Le format d'affichage est un des formats utilisés près copie s de ` (corde nul-terminée), ou i'de ` (instruction de machine). Le défaut est x'de ` (hexadécimal) au commencement. Les changements de défaut chaque fois que vous employez l'un ou l'autre X ou copie.

ula taille d'unité

La taille d'unité est quelle de

b

Bytes.

h

Demis-mot (deux bytes).

W

Mots (quatre bytes). C'est le défaut initial.

g

Mots géants (huit bytes).

Chaque fois que vous indiquez une taille d'unité avec Xcette taille devient l'unité de défaut la prochaine fois que vous employez X. (pour s de ` et i'de ` des formats, la taille d'unité est ignorés et n'est pas normalement écrits.)

addrcommençant l'adresse d'affichage

addr est l'adresse où vous voulez que GDB commence à montrer la mémoire. L'expression n'a pas besoin d'avoir une valeur d'indicateur (bien qu'elle peut); elle est toujours interprétée comme adresse de nombre entier d'un byte de mémoire. Voir les expressions de section , pour plus d'information sur des expressions. Le défaut pour addr est habituellement juste aprés que la dernière adresse ait examiné commandes -- mais plusieurs autres ont également placé l'adresse de défaut: breaks d'information (à l'adresse du dernier break énuméré), ligne d'information (à l'adresse commençante d'une ligne), et copie (si vous l'employez pour montrer une valeur de mémoire).

Par exemple, ` x/Ãºh 0x54320' est une demande de montrer trois demis-mot (hde la mémoire, composé en tant que nombres entiers décimaux non signés (` u 'commençant à l'adresse 0x54320. ` x/4xw $$sp ' imprime les quatre mots (` W 'de la mémoire au-dessus de l'indicateur de pile (ici, `$sp 'voir les registres de section ) dans l'hexadécimal (x'de `

Depuis les lettres indiquant des tailles soyez toutes d'unité distinct des lettres indiquant des formats de rendement, vous ne devez pas vous rappeler si la taille ou le format d'unité vient d'abord; l'un ou l'autre travaux d'ordre. Les caractéristiques de rendement ` 4xw ' et ` 4wx ' moyen exactement la même chose. (cependant, le compte n doit venir d'abord; ` wx4 ' ne travaille pas.)

Quoique la taille d'unité u est ignoré pour les formats s de ` et i'de `vous pourriez immobile vouloir employer un compte npar exemple, Ã­'de ` indique que vous voulez voir trois instructions de machine, y compris tous les opérandes. La commande démontez donne une manière alternative d'inspecter des instructions de machine; voir la source et le code machine .

Tous les défauts pour les arguments à X sont conçus pour le rendre facile de continuer la mémoire de balayage avec des caractéristiques minimales chaque fois que vous employez X. Par exemple, après vous ont inspecté trois instructions de machine avec ` x/Ã­ addr'vous pouvez inspecter les sept prochains avec juste ` x/7'. Si vous employez Retour pour répéter X commande, le compte de répétition n est employé encore; les autres arguments se transfèrent quant aux usages successifs de X.

Les adresses et le contenu ont imprimé par X la commande ne sont pas sauvées dans l'histoire de valeur parce qu'il y a souvent trop d'elles et elles obtiendraient de la manière. Au lieu de cela, GDB rend ces valeurs disponibles pour l'usage suivant dans les expressions comme valeurs des variables de convenance $ _ et $ _ _. Après X la commande, la dernière adresse examinée est disponible pour l'usage dans les expressions dans la variable de convenance $ _. Le contenu de cette adresse, comme examiné, est disponible dans la variable de convenance $ _ _.

Si X la commande a un compte de répétition, l'adresse et le contenu sauvé est à partir de la dernière unité de mémoire imprimée; ce n'est pas identique que la dernière adresse a imprimé si plusieurs unités étaient imprimées sur la dernière ligne du rendement.

8,6 Affichage automatique

Si vous constatez que vous voulez imprimer la valeur d'une expression fréquemment (pour voir comment elle change), vous pourriez vouloir l'ajouter à la liste automatique d'affichage de sorte que GDB imprime sa valeur chaque fois vos arrêts de programme. Chaque expression s'est ajoutée à la liste est donnée un nombre pour l'identifier; pour enlever une expression de la liste, vous indiquez que nombre. L'affichage automatique ressemble à ceci:

Â

2: foo = 38 3: bar[5 ] = (entaille de struct *) 0x3804

Cet affichage montre des nombres d'article, des expressions et leurs valeurs courantes. Comme avec des affichages vous demandez manuellement en utilisant X ou copievous pouvez indiquer le format de rendement que vous préférez; en fait, affichage décide si employer copie ou X selon la façon dont raffiné votre format

les spécifications sont -- lui des utilisations X si vous indiquez une taille d'unité, ou un des deux formats (i'de ` et s de `qui sont seulement soutenus près Xautrement il utilisations copie.

affichage expr

Ajoutez l'expression expr à la liste d'expressions à montrer chaque fois que votre programme s'arrête. Voir les expressions de section .

affichage ne répète pas si vous serrez Retour encore après l'avoir employé.

affichage/fmt expr

Pour fmt en indiquant seulement un format d'affichage et pas une taille ou un compte, ajoutez l'expression expr au automobile-montrez la liste mais chargez-vous de la montrer chaque fois dans le format indiqué fmt. Voir la section produire des formats .

montrez/fmt addr

Pour fmt i'de ` ou s de `ou en incluant une unité-taille ou un certain nombre d'unités, ajoutez l'expression addr comme une adresse de mémoire à examiner chaque fois votre programme s'arrête. Examiner signifie en effet faire ` X/fmt addr'. Voir la mémoire d'examiner de section .

Par exemple, ` display/i $$pc ' peut être utile, pour voir l'instruction de machine d'être exécuté environ chaque fois que l'exécution s'arrête (`$pc ' est un nom commun pour le compteur de programme; voir les registres de section ).

undisplay dnums...

affichage d'effacement dnums...

Enlevez les nombres d'article dnums de la liste d'expressions à montrer.

undisplay ne répète pas si vous serrez Retour après l'avoir employé. (autrement vous obtiendriez juste l'erreur ` aucun nombre d'affichage ... ')

neutralisez l'affichage dnums...

Neutralisez l'affichage des nombres d'article dnums. Un article handicapé d'affichage n'est pas imprimé automatiquement, mais n'est pas oublié. Il peut être permis encore plus tard.

permettez l'affichage dnums...

Permettez l'affichage des nombres d'article dnums. Il devient efficace de nouveau dans l'affichage automatique de son expression, jusqu'à ce que vous indiquiez autrement.

affichage

Montrez les valeurs courantes des expressions sur la liste, juste comme est fait quand votre programme s'arrête.

affichage d'information

Imprimez la liste d'expressions installent précédemment pour montrer automatiquement, chacun avec son nombre d'article, mais sans montrer les valeurs. Ceci inclut les expressions handicapées, qui sont marquées en tant que tels. Il inclut également les expressions qui ne seraient pas montrées en ce moment parce qu'elles se rapportent à des variables automatiques non actuellement disponibles.

Si une expression d'affichage se rapporte à des variables locales, alors elle ne se comprend pas en dehors du contexte lexicologique pour lequel il a été installé. Une telle expression est handicapée quand l'exécution entre un contexte où un de ses variables n'est pas défini. Par exemple, si vous donnez l'instruction affichage last_char tandis qu'à l'intérieur d'une fonction avec un argument last_charGDB montre cet argument tandis que votre programme continue à arrêter l'intérieur qui fonctionnent. Quand il s'arrête ailleurs -- où il n'y a aucune variable last_charl'affichage de ---the est neutralisé automatiquement. La prochaine fois que votre programme arrête où last_char est signicatif, vous pouvez permettre l'expression d'affichage de nouveau.

8,7 Arrangements d'impression

GDB fournit les manières suivantes de commander comment des rangées, les structures, et les symboles sont imprimés.

Ces arrangements sont utiles pour mettre des programmes au point en n'importe quelle langue:

adresse réglée d'impression

adresse réglée d'impression dessus

GDB imprime des adresses de mémoire montrant l'endroit des traces de pile, valeurs de structure, valeurs d'indicateur, breaks, et ainsi de suite, même lorsqu'il montre également les teneurs de ces adresses. Le défaut est sur. Par exemple, est c'à ce qu'un affichage d'armature de pile ressemble avec adresse réglée d'impression dessus

(gdb) set_quotes de f #0 (">>") de lq=0x34c78 "<<", rq=0x34c88 à input.c:530 530 si (lquote! = def_lquote)

adresse réglée d'impression au loin

N'imprimez pas les adresses en montrant leur contenu. Par exemple, c'est la même armature de pile montrée avec adresse réglée d'impression au loin

(gdb) placez l'addr d'impression outre (gdb) des set_quotes de f #0 (lq="<< ", =">>") de rq à input.c:530 530 si (lquote! = def_lquote)

Vous pouvez employer adresse réglée d'impression de ` outre de ' pour éliminer tous les affichages de personne à charge de machine du GDB connectez. Par exemple, avec adresse d'impression au loinvous devriez obtenir le même texte pour des backtraces sur toutes les machines -- s'ils impliquent des arguments d'indicateur.

montrez l'adresse d'impression

Montrez si des adresses doivent être imprimées.

Quand GDB imprime une adresse symbolique, il imprime normalement le symbole plus tôt le plus étroit plus un excentrage. Si ce symbole n'identifie pas uniquement l'adresse (par exemple, c'est un nom dont la portée est un fichier source simple), vous pouvez devoir clarifier. L'one-way pour faire ceci est avec ligne d'informationpar exemple ligne d'information de ` * 0x4537'. Alternativement, vous pouvez placer GDB pour imprimer le nombre de fichier source et de ligne quand il imprime une adresse symbolique:

symbole-nom de fichier réglé d'impression dessus

Dites GDB d'imprimer le nom de fichier de source et le nombre de ligne d'un symbole sous la forme symbolique d'une adresse.

placez le symbole-nom de fichier d'impression au loin

N'imprimez pas le nom de fichier de source et le nombre de ligne d'un symbole. C'est le défaut.

montrez le symbole-nom de fichier d'impression

Montrez si GDB imprimera le nom de fichier de source et le nombre de ligne d'un symbole sous la forme symbolique d'une adresse.

Une autre situation où il est utile de montrer des noms de fichier de symbole et des nombres de ligne est en démontant le code; GDB vous montre le fichier source de nombre et de ligne qui correspond à chaque instruction.

En outre, vous pouvez souhaiter voir la forme symbolique seulement si l'adresse étant imprimée est raisonnablement près du symbole plus tôt le plus étroit:

la copie réglée maximum-symbolique-a excentré maximum-excentrez

Dites GDB de montrer seulement la forme symbolique d'une adresse si l'excentrage entre le symbole plus tôt le plus étroit et l'adresse est moins que maximum-excentrez. Le défaut est 0, qui indique GDB imprimer toujours la forme symbolique d'une adresse si n'importe quel symbole la précède.

montrez que la copie maximum-symbolique-a excentré

Demandez comment grand l'excentrage de maximum est que GDB imprime dans une adresse symbolique.

Si vous avez un indicateur et vous n'êtes pas sûr où il se dirige, essayez symbole-nom de fichier réglé d'impression de ` sur '. Alors vous pouvez déterminer l'endroit de fichier source de nom et de la variable où il se dirige, en utilisant ` p/a indicateur'. Ceci interprète l'adresse en forme symbolique. Par exemple, ici GDB montre à cela une variable PTTS points à une autre variable tdéfini dans le ` hi2.c ':

Â

(gdb) placez le symbole-nom de fichier d'impression sur (gdb) les PTTS $4 de p/a = 0xe008 < t dans hi2.c >

Avertissement: Pour les indicateurs qui se dirigent à une variable locale, ` p/a ' ne montre pas le nom de symbole et le nom de fichier du referent, même avec l'approprié copie réglée options allumées.

D'autres arrangements commandent comment différents genres d'objets sont imprimés:

rangée réglée d'impression

rangée réglée d'impression dessus

Jolies rangées d'impression. Il est plus commode lire ce format, mais des utilisations plus d'espace. Le défaut est éteint.

rangée réglée d'impression au loin

Revenez au format comprimé pour des rangées.

montrez la rangée d'impression

Montrez si le format comprimé ou joli est choisi pour montrer des rangées.

placez les éléments d'impression nombre-de-éléments

Fixez une limite sur combien d'éléments d'une rangée GDB imprimera. Si GDB imprime une grande rangée, il cesse d'imprimer après qu'il ait imprimé le nombre d'ensemble d'éléments par éléments réglés d'impression commande. Cette limite s'applique également à l'affichage des cordes. Quand GDB commence, cette limite est fixée à 200. Arrangement nombre-de-éléments aux moyens zéro que l'impression est illimitée.

montrez les éléments d'impression

Montrez le nombre d'éléments d'une grande rangée que GDB imprimera. Si le nombre est 0, alors l'impression est illimitée.

la copie réglée nul-s'arrêtent

Faites cesser GDB d'imprimer les caractères d'une rangée quand la première NULLE est produite. C'est utile quand les grandes rangées contiennent réellement seulement les cordes executees. Le défaut est éteint.

copie réglée assez dessus

Faites imprimer GDB des structures dans un format dentelé avec un membre par la ligne, comme ceci:

$1 = { après = 0x0, drapeaux = { le bonbon = 1, acidifient = 1 }, viande = 0x54 "porc" }

placez la copie jolie au loin

Faites imprimer GDB des structures dans un format compact, comme ceci:

$1 = { après = 0x0, drapeaux = { le bonbon = 1, acidifient = 1 }, \ viande = 0x54 "porc" }

C'est le format de défaut.

montrez la copie jolie

Montrez quel format GDB emploie pour imprimer des structures.

placez les sevenbit-cordes d'impression dessus

Imprimez en utilisant seulement des caractères de sept-peu; si cette option est placée, GDB montre tous les caractères de huit bits (en cordes ou valeurs de caractère) employant la notation \nnn. Cet arrangement est le meilleur si vous travaillent en anglais (ASCII) et vous employez le peu d'ordre élevé des caractères comme peu de marqueur ou de "méta".

sevenbit-cordes réglées d'impression au loin

Pleins caractères de huit bits d'impression. Ceci permet l'utilisation des jeux de caractères plus internationaux, et est le défaut.

montrez les sevenbit-cordes d'impression

Montrez si GDB imprime seulement des caractères de sept-peu.

placez l'union d'impression dessus

Dites GDB d'imprimer des syndicats ce qui sont contenus en structures. C'est l'arrangement de défaut.

union réglée d'impression au loin

Dites GDB de ne pas imprimer des syndicats ce qui sont contenus en structures.

montrez l'union d'impression

Demandez GDB s'il imprimera des syndicats ce qui sont contenus en structures.

Par exemple, donné les déclarations

espèce d'enum de typedef { arbre, bogue }; enum de typedef { Big_tree, gland, jeune plante } Tree_forms; enum de typedef { tracteur à chenilles, cocon, papillon } Bug_forms; chose de struct { espèce il; union { arbre de Tree_forms; Bogue de Bug_forms; } forme; }; foo de chose de struct = { arbre, { gland } };

avec union réglée d'impression dessus en effet foo du ` p ' imprimerait

$1 = { il = arbre, forme = { arbre = gland, bogue = cocon } }

et avec union réglée d'impression au loin en effet elle imprimerait

$1 = { il = arbre, forme = {... } }

Ces arrangements sont d'intérêt quand la correction C ++ programme:

demangle réglé d'impression

demangle réglé d'impression dessus

Noms de l'impression C ++ sous leur forme source plutôt que sous ("mangled") la forme codée passée à l'assembleur et à l'éditeur de liens pour la tringlerie type-sûre. Le défaut est allumé.

montrez le demangle d'impression

Montrez si des noms de C ++ sont imprimés dedans mangled ou demangled la forme.

placez ASM-demangle d'impression

placez ASM-demangle d'impression dessus

Les noms de l'impression C ++ dans leur source forment plutôt que leur mangled la forme, même dans la liste imprimée de code assembleur telle que des démontages d'instruction. Le défaut est éteint.

montrez ASM-demangle d'impression

Montrez si des noms de C ++ dans des impressions d'assemblage sont imprimés dedans mangled ou demangled la forme.

placez le demangle-modèle modèle

Choisissez parmi plusieurs les arrangements de codage employés par différents compilateurs pour représenter des noms de C ++. Les choix pour modèle soyez actuellement:

automobile

Permettez à GDB de choisir un modèle de décodage en inspectant votre programme.

gnu

Décodez basé sur le compilateur de GNU C ++ (g++algorithme de codage. C'est le défaut.

HP

Décodez basé sur la norme ANSI C ++ de HP (aCCalgorithme de codage.

lucide

Décodez basé sur le compilateur lucide de C ++ (lccalgorithme de codage.

bras

Décodez en utilisant l'algorithme dans le manuel de référence annoté par ++ de C . Avertissement: il n'est pas suffisant laisser cet seul arrangement la correction cfront- executables produits. GDB exigerait davantage de de perfectionnement de permettre cela.

Si vous omettez modèlevous verrez une liste de formats possibles.

montrez le demangle-modèle

Montrez le modèle de codage actuellement en service pour décoder des symboles de C ++.

placez l'objet d'impression

placez l'objet d'impression dessus

En montrant un indicateur à un objet, identifiez le type (dérivé) réel de l'objet plutôt que le type avoué, en utilisant la table virtuelle de fonction.

placez l'objet d'impression au loin

Montrez seulement le type avoué d'objets, sans référence à la table virtuelle de fonction. C'est l'arrangement de défaut.

montrez l'objet d'impression

Montrez si réels, ou avoué, des types d'objet sont montrés.

placez les statique-membres d'impression

placez les statique-membres d'impression dessus

Imprimez les membres statiques en montrant un objet de C ++. Le défaut est allumé.

statique-membres réglés d'impression au loin

N'imprimez pas les membres statiques en montrant un objet de C ++.

montrez les statique-membres d'impression

Montrez si C ++ les membres statiques sont imprimés, ou pas.

placez le vtbl d'impression

placez le vtbl d'impression dessus

Jolies tables virtuelles de fonction de l'impression C ++. Le défaut est éteint. ( vtbl les commandes ne travaillent pas sur des programmes compilés avec le compilateur de la norme ANSI C ++ de HP (aCC

vtbl réglé d'impression au loin

N'imprimez pas assez les tables virtuelles de fonction de C ++.

montrez le vtbl d'impression

Montrez si C ++ les tables virtuelles de fonction sont assez imprimés, ou pas.

8,8 histoire de valeur

Valeurs imprimées par copie la commande sont sauvées dans l'histoire de valeur de GDB . Ceci vous permet de vous référer à eux dans d'autres expressions. Des valeurs sont gardées jusqu'à ce que la table de symbole soit relue ou jetée (par exemple avec dossier ou symbole-dossier commandes). Quand la table de symbole change, l'histoire de valeur est jetée, puisque les valeurs peuvent contenir des indicateurs de nouveau aux types définis dans la table de symbole.

Les valeurs imprimées sont indiquées les nombres d'histoire par lesquels vous pouvez vous référer à eux. Ce sont des nombres entiers successifs commençant par un. copie expositions vous le nombre d'histoire assigné à une valeur par l'impression ` $numérique = ' avant la valeur; ici numérique est le nombre d'histoire.

Pour se rapporter à n'importe quelle valeur précédente, employez ` $ ' suivi du nombre de l'histoire de la valeur. La manière copie marque son rendement est conçu pour vous rappeler ceci. Juste $ se rapporte à la valeur la plus récente dans l'histoire, et $$ se rapporte à la valeur avant cela. $$n se rapporte au nteneur en Th de l'extrémité; $$2 est la valeur juste avant $$ $$1 est équivalent à $$et $$0 est équivalent à $.

Par exemple, supposez que vous avez juste imprimé un indicateur à une structure et voulez voir le contenu de la structure. Elle suffit pour tapezr

Â

p * $

Si vous avez une chaîne des structures où le composant après des points à les prochains, vous pouvez imprimer le contenu de le prochain avec ceci:

Â

p * $.next

Vous pouvez imprimer des liens successifs dans la chaîne en répétant cette commande -- que vous pouvez faire en tapant juste Retour.

Notez que les valeurs d'enregistrements historiques, pas expressions. Si la valeur de X est 4 et vous tapez ces commandes:

Â

copie X x=5 réglé

puis la valeur enregistrée dans l'histoire de valeur par copie la commande demeure 4 quoique la valeur de X a changé.

montrez les valeurs

Imprimez les dix dernières valeurs dans l'histoire de valeur, avec leurs nombres d'article. C'est comme ` p $$9 ' répété dix fois, sauf que montrez les valeurs ne change pas l'histoire.

montrez les valeurs n

Imprimez dix valeurs d'histoire centrées sur le nombre d'article d'histoire n.

montrez les valeurs +

Imprimez dix valeurs d'histoire juste aprés les valeurs pour la dernière fois imprimées. Si plus de valeurs ne sont disponibles, montrez les valeurs + ne produit aucun affichage.

Pression Retour pour répéter montrez les valeurs n a exactement le même effet As valeurs d'exposition de ` + '.

8,9 Variables de convenance

GDB fournit les variables de convenance que vous pouvez employer dans GDB pour vous tenir dessus sur une valeur et pour se rapporter à elle plus tard. Ces variables existent entièrement dans GDB; elles ne sont pas une partie de votre programme, et le réglage d'une variable de convenance n'a aucun effet direct sur davantage d'exécution de votre programme. C'est pourquoi vous pouvez les employer librement.

Des variables de convenance sont mises en tête avec ` $ '. Tout nom précédé près ` $ ' peut être employé pour une variable de convenance, à moins qu'elle soit un des noms de registre propres à une machine prédéfinis (voir les registres de section ). (les références d'histoire de valeur, en revanche, sont des nombres précédés près ` $ '. Voir la section évaluer l'histoire .)

Vous pouvez sauver une valeur dans une variable de convenance avec une expression de tÃ¢che, juste comme vous placeriez une variable dans votre programme. Par exemple:

Â

ensemble $$foo = * object_ptr

économiserait dedans $$foo la valeur contenue dans l'objet s'est dirigée à près object_ptr.

Employer une variable de convenance la crée pour la première fois, mais sa valeur est vide jusqu'à ce que vous assigniez un nouveau évaluez. Vous pouvez changer la valeur avec une autre tÃ¢che à tout moment.

Les variables de convenance n'ont aucun type fixe. Vous pouvez assigner à une variable de convenance n'importe quel type de valeur, y compris des structures et des rangées, même si cette variable a déjà une valeur d'un type différent. La variable de convenance, une fois utilisée comme expression, a le type de sa valeur courante.

montrez la convenance

Imprimez des variables d'une liste de convenance utilisées jusqu'ici, et leurs valeurs. Abrégé montrez le conv.

Un des manières d'employer une variable de convenance est comme a

trace (de gdb ) * 0x2117c4 // adresse

Vous pouvez abréger trace As TR.

La variable de convenance $$tpnum enregistre le nombre de tracepoint du tracepoint le plus récemment réglé.

tracepoint d'effacement [numérique]

Supprimez de manière permanente un ou plusieurs tracepoints. Sans l'argument, le défaut doit supprimer tous les tracepoints.

Exemples:

la trace 1 d'effacement (de gdb) 2 3 // enlèvent la trace d'effacement de trois tracepoints ( gdb) // enlèvent tous les tracepoints

Vous pouvez abréger cette commande As del tr.

10,1,2 Permettez et neutralisez Tracepoints

neutralisez le tracepoint [numérique]

Neutralisez le tracepoint numériqueou tous les tracepoints si aucun argument numérique est donné. Un tracepoint handicapé n'aura aucun effet pendant la prochaine expérience de trace, mais on ne l'oublie pas. Vous pouvez permettre à nouveau à employer handicapé de tracepoint permettez le tracepoint commande.

permettez le tracepoint [numérique]

Permettez le tracepoint numériqueou tous les tracepoints. Les tracepoints permis deviendront efficaces la prochaine fois qu'une expérience de trace est rune.

10,1,3 Tracepoint Passcounts

passcount [n [numérique] ]

Placez le passcount d'un tracepoint. Le passcount est une manière d'arrêter automatiquement une expérience de trace. Si un passcount des tracepoint est nalors l'expérience de trace sera automatiquement arrêtée sur n'temps de Th que le tracepoint est frappé. Si le nombre de tracepoint numérique n'est pas indiqué, passcount jeux de commandes le passcount du tracepoint le plus récemment défini. Si aucun passcount n'est donné, l'expérience de trace fonctionnera jusqu'à arrêté explicitement par l'utilisateur.

Exemples:

le passcount 5 ( de gdb) 2 // arrêt sur 5ème de d'exécution ///passcount 12 du tracepoint 2 (gdb )/arrêt sur la 12ème exécution du // le plus récemment a défini le tracepoint. passage 1//de baz de trace du passage 2 de barre de trace du passage 3 de foo de trace ( de gdb) ( gdb) (gdb) (gdb ) (gdb ) ( gdb) traçage d'arrêt quand le foo a été // exécuté 3 fois OU quand la barre// a été exécutée 2/de périodes/OU quand le baz a été exécuté 1 fois.

10,1,4 Listes D'Action De Tracepoint

actions [numérique]

Cette commande incitera pour une liste d'actions à être prise quand le tracepoint est frappé. Si le nombre de tracepoint numérique n'est pas indiqué, des jeux de ces commandes les actions pour celle qui le plus récemment ont été définies (de sorte que vous puissiez définir un tracepoint et puis dire actions sans tracasser au sujet de son nombre). Vous indiquez les actions elles-mêmes sur les lignes suivantes, une action à la fois, et terminez les actions énumérez avec une ligne contenant juste extrémité. Jusqu'ici, les seules actions définies sont rassemblez et tandis que-progression.

Pour enlever toutes les actions d'un tracepoint, tapez actions de ` numérique' et suivez-l'immédiatement avec extrémité de ` '.

(gdb) rassemblez les données // rassemblez l'tandis que-progression 5 // de quelques données ( gdb) 5 périodes en pas à pas, rassemblent l'extrémité de données (gdb ) // signaux l'fin des actions.

Dans l'exemple suivant, la liste d'action commence par rassemblez commandes indiquant les choses à rassembler quand le tracepoint est frappé. Puis, en pas à pas et rassemblez les données additionnelles suivant le tracepoint, a tandis que-progression la commande est employée, suivi de la liste de choses à rassembler tout en faisant un pas. tandis que-progression la commande est terminée par son propre séparé extrémité commande. Pour finir, la liste d'action est terminée par extrémité commande.

les actions de foo de trace (de gdb ) (gdb ) écrivent des actions pour le tracepoint 1, un par la ligne: > rassemblez la barre, baz > se rassemblent $$regs > l'tandis que-progression 12 > se rassemblent $$fp, $$sp > extrémité d'extrémité

rassemblez expr1 expr2...

Rassemblez les valeurs des expressions données quand le tracepoint est frappé. Cette commande accepte une liste virgule-séparée de toutes les expressions valides. En plus de global, des variables statiques et ou locales, les arguments spéciaux suivants sont soutenues:

$$regs

rassemblez tous les registres

$$args

rassemblez tous les arguments de fonction

$$locals

rassemblez toutes les variables locales.

Vous pouvez donner plusieurs consécutifs rassemblez commandes, chacune avec un argument simple, ou une rassemblez commandez avec plusieurs arguments séparés par des virgules: l'effet est identique.

La commande portée d'information (voir la portée d'information de section ) est particulièrement utile pour figurer hors de quelles données à rassembler.

tandis que-progression n

Exécutez n traces en pas à pas après le tracepoint, rassemblant de nouvelles données à chaque step. tandis que-progression la commande est suivie de la liste de quoi se rassembler tout en faisant un pas (suivi de ses propres extrémité commande):

> l'tandis que-progression 12 > se rassemblent $$regs, myglobal > extrémité >

Vous pouvez abréger tandis que-progression As W ou progression.

10,1,5 Liste Tracepoints

tracepoints d'information [numérique]

Informations d'affichage sur le tracepoint numérique. Si vous n'indiquez pas un nombre de tracepoint, des informations d'affichages sur tous les tracepoints définis jusqu'ici. Pour chaque tracepoint, l'information suivante est montrée:

son nombre

s'il est permis ou neutralisé

son adresse

son passcount comme donné par passcount n commande

son compte d'step comme donné par tandis que-progression n commande

là où dans les fichiers source est l'ensemble de tracepoint

son liste d'action comme donnée par actions commande

(gdb) adresse numérique PassC StepC d'Enb de trace d'information ce qui 1 y 0x002117c4 0 0 < gdb_asm > 2 y 0x0020dc64 0 0 dans g_test à g_test.c:1375 3 y 0x0020b1f4 0 0 dans le get_data à../foo.c:41 (gdb)

Cette commande peut être abrégée information tp.

10,1,6 Commençant et arrêt de l'expérience de trace

tstart

Cette commande ne prend aucun argument. Elle commence l'expérience de trace, et commence à rassembler des données. Ceci a l'effet secondaire de jeter toutes les données rassemblées dans l'amortisseur de trace pendant l'expérience précédente de trace.

tstop

Cette commande ne prend aucun argument. Elle finit l'expérience de trace, et cesse de rassembler des données.

Note: une collecte d'expérience et de données de trace peut s'arrêter automatiquement si le passcount des tracepoint est atteint (voir la section 10,1,3 Tracepoint Passcounts ), ou si l'amortisseur de trace devient complètement.

tstatus

Cette commande montre le statut de la collecte de données courante de trace.

Voici un exemple des commandes que nous avons décrites jusqu'ici:

Â

les actions gdb_c_test de trace (de gdb ) (gdb ) écrivent des actions pour le tracepoint # 1, un par la ligne. > rassemblez $$regs, $locals, $args > l'tandis que-progression 11 > se rassemblent $$regs > extrémité > tstart d'extrémité (gdb ) [ le temps passe... ] (tstop de gdb )

10,2 Employer les données rassemblées

Après les extrémités d'expérience de tracepoint, vous employez des commandes de GDB pour examiner les données de trace. L'idée fondamentale est que chaque tracepoint rassemble un instantané de trace chaque fois qu'il est frappé et un autre instantané chaque fois il des simple-steps. Tous ces instantanés sont consécutivement numérotés de zéro et entrent dans un amortisseur, et vous pouvez les examiner plus tard. La manière que vous les examinez est de se concentrer sur un instantané spécifique de trace. Quand le moignon à distance est concentré sur un instantané de trace, il répondra à toutes les demandes de GDB de mémoire et des registres par la lecture de l'amortisseur qui appartient à cet instantané, plutôt que de la vraie mémoire ou des registres du programme étant corrigé. Ceci signifie que tout le GDB commande (copie registres d'information backtraceetc...) se comportera comme si nous corrigions actuellement l'état de programme car il était quand le tracepoint s'est produit. Toutes les demandes des données qui ne sont pas dans l'amortisseur échoueront.

10,2,1 tfind n Comment choisir un instantané 10,2,2 de trace tdump Comment montrer toutes les données pour un instantané 10,2,3 sauvez-tracepoints nom de fichier Comment sauver des tracepoints pour une course de futur

10,2,1 tfind n

La commande de base pour choisir un instantané de trace à partir de l'amortisseur est tfind nqui trouve le nombre d'instantané de trace ncomptant de zéro. Si aucun argument n est donné, le prochain instantané est choisi.

Voici les diverses formes d'employer tfind commande.

début de tfind

Trouvez le premier instantané dans l'amortisseur. C'est a

synonyme pour tfind 0 (puisque 0 est le nombre du premier instantané).

tfind aucun

Cessez de corriger des instantanés de trace, correction de phase de résumé.

extrémité de tfind

Mêmes que tfind de ` aucun '.

tfind

Moyen d'argument ne trouve pas le prochain instantané de trace.

tfind -

Trouvez l'instantané précédent de trace avant le courant. Ceci laisse retracing des steps plus tôt.

tracepoint de tfind numérique

Trouvez le prochain instantané lié au tracepoint numérique. Montant de recherche en avant du dernier instantané examiné de trace. Si aucun argument numérique est donné, il signifie que trouvaille que le prochain instantané s'est rassemblée pour le même tracepoint que l'instantané courant.

PC de tfind addr

Trouvez le prochain instantané lié à la valeur addr du compteur de programme. Montant de recherche en avant du dernier instantané examiné de trace. Si aucun argument addr est donné, il signifie la trouvaille le prochain instantané avec la même valeur du PC que l'instantané courant.

tfind dehors addr1 addr2

Trouvez le prochain instantané dont le PC est extérieur la gamme donnée des adresses.

gamme de tfind addr1 addr2

Trouvez le prochain instantané dont le PC est entre addr1 et addr2.

ligne de tfind [dossier]n

Trouvez le prochain instantané lié à la ligne de source n. Si l'argument facultatif dossier est donné, se rapporte à la ligne n dans ce fichier source. Montant de recherche en avant du dernier instantané examiné de trace. Si aucun argument n est donné, il signifie la trouvaille la prochaine ligne autre que celle actuellement étant examinée; de ce fait disant ligne de tfind à plusieurs reprises peut sembler avoir le même effet que faisant un pas d'entre phases en session de phase de correction.

Les arguments de défaut pour tfind des commandes sont spécifiquement conçues de le rendre facile à balayer par l'amortisseur de trace. Par exemple, tfind sans l'argument choisit le prochain instantané de trace, et tfind - sans l'argument choisit l'instantané précédent de trace. Ainsi, en donnant un tfind commande, et puis frapper simplement Retour à plusieurs reprises vous pouvez examiner tous les instantanés de trace dans l'ordre. Ou, en disant tfind - et alors frappant Retour à plusieurs reprises vous pouvez examiner les instantanés à l'envers l'ordre. ligne de tfind la commande sans l'argument choisit l'instantané pour la prochaine ligne de source exécutée. PC de tfind la commande sans l'argument choisit le prochain instantané avec le même compteur de programme (PC) que l'armature courante. tracepoint de tfind la commande sans l'argument choisit le prochain instantané de trace rassemblé par le même tracepoint que le courant.

En plus de vous laisser balayer par l'amortisseur de trace manuellement, ces commandes le rendent facile de construire les manuscrits de GDB hors dont balayez par l'amortisseur de trace et imprimez celui qui ait rassemblé des données que vous êtes intéressé dedans. Ainsi, si nous voulons examiner les registres de PC, de point de gel, et de PS de chaque armature de trace dans l'amortisseur, nous pouvons dire ceci:

Â

début de tfind ( de gdb) (gdb) tandis que ($$trace_frame! = -1) >, du printf "vue %d, PC = %08X, PS = %08X, point de gel = %08X\n" \ $$trace_frame, $$pc, $$sp, $$fp > vue 0, PC = 0020DC64, PS = 0030BF3C, point de gel = 0030BF44 vue 1, PC = 0020DC6C, PS = 0030BF38, point de gel = 0030BF44 vue 2, PC = 0020DC70, PS = 0030BF34, point de gel = 0030BF44 vue 3, PC = 0020DC74, PS = 0030BF30, point de gel = 0030BF44 vue 4, PC = 0020DC78, PS = 0030BF2C, point de gel = 0030BF44 de tfind > d'extrémité Armature 5, PC = 0020DC7C, PS = 0030BF28, Point de gel = 0030BF44 Armature 6, PC = 0020DC80, PS = 0030BF24, Point de gel = 0030BF44 Armature 7, PC = 0020DC84, PS = 0030BF20, Point de gel = 0030BF44 Armature 8, PC = 0020DC88, PS = 0030BFÃ‡, Point de gel = 0030BF44 Armature 9, PC = 0020DC8E, PS = 0030BF18, Point de gel = 0030BF44 Armature 10, PC = 00203F6C, PS = 0030BE3C, Point de gel = 0030BF14

Ou, si nous voulons examiner la variable X à chaque ligne de source dans l'amortisseur:

Â

début de tfind ( de gdb) (gdb) tandis que ($$trace_frame! = -1) > printf "vue %d, == %d\n de X", $$trace_frame, X > ligne de tfind > vue d'extrémité 0, X = 1 vue 7, X = 2 vue 13, X = 255

10,2,2 tdump

Cette commande ne prend aucun argument. Elle imprime toutes les données rassemblées à l'instantané courant de trace.

Â

les actions de la trace 444 (de gdb ) (gdb ) écrivent des actions pour le tracepoint # 2, un par la ligne: > rassemblez $$regs, $$locals, $$args, gdb_long_test > la ligne 444 #0 de tfind de tstart d'extrémité (gdb ) (gdb ) gdb_test (p1=0x11, p2=0x22, p3=0x33, p4=0x44, p5=0x55, p6=0x66) gdb_test.c:444 444 au printp("%s: les arguments = le 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X\n") des données de tdump ( de gdb ) se sont rassemblés au tracepoint 2, l'armature 1 de trace: } fpiaddr 0x0 0 du fpstatus 0x0 0 du fpcontrol 0x0 0 du PC 0x20b2c8 0x20b2c8 de PS 0x30bf34 0x30bf34 picoseconde 0x0 0 du point de gel 0x30bf3c 0x30bf3c de 0xcÃ¢a0085 -995491707 d1 0x18 24 d2 0x80 128 d3 0x33 51 d4 0x71aea3d 119204413 d5 0x22 34 d6 0xe0 224 d7 0x380035 3670069 a0 0x19e2Ã¢ 1696330 a1 0x3000668 50333288 a2 0x100 256 a3 0x322000 3284992 a4 0x3000698 50333336 a5 0x1ad3cc 1758156 p = 0x20e5b4 "gdb-essai" p1 = (vide *) 0x11 p2 = (vide *) 0x22 p3 = (vide *) 0x33 p4 = (vide *) 0x44 p5 = (vide *) 0x55 p6 = (vide *) 0x66 les = 17 '\021 'gdb_long_test (gdb)

10,2,3 sauvez-tracepoints nom de fichier

Cette commande sauve toutes les définitions courantes de tracepoint ainsi que leurs actions et passcounts, dans un ` de dossiernom de fichier' approprié pour l'usage en session postérieure de correction. Pour lire les définitions sauvées de tracepoint, employez source commande (voir les fichiers de commande de la section 20,3 ).

10,3 Variables de convenance pour Tracepoints

(interne) $$trace_frame

Le nombre courant d'instantané de trace ( armature d'a.k.a.), ou -1 si aucun instantané n'est choisi.

(interne) $$tracepoint

Le tracepoint pour l'instantané courant de trace.

(interne) $$trace_line

Le nombre de ligne pour l'instantané courant de trace.

(char [ ]) $$trace_file

Le fichier source pour l'instantané courant de trace.

(char [ ]) $$trace_func

Le nom de contenir de fonction $$tracepoint.

Note: $$trace_file n'est pas approprié pour l'usage dedans printfutilisation rendement au lieu de cela.

Voici un exemple simple d'employer ces variables de convenance pour faire un pas par tous les instantanés de trace et imprimer certaines de leurs données.

Â

début de tfind ( de gdb) (gdb) tandis que $$trace_frame! = -1 > produisez $$trace_file > printf ", la ligne %d (tracepoint # %d)\n ", $$trace_line, $$tracepoint > tfind > extrémité

11. Programmes De Correction Qui Emploient Des Recouvrements

Si votre programme est trop grand pour s'adapter complètement dans votre mémoire système de cible, vous pouvez parfois employer des recouvrements pour travailler autour de ce problème. GDB fournit un certain appui pour les programmes de correction qui emploient des recouvrements.

11,1 Comment les recouvrements fonctionnent l'explication générale de A des recouvrements. 11,2 Commandes de recouvrement contrôlant des recouvrements dans GDB. 11,3 Le recouvrement automatique corrigeant GDB peut découvrir que des recouvrements sont tracé en demandant l'inférieur. 11,4 Recouvrez le programme d'échantillon du programme d'échantillon A en utilisant des recouvrements.

11,1 Comment Les Recouvrements Fonctionnent

Supposez que vous avez un ordinateur dont l'espace adresse d'instruction est seulement 64 kilo-octets longtemps, mais qui a beaucoup plus de mémoire qui peut être consultée par d'autres moyens: instructions spéciales, registres de segment, ou matériel de gestion de mémoire, par exemple. Supposez plus loin que vous voulez adapter un programme qui est plus grand que 64 kilo-octets à démarrer sur ce système.

Une solution est d'identifier les modules de votre programme qui sont relativement indépendants, et n'a pas besoin de s'appeler directement; appelez ces recouvrements de modules . Séparez les recouvrements du programme principal, et placez leur code machine dans la mémoire plus grande. Placez votre programme principal dans la mémoire d'instruction, mais laissez au moins assez d'espace là pour tenir le plus grand recouvrement aussi bien.

Maintenant, pour appeler une fonction située dans un recouvrement, vous devez d'abord copier que le code machine du recouvrement de la grande mémoire dans l'espace mis de côté pour lui dans la mémoire d'instruction, et puis sautez à son point d'entrée là.

Â

Espace adresse D'Espace adresse D'Espace adresse D'Instruction De Données Une Plus grande +-----------+ +-----------+ +-----------+ |||||| +-----------+ recouvrement 1 de +-----------+ +-----------+<-- |programme||principal|.|recouvrement 1|adresse de charge |variables||programme||+-----------+ |et tas|||||| +-----------+|||recouvrement 2 de +-----------+<-- ||+-----------+|||adresse +-----------+ de charge|||. -|recouvrement 2|||||||--->+-----------+ tracé||+-----------+ adresse|||||||recouvrement|< - '||||secteur|recouvrement 3 du <---'+-----------+<--||<||` de l'adresse +-----------+ de charge - -|recouvrement 3|||||+-----------+||+-----------+||+-----------+ un recouvrement de code

Le diagramme (voir le recouvrement de code de A ) montre un système avec les espaces adresses séparées de données et d'instruction. Pour tracer un recouvrement, le programme copie son code de l'espace adresse plus grande à l'espace adresse d'instruction. Puisque les recouvrements montrés ici toute l'utilisation la même adresse tracée, seulement une peuvent être tracés à la fois. Pour un système avec une espace adresse simple pour des données et des instructions, le diagramme serait semblable, sauf que les variables et le tas de programme partageraient une espace adresse avec le programme principal et le secteur de recouvrement.

Un recouvrement a chargé dans la mémoire d'instruction et de manière opérationnelle s'appelle un recouvrement tracé; sa adresse tracée est son adresse dans la mémoire d'instruction. Un recouvrement non actuel (ou

seulement partiellement le présent) dans la mémoire d'instruction s'appelle unmapped ; sa adresse de charge est son adresse dans la mémoire plus grande. L'adresse tracée s'appelle également l'adresse de mémoire virtuelle , ou le VMA ; l'adresse de charge s'appelle également l'adresse de mémoire de charge , ou le LMA .

Malheureusement, les recouvrements ne sont pas une manière complètement transparente d'adapter un programme à la mémoire limitée d'instruction. Ils présentent un nouvel ensemble de contraintes globales que vous devez maintenir dans l'esprit pendant que vous concevez votre programme:

Avant d'appeler ou retourner à une fonction dans un recouvrement, votre programme doit s'assurer que le recouvrement est tracé réellement. Autrement, l'appel ou le retour transférera la commande à la bonne adresse, mais dans le recouvrement faux, et votre programme se brisera probablement.

Si le processus de tracer un recouvrement est cher sur votre système, vous devrez choisir vos recouvrements soigneusement pour réduire au minimum leur effet sur l'exécution de votre programme.

Le dossier exécutable que vous chargez sur votre système doit contenir les instructions de chaque recouvrement, apparaissant à l'adresse de la charge du recouvrement, non sa adresse tracée. Cependant, les instructions de chaque recouvrement doivent être replacées et ses symboles être définies comme si le recouvrement étaient à sa adresse tracée. Vous pouvez employer des manuscrits d'éditeur de liens de GNU pour indiquer différentes adresses de charge et de relocalisation pour des morceaux de votre programme; voir la description de recouvrement de ` de section ' en employant le LD: l'éditeur de liens de GNU .

La procédure pour charger les dossiers exécutables sur votre système doit pouvoir charger leur contenu dans l'espace adresse plus grande aussi bien que les espaces d'instruction et de données.

Le système de recouvrement décrit ci-dessus est plutôt simple, et pourrait être amélioré de beaucoup de manières:

Si votre système a le commutateur approprié de banque s'enregistre ou matériel de gestion de mémoire, vous pourriez employer ces équipements pour faire le contenu de secteur de la charge d'un recouvrement simplement apparaître à leur adresse tracée dans l'espace d'instruction. Ce serait probablement plus rapide que copiant le recouvrement à son secteur tracé de la manière habituelle.

Si vos recouvrements sont assez petits, vous pourriez mettre de côté plus d'un secteur de recouvrement, et faites tracer plus d'un recouvrement à la fois.

Vous pouvez employer des recouvrements pour contrôler des données, aussi bien que des instructions. En général, les recouvrements de données sont même moins transparents à votre conception que des recouvrements de code: considérant que les recouvrements de code exigent seulement le soin quand vous appelez ou revenez aux fonctions, les recouvrements de données exigent le soin chaque fois vous accès les données. En outre, si vous changez le contenu d'un recouvrement de données, vous devez copier son contenu soutenez à sa adresse de charge avant que vous puissiez copier un recouvrement différent de données dans le même secteur tracé.

11,2 Commandes De Recouvrement

Pour employer l'appui du recouvrement de GDB, chaque recouvrement dans votre programme doit correspondre à une section séparée du dossier exécutable. L'adresse de la mémoire virtuelle de la section et l'adresse de mémoire de charge doivent être le recouvrement tracé et des adresses de charge. L'identification des recouvrements avec des sections permet à GDB de déterminer l'adresse appropriée d'une fonction ou variable, selon, que le recouvrement soit tracé ou pas.

Le recouvrement de GDB commande tout le début avec le mot recouvrementvous pouvez abréger ceci As OV ou ovly. Les commandes sont:

recouvrement au loin

Neutralisez l'appui du recouvrement de GDB. Quand l'appui de recouvrement est handicapé, GDB suppose que toutes les fonctions et variables sont toujours présentes à leurs adresses tracées. Par défaut, l'appui du recouvrement de GDB est handicapé.

manuel de recouvrement

Permettez la correction manuelle de recouvrement. En ce mode, GDB se fonde sur vous pour lui indiquer quels recouvrements sont tracés, et ce qui ne sont pas, employer carte-recouvrement de recouvrement et unmap-recouvrement de recouvrement commande décrit ci-dessous.

carte-recouvrement de recouvrement recouvrement

carte de recouvrement recouvrement

Dites à GDB cela recouvrement est maintenant tracé; recouvrement doit être le nom de la section de fichier d'exécution contenant le recouvrement. Quand un recouvrement est tracé, GDB suppose qu'il peut trouver les fonctions et les variables du recouvrement à leurs adresses tracées. GDB suppose que tous les autres recouvrements dont ont tracé des gammes recouvrent cela de recouvrement soyez unmapped maintenant.

recouvrez l'unmap-recouvrement recouvrement

unmap de recouvrement recouvrement

Dites à GDB cela recouvrement n'est plus tracé; recouvrement doit être le nom de la section de fichier d'exécution contenant le recouvrement. Quand un recouvrement est unmapped, GDB suppose qu'il peut trouver les fonctions et les variables du recouvrement à leurs adresses de charge.

automobile de recouvrement

Permettez la correction automatique de recouvrement. En ce mode, GDB consulte une structure de données que le directeur de recouvrement maintient dans l'inférieur pour voir quels recouvrements sont tracés. Pour des détails, voyez la correction automatique du recouvrement 11,3 .

recouvrez la charge-cible

recouvrez la charge

Relisez la table de recouvrement de l'inférieur. Normalement, GDB relit la table GDB automatiquement chaque fois que les arrêts inférieurs, ainsi cette commande devraient seulement être nécessaires si vous avez changé le recouvrement se traçant employant GDB. Cette commande est seulement utile en utilisant la correction automatique de recouvrement.

liste-recouvrements de recouvrement

liste de recouvrement

Montrez une liste des recouvrements actuellement tracés, avec leurs adresses tracées, adresses de charge, et tailles.

Normalement, quand GDB imprime une adresse, il inclut le nom de la fonction que l'adresse tombe dans:

Â

(gdb) imprimez la force $3 = { interne () } 0x11a0 < force >

Quand la correction de recouvrement est permise, GDB identifie le code unmapped dedans des recouvrements, et imprime les noms de unmapped des fonctions avec des astérisques autour d'eux. Par exemple, si foo est une fonction dans unmapped le recouvrement, GDB l'imprime de cette façon:

Â

la liste de recouvrement (de gdb) aucunes sections sont tracées. (gdb) imprimez le foo $5 = { interne (interne) } 0x100000 < * foo * >

Quand foole 'recouvrement de s est tracé, des copies de GDB le nom de la fonction normalement:

Â

(gdb) recouvrez l'ov.foo.text de section de liste, chargé à 0x100000 - 0x100034, tracé à 0x1016 - le foo $6 de l'impression 0x10Ã¢ (gdb ) = { interne (interne) } 0x1016 < foo >

Quand la correction de recouvrement est permise, GDB peut trouver l'adresse correcte pour des fonctions et des variables dans un recouvrement, si le recouvrement est tracé. Ceci permet la plupart des commandes de GDB, comme coupure et démonteztravailler normalement, même sur unmapped le code. Cependant, l'appui du break de GDB a quelques limitations:

Vous pouvez placer des breaks dans les fonctions unmapped dedans des recouvrements, aussi longtemps que GDB peut écrire au recouvrement à sa adresse de charge.

GDB ne peut pas placer le matériel ou les breaks simulateur-basés unmapped dedans des recouvrements. Cependant, si vous placez un break à l'extrémité de votre directeur de recouvrement (et dites à GDB quels recouvrements sont maintenant tracés, si vous employez la gestion manuelle de recouvrement), GDB remettra à zéro ses breaks correctement.

11,3 Correction Automatique De Recouvrement

GDB peut automatiquement dépister quels recouvrements sont tracés et ce qui ne sont pas, donné de la coopération simple du directeur de recouvrement dans l'inférieur. Si vous permettez automatique recouvrez la correction avec recouvrez l'automobile commandez (voir la section 11,2 recouvrir des commandes ), des regards de GDB dans la mémoire inférieure pour certaines variables décrivant l'état actuel des recouvrements.

Voici les variables que votre directeur de recouvrement doit définir pour soutenir la correction automatique du recouvrement de GDB:

_ ovly_table

Cette variable doit être un choix des structures suivantes:

struct { /* l'adresse tracée du recouvrement. */long vma non signé; la taille du recouvrement, dans les bytes. */longue taille non signée; l'adresse de la charge du recouvrement. */long lma non signé; différent de zéro si le recouvrement est actuellement tracé; zéro autrement. */non signé longtemps tracé; }

_ novlys

Cette variable doit être un nombre entier signé de quatre octets, tenant tout le nombre d'éléments dedans _ ovly_table.

Pour décider si un recouvrement particulier est tracé ou pas, GDB recherche une entrée dedans _ ovly_table à qui vma et lma les membres égalent le VMA et le LMA de la section du recouvrement dans le dossier exécutable. Quand GDB trouve une entrée assortie, il consulte l'entrée tracé membre pour déterminer si le recouvrement est actuellement tracé.

En outre, votre directeur de recouvrement peut définir une fonction appelée _ ovly_debug_event. Si cette fonction est définie, GDB placera silencieusement un break là. Si le directeur de recouvrement appelle alors cette fonction toutes les fois qu'elle a changé la table de recouvrement, ceci permettra à GDB de maintenir exactement quels recouvrements sont dans la mémoire de programme, et de mettre à jour tous les breaks qui peuvent être placés dans les recouvrements. Ceci permettra à des breaks de fonctionner même si les recouvrements sont maintenus dans la ROM ou toute autre mémoire non programmable alors qu'ils ne sont pas exécutés.

11,4 Programme D'Echantillon De Recouvrement

En liant un programme qui emploie des recouvrements, vous devez placer les recouvrements à leurs adresses de charge, tout en les replaçant pour démarrer à leurs adresses tracées. Pour faire ceci, vous devez écrire un manuscrit d'éditeur de liens (voir la description de recouvrement de ` de section ' en employant le LD: l'éditeur de liens de GNU ). Malheureusement, puisque les manuscrits d'éditeur de liens sont spécifiques à un système hôte, à une architecture de cible, et à une disposition particuliers de mémoire de cible, ce manuel ne peut pas fournir le code portatif d'échantillon démontrant l'appui du recouvrement de GDB.

Cependant, la distribution de source de GDB contient un programme recouvrement, avec des manuscrits d'éditeur de liens pour quelques systèmes, en tant qu'élément de son suite d'essai. Le programme comprend les dossiers suivants du ` gdb/testsuite/gdb.base ':

` overlays.c '

Le dossier principal de programme.

` ovlymgr.c '

Un directeur simple de recouvrement, employé par le ` overlays.c '.

` foo.c '

` bar.c '

` baz.c '

` grbx.c '

Modules de recouvrement, chargés et employés par le ` overlays.c '.

` d10v.ld '

` m32r.ld '

Manuscrits d'éditeur de liens pour lier le programme d'essai sur d10v-elf et m32r-elf cibles.

Vous pouvez établir employer de programme d'essai d10v-elf Le compilateur croisé de GCC aiment ceci:

Â

$ d10v-elf-gcc - g - c overlays.c $ d10v-elf-gcc - g - c ovlymgr.c $ d10v-elf-gcc - g - c foo.c $ d10v-elf-gcc - g - c bar.c $ d10v-elf-gcc - g - c baz.c $ d10v-elf-gcc - g - c grbx.c $ d10v-elf-gcc - g overlays.o ovlymgr.o foo.o bar.o \ baz.o grbx.o - plan horizontal, -Td10v.ld - recouvrements de o

Le processus de construction est identique pour tout autre

l'architecture, sauf que vous doit substituer le compilateur et le manuscrit appropriés d'éditeur de liens au système de cible pour d10v-elf-gcc et d10v.ld.

Veuillez envoyer le FSF et les enquêtes et les questions de GNU à gnu@gnu.org . Il y a également d'autres manières d'entrer en contact avec le FSF.

Ces pages sont maintenues par les lotisseurs de GDB .

Copyright Free Software Foundation, Inc., Endroit De 59 Temples - Suite 330, Boston, MA 02111, Etats-Unis.

In extenso copiant et distribution de cet article entier est autorisé dans n'importe quel milieu, si cette notification est préservée.

Ce document a été produit par l'administrateur de GDB octobre, 16 2003 texi2html employants

12. Employer GDB avec différentes langues

Bien que les langages de programmation aient généralement des aspects communs, ils sont rarement exprimés de la même manière. Par exemple, dans la norme ANSI C, déréférenciant un indicateur p est accompli près * pmais dans Modula-2, il est accompli près p^. Des valeurs peuvent également être représentées (et montrées) différemment. Les nombres de sortilège en C apparaissent As ` 0x1ae 'alors que dans Modula-2 ils apparaissent As ` 1AEH '.

L'information spécifique à une langue est établie dans GDB pour quelques langues, vous permettant d'exprimer des opérations comme ce qui précède en langue maternelle de votre programme, et permettant à GDB de produire des valeurs en quelque sorte conformées à la syntaxe de la langue maternelle de votre programme. La langue que vous employez pour établir des expressions s'appelle la langue de travail .

12,1 Le changement entre les langues source 12,2 montrant le type et la gamme de la langue 12,3 vérifiant les contrôles 12,4 de type et de gamme a soutenu des langues 12,5 langues non soutenues

12,1 Changement entre les langues source

Il y a deux manières de commander la langue de travail -- ayez GDB réglé lui automatiquement, ou le choisir manuellement vous-même. Vous pouvez employer placez la langue commandez pour l'un ou l'autre but. Sur le démarrage, GDB se transfère sur placer la langue automatiquement. La langue de travail est employée pour déterminer comment des expressions que vous tapez sont interprétées, comment des valeurs sont imprimées, etc...

En plus de la langue de travail, chaque fichier source que GDB connaît a environ sa propre langue de travail. Pour quelques formats de fichier d'exécution, le compilateur pourrait indiquer en quelle langue un fichier source particulier est. Cependant, la majeure partie du temps GDB implique la langue du nom du dossier. La langue d'un fichier source commande si les noms de C ++ sont demangled -- de cette façon backtrace peut montrer chaque armature convenablement pour sa propre langue. Il n'y a aucune manière de placer la langue d'un fichier source de dans GDB, mais vous pouvez placer la langue liée à une prolongation de nom de fichier. Voir la section montrer la langue .

C'est le plus généralement un problème quand vous employez un programme, comme cfront ou f2ccela produit de C mais est écrit en une autre langue. Dans ce cas, faites l'utilisation de programme # ligne directives dans son rendement de C; que la manière GDB saura la langue correcte du code source du programme original, et montrera ce code source, pas le code produit de C.

12,1,1 Liste de prolongements et de langues de nom de fichier

Si un nom de fichier de source finit dans un des prolongements suivants, alors GDB implique que sa langue est celle indiquée.

`.c '

Fichier source de C

`.C '

`.cc '

`.cp '

`.cpp '

`.cxx '

`.c++ '

Fichier source de C ++

`.m '

Fichier source Objectif-C

`.f '

`.F '

Fichier source de Fortran

`.mod '

Fichier source Modula-2

`.s'

`.S'

Fichier source d'assembleur. Ceci se comporte réellement presque comme C, mais GDB ne saute pas au-dessus des prologues de fonction en faisant un pas.

En outre, vous pouvez placer la langue liée à une prolongation de nom de fichier. Voir la section montrer la langue .

12,1,2 Réglage de la langue de travail

Si vous permettez à GDB de placer la langue automatiquement, des expressions sont interprétées la même manière dans votre session de correction et votre programme.

Si vous souhaitez, vous pouvez placer la langue manuellement. Pour faire ceci, publiez la commande langue réglée de ` lang'où lang est le nom d'une langue, comme c ou modula-2. Pour une liste des langues soutenues, tapez langue réglée de ` '.

Le réglage de la langue empêche manuellement GDB de mettre à jour la langue de travail automatiquement. Ceci peut mener à la confusion si vous essayez de mettre un programme au point quand la langue de travail n'est pas identique à la langue source, quand une expression semble acceptable aux deux langues des choses -- mais différentes de moyens. Par exemple, si le fichier source courant étaient écrits en C, et GDB analysait Modula-2, une commande comme:

Â

imprimez a = b + c

force ne pas avoir l'effet que vous avez prévu. En C, ce moyens de s'ajouter b et c et placez le résultat dedans a. Le résultat imprimé serait la valeur de a. Dans Modula-2, ce moyens de comparer a au résultat de b+crapportant a BOOLEEN valeur.

12,1,3 En ayant GDB impliquez la langue source

Pour avoir GDB réglé la langue de travail automatiquement, employez langue réglée de ` locale ' ou automobile réglée de langue de ` '. GDB implique alors la langue de travail. C'est-à-dire, quand votre programme s'arrête dans une armature (habituellement en rencontrant un break), GDB place la langue de travail à la langue enregistrée pour la fonction dans cette armature. Si la langue d'une armature est inconnue (c'est-à-dire, si la fonction ou le bloc correspondant à l'armature était définie dans un fichier source qui n'a pas une prolongation identifiée), la langue de travail courante n'est pas changée, et GDB publie un avertissement.

Ceci peut ne pas sembler nécessaire pour la plupart des programmes, qui sont écrits entièrement en une langue source. Cependant, des modules de programme et les bibliothèques écrites en une langue source peuvent être employés par un programme principal écrit dans une langue source différente. Employer automobile réglée de langue de ` ' vous libère dans ce cas-ci de devoir placer la langue de travail manuellement.

12,2 Montrer la langue

Les commandes suivantes vous aident à découvrir que la langue est la langue de travail, et aussi quels fichiers source de langue ont été écrits dedans.

montrez la langue

Montrez la langue de travail courante. C'est le langage que vous pouvez vous servir avec des commandes comme copie pour établir et calculer les expressions qui peuvent impliquer des variables dans votre programme.

armature d'information

Montrez la langue source de cette armature. Cette langue devient la langue de travail si vous employez une marque de cette armature. Voir les informations de section sur une armature , pour identifier l'autre information énumérée ici.

source d'information

Montrez la langue source de ce fichier source. Voir la section examiner le Tableau de symbole , pour identifier l'autre information énumérée ici.

Dans des circonstances peu communes, vous pouvez avoir des fichiers source avec des prolongements pas dans la liste standard. Vous pouvez alors placer la prolongation liée à une langue explicitement:

placez la prolongation-langue ext langue

Placez les fichiers source avec la prolongation ext être supposé pour être dans la langue source langue.

prolongements d'information

Enumérez tous les prolongements de nom de fichier et langues associées.

12,3 Vérification de type et de gamme

Avertissement: Dans ce dégagement, les commandes de GDB pour la vérification de type et de gamme sont incluses, mais elles n'ont encore aucun effet. Cette section documente les équipements prévus.

Quelques langues sont conçues pour vous garder contre faire des erreurs apparemment communes par une série de compilent et le temps d'exécution vérifie. Celles-ci incluent à vérifier le type d'arguments les fonctions et les opérateurs, et des débordements mathématiques s'assurants sont attrapés au temps d'exécution. Vérifie comme des ces l'aide pour assurer l'exactitude d'un programme une fois qu'elle a été compilée en éliminant des disparités de type, et fournir les contrôles actifs pour des erreurs de gamme quand votre programme fonctionne.

GDB peut examiner pour assurer les conditions comme ce qui précède si vous souhaitez. Bien que GDB ne vérifie pas les rapports dans votre programme, il peut examiner des expressions écrites directement dans GDB pour assurer l'évaluation par l'intermédiaire du copie commande, par exemple. Comme avec la langue de travail, GDB peut également décider si ne pas vérifier automatiquement a basé sur la langue source de votre programme. Voir les langues soutenues par section , pour les arrangements de défaut des langues soutenues.

12,3,1 Une vue d'ensemble de la vérification de type

Quelques langues, telles que Modula-2, sont fortement dactylographiées, signifiant que les arguments aux opérateurs et aux fonctions doivent être du type correct, autrement une erreur se produit. Ces contrôles empêchent des erreurs de disparité de type de poser jamais tous les problèmes d'exécution. Par exemple,

Â

1 + 2 = > 3 mais --> 1 + 2,3 d'erreur

Le deuxième exemple échoue parce que CARDINAL 1 n'est pas type-compatible avec VRAI 2,3,

Pour les expressions que vous employez dans des commandes de GDB, vous peut dire le contrôleur de type de GDB de sauter la vérification; pour traiter toutes disparités comme erreurs et abandonner l'expression; ou pour publier seulement des avertissements quand les disparités de type se produisent, mais évaluez l'expression de toute façon. Quand vous choisissez le bout de ces derniers, GDB évalue des expressions comme le deuxième exemple ci-dessus, mais publie également un avertissement.

Même si vous tournez le type cochant, il peut y avoir d'autres raisons liées au type qui empêchent GDB d'évaluer une expression. Par exemple, GDB ne sait pas ajouter interne et a foo de struct. Ces erreurs particulières de type n'ont rien à faire avec la langue en service, et résultent habituellement des expressions, telles que celle décrite ci-dessus, qui semblent à peu raisonnable d'évaluer de toute façon.

Chaque langue définit à quel degré elle est stricte au sujet du type. Par exemple, Modula-2 et C exigent des arguments aux opérateurs arithmétiques d'être des nombres. En C, des types et les indicateurs énumérés peuvent être représentés comme nombres, de sorte qu'ils soient des arguments valides aux opérateurs mathématiques. Voir les langues soutenues par section , pour d'autres détails sur des langues spécifiques.

GDB fournit quelques commandes additionnelles pour commander le contrôleur de type:

automobile réglée de type de contrôle

Placez le type vérifiant ou au loin basé sur la langue de travail courante. Voir les langues soutenues par section , pour les arrangements de défaut pour chaque langue.

placez le type de contrôle dessus

placez le type de contrôle au loin

Placez le type cochant dessus ou, en dépassant le défaut plaçant la langue de travail courante. Publiez un avertissement si l'arrangement n'assortit pas le défaut de langue. Si des disparités de type se produisent en évaluant une expression tandis que la vérification de type est allumée, GDB imprime un message et avorte l'évaluation de l'expression.

le type réglé de contrôle avertissent

Faites pour publier des avertissements, mais pour essayer toujours le contrôleur de type d'évaluer l'expression. L'évaluation de l'expression peut encore être impossible pour d'autres raisons. Par exemple, GDB ne peut pas ajouter des nombres et des structures.

montrez le type

Montrez l'arrangement courant du contrôleur de type, et si GDB le place automatiquement.

12,3,2 Une vue d'ensemble de la vérification de gamme

Dans quelques langues (telles que Modula-2), c'est une erreur pour dépasser les limites d'un type; ceci est imposé avec les contrôles d'exécution. Une telle vérification de gamme est censée pour assurer l'exactitude de programme par des calculs s'assurants ne débordent pas, ou les index sur un accès d'élément de rangée ne dépassent pas les limites de la rangée.

Pour des expressions que vous employez dans des commandes de GDB, vous peut dire GDB de traiter des erreurs de gamme dans un de trois manières: ignorez-les, toujours traitez-les comme erreurs et abandonnez l'expression, ou les avertissements d'issue mais évaluez l'expression de toute façon.

Une erreur de gamme peut résulter du débordement numérique, de dépasser une limite d'index de rangée, ou quand vous tapez une constante qui n'est pas un membre d'aucun type. Quelques langues, cependant, ne traitent pas des débordements comme erreur. Dans beaucoup de réalisations de C, le débordement mathématique cause le résultat au l'"enrouler autour de" à des valeurs plus basses -- par exemple, si m est la plus grande valeur de nombre entier, et s est le plus petit, puis

Â

m + 1 = > s

Ce, aussi, est spécifique à différentes langues, et dans certains cas à détail à différents compilateurs ou machines. Voir les langues soutenues par section , pour d'autres détails sur des langues spécifiques.

GDB fournit quelques commandes additionnelles pour commander le contrôleur de gamme:

automobile réglée de gamme de contrôle

Placez la gamme vérifiant ou au loin basé sur la langue de travail courante. Voir les langues soutenues par section , pour les arrangements de défaut pour chaque langue.

placez la gamme de contrôle dessus

placez la gamme de contrôle au loin

Placez la gamme cochant dessus ou, en dépassant le défaut plaçant la langue de travail courante. Un avertissement est publié si l'arrangement n'assortit pas le défaut de langue. Si une erreur de gamme se produit et vérification de gamme est allumée, alors un message est imprimé et l'évaluation de l'expression est avortée.

la gamme réglée de contrôle avertissent

Produisez les messages quand le contrôleur de chaîne de GDB détecte une erreur de gamme, mais la tentative d'évaluer l'expression de toute façon. L'évaluation de l'expression peut encore être impossible pour d'autres raisons, telles que la mémoire d'accès que le processus ne possède pas (un exemple typique de beaucoup de systèmes d'Unix).

montrez la gamme

Montrez l'arrangement courant du contrôleur de gamme, et s'il est placé automatiquement par GDB.

12,4 Langues soutenues

GDB soutient C, C ++ , Objectif-C, Fortran, Java, ensemble, et Modula-2. Des devices d'un certain GDB peuvent être employés dans les expressions indépendamment du langage que vous vous servez: le GDB @ et :: opérateurs, et `{type}addr ' la construction (voir les expressions de section ) peut être employée avec les construire avec de n'importe quelle langue soutenue.

Le détail suivant de sections à quel degré chaque langue source est soutenu par GDB. Ces sections ne sont pas censées pour être des cours d'instruction ou des références de langue, mais service seulement comme guide de référence de ce que l'analyseur d'expression de GDB accepte, et quels formats d'entrée et de rendement devraient ressembler à pour différentes langues. Il y a beaucoup de bons livres écrits sur chacune de ces langues; regardez svp à ces derniers pour. une référence de langue ou cours d'instruction

12,4,1 C et C ++ 12,4,2 12,4,3 Modula-2 Objectifs-C

12,4,1 C et C ++

Depuis C et C ++ sont tellement étroitement liés, beaucoup de devices de GDB s'appliquent aux deux langues. Toutes les fois que c'est le cas, nous discutons ces langues ensemble.

Les fonctions de mise au point de C ++ sont conjointement mises en application par le compilateur de C ++ et GDB. Therefore, pour corriger votre code de C ++ efficacement, vous devez compiler vos programmes de C ++ avec un compilateur soutenu de C ++, tel que GNU g++ou le compilateur de la norme ANSI C ++ de HP (aCC

Pour les meilleurs résultats en utilisant GNU C ++ , employez le format de correction du NAIN 2; s'il ne travaille pas sur votre système, essayez le format de correction de stabs+. Vous pouvez choisir ces formats explicitement avec g++ options de commande-ligne `-gdwarf-2 ' et `-gstabs+ '. Voir les options de ` de section pour corriger votre programme ou GNU cc ' en employant GNU cc .

12,4,1,1 Opérateurs de C et de C ++

Des opérateurs doivent être définis sur des valeurs des types spécifiques. Par exemple, + est défini sur des nombres, mais pas sur des structures. Des opérateurs sont souvent définis sur des groupes de types.

Pour les buts de C et de C ++ , les définitions suivantes se tiennent:

Les types intégraux incluent interne avec quels de ses spécificateurs de stockage-classe; char enumet, pour C ++ , bool.

Les types à point mobile incluent flotteur doubleet long double (si soutenu par la plateforme de cible).

Les types d'indicateur incluent tous les types définis As (type *).

Les types scalaires incluent toute la ce qui précède.

Les opérateurs suivants sont soutenus. Ils sont énumérés ici par ordre de priorité croissante:

,

La virgule ou l'opérateur d'ordonnancement. Des expressions dans une liste virgule-séparée sont évaluées de gauche à droite, avec le résultat de l'expression entière étant la dernière expression évaluée.

=

TÃ¢che. La valeur d'une expression de tÃ¢che est la valeur assignée. Défini sur les types scalaires.

op=

Utilisé dans une expression de la forme a op= bet a traduit à a = un b op. op= et = ayez la même priorité. op est n'importe quel un des opérateurs | ^ et < < > > + - * / %.

?:

L'opérateur ternaire. a b c peut être considéré comme: si a puis b autrement c. a si soyez d'un type intégral.

||

Logique OU défini sur les types intégraux.

&&

Logique ET défini sur les types intégraux.

|

Au niveau du bit OU défini sur les types intégraux.

^

Au niveau du bit exclusif-Ou. Défini sur les types intégraux.

et

Au niveau du bit ET défini sur les types intégraux.

==,! =

Egalité et inégalité. Défini sur les types scalaires. La valeur de ces expressions est 0 pour faux et différent de zéro pour vrai.

<, >, < =, > =

Moins que, plus grand que, moins qu'ou égal, plus grand qu'ou égal. Défini sur les types scalaires. La valeur de ces expressions est 0 pour faux et différent de zéro pour vrai.

< <, > >

décalage gauche, et bon décalage. Défini sur les types intégraux.

@

L'opérateur "de rangée artificielle" de GDB (voir les expressions de section ).

+, -

Addition et soustraction. Défini sur les types intégraux, les types à point mobile et les types d'indicateur.

*, /, %

Multiplication, division, et module. La multiplication et la division sont définies sur les types intégraux et à point mobile. Le module est défini sur les types intégraux.

++, --

Incrément et décroissance. En apparaissant avant une variable, l'opération est effectuée avant que la variable soit employée dans une expression; en apparaissant après elle, la valeur de la variable est employée avant que l'opération ait lieu.

*

Déréférencier d'indicateur. Défini sur des types d'indicateur. La même priorité As ++.

et

Opérateur d'adresse. Défini sur des variables. La même priorité As ++.

Pour corriger C ++ , GDB met en application une utilisation de ` et ' au delà de ce qui est admis dans la langue de C ++ elle-même: vous pouvez employer ` et (etréférence' (ou, si vous préférez, simplement ` et etréférence'pour examiner l'adresse où une variable de référence de C ++ (avouée avec ` etréférence'est stocké.

-

Négatif. Défini sur les types intégraux et à point mobile. La même priorité As ++.

!

Négation logique. Défini sur les types intégraux. La même priorité As ++.

~

Au niveau du bit opérateur de complément. Défini sur les types intégraux. La même priorité As ++.

., - >

Membre de structure, et membre d'indicateur-à-structure. Pour la convenance, GDB considère les deux comme l'équivalent, choisissant si déréférencier un indicateur basé sur l'information stockée de type. Défini dessus struct et union données.

. *, - > *

Déréférencie des indicateurs aux membres.

[ ]

Indexation de rangée. a[i] est défini As * (a+i. La même priorité As - >.

()

Liste de paramètre de fonction. La même priorité As - >.

::

Opérateur de résolution de portée de C ++. Défini dessus struct unionet classe types.

::

Les deux points doublés représentent également l'opérateur de portée de GDB (voir les expressions de section ). La même priorité As ::en haut.

Si un opérateur est redéfini dans le code d'utilisateur, GDB essaye habituellement d'appeler la version redéfinie au lieu d'employer la signification prédéfinie de l'opérateur.

12,4,1,2 Constantes de C et de C ++

De GDB vous permet d'exprimer les constantes C et C ++ en manières suivantes:

Les constantes de nombre entier sont un ordre des chiffres. Des constantes octales sont indiquées par mener ` 0' (c.-à-d. zéro), et constantes hexadécimales par mener ` 0x' ou ` 0X'. Les constantes peuvent également finir avec une lettre ` l 'indiquant que la constante devrait être traitée comme a longtemps valeur.

Les constantes de virgule flottante sont un ordre des chiffres, suivi d'une virgule décimale, suivi d'un ordre des chiffres, et sur option suivi d'un exposant. Un exposant est de la forme: ` e[[+ ]|- ]nnn'où nnn est un autre ordre des chiffres. ` + ' est facultatif pour les exposants positifs. Une constante à point mobile peut également finir avec une lettre ` f ' ou ` F 'indiquant que la constante devrait être traitée en tant qu'étant du flotteur (par opposition au défaut doubletype; ou avec une lettre ` l ' ou ` L 'qui indique a long double constant.

Les constantes énumérées se composent des marques énumérées, ou leurs équivalents intégraux.

Les constantes de caractère sont un caractère simple entouré par des quotes simples ('ou un nombre -- la valeur ordinale du caractère correspondant (habituellement son valeur d'cAscii). Dans des quotes, le caractère simple peut être représenté par une lettre ou par les ordres d'évasion , qui sont de la forme ` \nnn'où nnn est la représentation octale de la valeur ordinale du caractère; ou de la forme ` \X'où `X' est un caractère spécial prédéfini -- par exemple, `\n ' pour le caractère NL.

Les constantes de corde sont un ordre des constantes de caractère entourées par de doubles quotes ("N'importe quelle constante de caractère valide (comme décrit ci-dessus) peut apparaître. Des quotes de double dans la corde doivent être précédées par un antislash, ainsi par exemple `"a\"b'c "' est une corde de cinq caractères.

Les constantes d'indicateur sont une valeur intégrale. Vous pouvez également écrire des indicateurs aux constantes en utilisant l'opérateur de C ` et '.

Les constantes de rangée sont les listes virgule-séparées entourées par des croisillons ` { ' et ` } 'par exemple, `{1,2,3 } ' est un choix d'trois-élément de nombres entiers, `{{1,2 }, { 3,4}, { 5.6 } } ' est a trois-par-deux la rangée, et le `{&"hi ", &"there ", &"fred "} ' est une rangée d'trois-élément d'indicateurs.

12,4,1,3 Expressions de C ++

La manipulation d'expression de GDB peut interpréter la plupart des expressions de C ++.

Avertissement: GDB peut seulement corriger le code de C ++ si vous employez le compilateur approprié et les appropriés corrigent le format. Actuellement, GDB fonctionne mieux en corrigeant le code de C ++ qui est compilé avec GCC 2,95,3 ou avec GCC 3,1 ou plus nouveau, en utilisant les options `-gdwarf-2 ' ou `-gstabs+ '. Le NAIN 2 est préféré au-dessus de stabs+. La plupart des configurations de GCC émettent ou le NAIN 2 ou stabs+ en tant que leur défaut corrigent le format, ainsi vous habituellement n'avez pas besoin d'indiquer un format de correction explicitement. D'autres compilateurs et/ou corrigent des formats sont susceptibles de travailler mal ou pas du tout en utilisant GDB pour corriger le code de C ++.

On permet des appels de fonction de membre; vous pouvez employer des expressions comme

Â

compte = aml->GetOriginal(x, y)

Tandis qu'une fonction de membre est en activité (dans l'armature choisie de pile), vos expressions ont le même namespace disponible que la fonction de membre; c'est-à-dire, GDB permet des références implicites à l'indicateur d'exemple de classe ceci après les mêmes règles que C ++ .

Vous pouvez appeler des fonctions surchargées; GDB résout l'appel de fonction à la bonne définition, avec quelques restrictions. GDB n'exécute pas la résolution de surcharge impliquant des conversions définies pour l'utilisateur de type, n'appelle pas aux constructeurs, ou aux instantiations des calibres qui n'existent pas dans le programme. Il ne peut pas manipuler des listes d'argument de points de suspension ou également transférer des arguments.

Il exécute des conversions et des promotions intégrales, des promotions à point mobile, des conversions arithmétiques, des conversions d'indicateur, des conversions des objets de classe en classes basses, et des conversions standard de ce type des fonctions ou des rangées en indicateurs; il exige une allumette exacte sur le nombre d'arguments de fonction.

La résolution de surcharge est toujours exécutée, à moins que vous ayez indiqué placez la surcharge-résolution au loin. Voir les devices de la section GDB pour C ++ .

Vous devez indiquer placez la surcharge-résolution au loin afin d'employer une signature de fonction explicite pour appeler une fonction surchargée, en tant que dedans

p 'foo(char, int)'('x ', 13)

Le service d'commande-accomplissement de GDB peut simplifier ceci; voir l'accomplissement de commande .

GDB comprend des variables avouées comme références de C ++; vous pouvez les employer dans les expressions juste comme vous faites dans la source de C ++ -- elles sont automatiquement déréférenciées.

Dans la liste de paramètre montrée quand GDB montre une armature, les valeurs des variables de référence ne sont pas montrées (à la différence d'autres variables); ceci évite l'image de fond, puisque des références sont souvent employées pour de grandes structures. L'adresse d'une variable de référence est toujours montrée, à moins que vous ayez indiqué adresse réglée d'impression de ` outre de '.

GDB soutient l'opérateur de name resolution de C ++ ::vos expressions peuvent l'employer juste comme les expressions dans votre programme . Puisqu'une portée peut être définie dans des autres, vous pouvez employer :: à plusieurs reprises au besoin, par exemple dans une expression aimez `scope1scope2nom'. GDB laisse également résoudre la portée nommée en se référant aux fichiers source, dans la correction de C et de C ++ (voir la section programmer des variables ).

En outre, une fois utilisé avec le compilateur du C ++ de la HP, GDB soutient appeler des fonctions virtuelles correctement, imprimant les bases virtuelles des objets, appelant fonctionne dans un subobject bas, des objets de moulage, et un appel des opérateurs définis pour l'utilisateur.

12,4,1,4 C et C ++ se transfère

Si vous permettez à GDB de placer le type et gamme vérifiant automatiquement, ils tous les deux se transfèrent sur outre de toutes les fois que la langue de travail change en C ou C ++ . Ceci se produit indépendamment de si vous ou GDB choisit la langue de travail.

Si vous permettez à GDB de placer la langue automatiquement, elle identifie les fichiers source dont les noms finissent avec `.c ', `.C ', ou `.cc ', etc.., et quand GDB écrit le code compilé d'un de ces dossiers, elle place la langue de travail à C ou à C ++ . Voir la section faire impliquer GDB la langue source , pour d'autres détails.

12,4,1,5 C et C ++ tapeznt et s'étendent des contrôles

Par défaut, quand GDB analyse des expressions de C ou de C ++, la vérification de type n'est pas employée. Cependant, si vous tournez le type vérifiant, GDB considère l'équivalent de type de deux variables si:

Les deux variables sont structurées et ont la même structure, union, ou étiquette énumérée.

Les deux variables ont le même nom de type, ou des types qui ont été équivalent avoué à travers typedef.

La gamme vérifiant, si allumée, est faite sur des opérations mathématiques. Des index de rangée ne sont pas vérifiés, puisqu'ils sont souvent employés pour classer un indicateur qui n'est pas lui-même une rangée.

12,4,1,6 GDB et C

union réglée d'impression et montrez l'union d'impression les commandes s'appliquent au union type. Quand ensemble à ` sur 'quels union c'est à l'intérieur de a struct ou classe est également imprimé. Autrement, elle apparaît As `{...}'.

@ assistances opérateur dans la correction des rangées dynamiques, formée avec des indicateurs et une fonction d'attribution de mémoire. Voir les expressions de section .

12,4,1,7 devices de GDB pour C ++

Les commandes d'un certain GDB sont particulièrement utiles avec C ++ , et certains sont conçus spécifiquement pour l'usage avec C ++ . Voici un sommaire:

menus de break

Quand vous voulez un break dans une fonction dont le nom est surchargé, les menus de break de GDB vous aident à indiquer quelle définition de fonction vous voulez. Voir les menus de break de section .

rbreak regex

Le réglage des breaks employant des expressions régulières est utile pour placer des breaks sur les fonctions surchargées qui ne sont pas des membres d'aucune classe spéciale. Voir la section placer des breaks .

attrapez le jet

attrapez le crochet

Corrigez la manipulation d'exception de C ++ en utilisant ces commandes. Voir la section placer des catchpoints .

ptype typename

Imprimez les rapports de transmission aussi bien que l'autre information pour le type typename. Voir la section examiner le Tableau de symbole .

placez le demangle d'impression

montrez le demangle d'impression

placez ASM-demangle d'impression

montrez ASM-demangle d'impression

Commandez si affichage de symboles de C ++ sous leur forme source, en montrant le code comme source et en montrant démontages de C ++. Voir la section imprimer des arrangements .

placez l'objet d'impression

montrez l'objet d'impression

Choisissez s'imprimer a dérivé (réel) ou a déclaré des types d'objets. Voir la section imprimer des arrangements .

placez le vtbl d'impression

montrez le vtbl d'impression

Commandez le format pour imprimer les tables virtuelles de fonction. Voir la section imprimer des arrangements . ( vtbl les commandes ne travaillent pas sur des programmes compilés avec le compilateur de la norme ANSI C ++ de HP (aCC

placez la surcharge-résolution dessus

Permettez la résolution de surcharge pour l'évaluation d'expression de C ++. Le défaut est allumé. Des fonctions surchargées, GDB évalue les arguments et recherche une fonction dont la signature assortit les types d'argument, en utilisant la conversion standard de C ++ règne (voir les expressions de C ++ , pour des détails). S'il ne peut pas trouver une allumette, il émet un message.

placez la surcharge-résolution au loin

Neutralisez la résolution de surcharge pour l'évaluation d'expression de C ++. Pour les fonctions surchargées qui ne sont pas classe que le membre fonctionne, GDB choisit la première fonction du nom indiqué qu'elle trouve dans la table de symbole, si ses arguments sont du type correct. Pour les fonctions surchargées qui sont le membre de classe fonctionne, des recherches de GDB d'une fonction dont la signature assortit exactement les types d'argument.

Noms surchargés de symbole

Vous pouvez indiquer une définition particulière d'un symbole surchargé, en utilisant la même notation qui est employée pour déclarer de tels symboles en C ++ : type symbole(types plutôt que juste symbole. Vous pouvez également employer les équipements d'accomplissement de mot de commande-ligne de GDB pour énumérer les choix disponibles, ou pour finir la liste de type pour vous. Voir la section commander l'accomplissement , pour des détails sur la façon dont à faites ceci.

12,4,2 Objectif-C

Cette section fournit des informations au sujet de quelques commandes et options de commande qui sont utiles

pour corriger le code Objectif-C.

12,4,2,1 Noms de méthode dans les commandes 12,4,2,2 la commande print avec Objectif-C

12,4,2,1 Noms de méthode dans les commandes

Les commandes suivantes ont été prolongées d'accepter des noms Objectifs-C de méthode comme caractéristiques de ligne:

espace libre

coupure

ligne d'information

saut

liste

Un nom Objectif-C entièrement qualifié de méthode est indiqué As

Â

methodName de -[Class ]

là où le signe moindre est utilisé comme moyen d'indiquer une méthode d'exemple et un plus (non montrés) est employée pour indiquer une méthode de classe. Le nom de classe Classe et nom de méthode methoName sont enfermés entre parenthèses, semblables à la manière que des messages sont indiqués en code source Objectif-C. Par exemple, pour placer un break au créez citez la méthode de classe Fruit dans le programme actuellement étant corrigé, entrez:

Â

le -[Fruit de coupure créent ]

Pour énumérer dix lignes de programme autour du initialisez classez la méthode, entrez:

Â

la liste +[NSText initialisent ]

Dans la version en cours de GDB, le positif ou sans le signe est exigé. Dans de futures versions de GDB, le positif ou sans le signe sera facultatif, mais vous pouvez l'employer pour rétrécir la recherche. Il est également possible d'indiquer juste un nom de méthode:

Â

la coupure créent

Vous devez indiquer le nom complet de méthode, y compris tous les deux points. Si les fichiers source de votre programme contiennent plus d'un créez méthode, vous serez présentés avec une liste numérotée de classes qui appliquent cette méthode. Par indiquez votre choix le nombre, ou le type ` 0' pour sortir si aucun ne s'applique.

En tant qu'autre exemple, pour dégager un break établi au makeKeyAndOrderFront: méthode de NSWindow la classe, entrent:

Â

makeKeyAndOrderFront clair de -[NSWindow: ]

12,4,2,2 La Commande print Avec Objectif-C

La commande print a été également prolongée d'accepter des méthodes. Par exemple:

Â

informations parasites de -[object d'impression ]

dira le gdb d'envoyer - le message d'informations parasites à l'objet et d'imprimer le résultat. En outre une commande additionnelle a été ajoutée, imprimer-objet ou PO pour le short, qui est censé pour imprimer la description d'un objet. Cependant, cette commande peut seulement fonctionner avec certaines bibliothèques Objectives-C qui ont une fonction particulière de crochet, appelées _ NSPrintForDebugger défini.

12,4,3 Modula-2

Les prolongements ont fait à GDB pour soutenir seulement l'appui Modula-2 produit du compilateur de GNU Modula-2 (qui actuellement est développé). D'autres compilateurs Modula-2 ne sont pas actuellement soutenus, et essayer de corriger des executables produits par eux est le plus susceptible de donner une erreur car GDB lit dedans la table de symbole exécutable.

12,4,3,1 Opérateurs

Des opérateurs doivent être définis sur des valeurs des types spécifiques. Par exemple, + est défini sur des nombres, mais pas sur des structures. Des opérateurs sont souvent définis sur des groupes de types. Pour les buts de Modula-2, les définitions suivantes se tiennent:

Les types intégraux se composent NOMBRE ENTIER CARDINALet leurs subranges.

Les types de caractère se composent CHAR et ses subranges.

Les types à point mobile se composent VRAI.

Les types d'indicateur se composent de n'importe quoi avoué As INDICATEUR Ã€ type.

Les types scalaires se composent de toute la ce qui précède.

Placez les types se composent ENSEMBLE et BITSET types.

Les types booléens se composent BOOLEEN.

Les opérateurs suivants sont soutenus, et apparaissent par ordre de priorité croissante:

,

Séparateur d'index d'argument ou de rangée de fonction.

: =

TÃ¢che. La valeur de variété : = valeur est valeur.

<, >

Moins que, plus grand que sur les types intégraux, à point mobile, ou énumérés.

< =, > =

Inférieur ou égal à, supérieur ou égal à sur les types intégraux, à point mobile et énumérés, ou l'inclusion d'ensemble sur des types d'ensemble. La même priorité As <.

=, < >, #

Egalité et deux manières d'exprimer l'inégalité, valides sur les types scalaires. La même priorité As <. En manuscrits de GDB, seulement < > est disponible pour l'inégalité, depuis # conflits avec le caractère de commentaire de manuscrit.

DANS

Placez l'adhésion. Défini sur des types d'ensemble et les types de leurs membres. La même priorité As <.

OU

Disjonction booléenne. Défini sur les types booléens.

ET, et

Conjonction booléenne. Défini sur les types booléens.

@

L'opérateur "de rangée artificielle" de GDB (voir les expressions de section ).

+, -

Addition et soustraction sur les types intégraux et à point mobile, ou union et différence sur des types d'ensemble.

*

La multiplication sur les types intégraux et à point mobile, ou l'intersection d'ensemble sur l'ensemble tapez.

/

La Division sur les types à point mobile, ou la différence réglée symétrique sur l'ensemble tapez. La même priorité As *.

DIVISION, MOD

Division et reste de nombre entier. Défini sur les types intégraux. La même priorité As *.

-

Négatif. Défini dessus NOMBRE ENTIER et VRAI données.

^

Déréférencier d'indicateur. Défini sur des types d'indicateur.

PAS

Négation booléenne. Défini sur les types booléens. La même priorité As ^.

.

DISQUE sélecteur de champ. Défini dessus DISQUE données. La même priorité As ^.

[ ]

Indexation de rangée. Défini dessus RANGEE données. La même priorité As ^.

()

Liste d'argument de procédé. Défini dessus PROCEDE objets. La même priorité As ^.

::.

GDB et opérateurs de la portée Modula-2.

Avertissement: Des ensembles et leurs opérations ne sont pas encore soutenus, ainsi des festins de GDB l'utilisation de l'opérateur DANSou l'utilisation des opérateurs + - * / = < > # < =et > = sur des ensembles comme erreur.

12,4,3,2 Fonctions et procédures intégrées

Modula-2 fait également disponible plusieurs procédures et fonctions intégrées. En décrivant ces derniers, les metavariables suivants sont employés:

a

représente RANGEE variable.

c

représente a CHAR constante ou variable.

i

représente un variable ou une constante de type intégral.

m

représente une marque qui appartient à un ensemble. D'une façon générale utilisé dans la même fonction avec le metavariable s. Le type de s si soyez ENSEMBLE DE mtype (où mtype est le type de m

n

représente un variable ou une constante de type intégral ou à point mobile.

r

représente un variable ou une constante de type à point mobile.

t

représente un type.

v

représente une variable.

X

représente un variable ou une constante d'un de beaucoup de types. Voyez l'explication de la fonction pour des détails.

Toutes les procédures Modula-2 intégrées renvoient également un résultat, décrit ci-dessous.

ABS(n

Renvoie la valeur absolue de n.

CAP(c

Si c est une lettre minuscule, il renvoie son équivalent majuscule, autrement elle renvoie son argument.

CHR(i

Renvoie le caractère dont la valeur ordinale est i.

DEC(v

Décroissances la valeur dans la variable v par un. Renvoie la nouvelle valeur.

DEC(vi

Décroissances la valeur dans la variable v par i. Renvoie la nouvelle valeur.

EXCL(ms

Enlève l'élément m de l'ensemble s. Renvoie le nouvel ensemble.

FLOAT(i

Renvoie l'équivalent de virgule flottante du nombre entier i.

HIGH(a

Renvoie l'index du dernier membre de a.

INC(v

Incréments la valeur dans la variable v par un. Renvoie la nouvelle valeur.

INC(vi

Incréments la valeur dans la variable v par i. Renvoie la nouvelle valeur.

INCL(ms

Ajoute l'élément m à l'ensemble s s'il n'est pas déjà là. Renvoie le nouvel ensemble.

MAX(t

Renvoie la valeur maximum du type t.

MIN(t

Renvoie la valeur minimum du type t.

ODD(i

Renvoie booléen RECTIFIENT si i est un nombre impair.

ORD(X

Renvoie la valeur ordinale de son argument. Par exemple, la valeur ordinale d'un caractère est son valeur d'cAscii (sur des machines soutenant le jeu de caractères d'cAscii). X doit être d'un type commandé, qui incluent l'intégrale, le caractère et les types énumérés.

SIZE(X

Renvoie la taille de son argument. X peut être une variable ou un type.

TRUNC(r

Renvoie la partie intégrale de r.

VAL(ti

Retourne le membre du type t à qui valeur ordinale est i.

Avertissement: Des ensembles et leurs opérations ne sont pas encore soutenus, ainsi des festins de GDB l'utilisation des procédures INCL et EXCL comme erreur.

12,4,3,3 Constantes

GDB vous permet d'exprimer les constantes de Modula-2 en manières suivantes:

Les constantes de nombre entier sont simplement un ordre des chiffres. Une fois utilisée dans une expression, une constante est interprétée pour être type-compatible avec le reste de l'expression. Des nombres entiers hexadécimaux sont indiqués par un remorquage ` H 'et nombres entiers octaux par un remorquage ` B '.

Les constantes de virgule flottante apparaissent comme ordre des chiffres, suivi d'une virgule décimale et d'un ordre différent des chiffres. Un exposant facultatif peut alors être indiqué, sous la forme ` E[+|- ]nnn'où ` [ +|- ]nnn' est l'exposant désiré. Tous les chiffres de la constante de virgule flottante doivent être (base 10) les chiffres décimaux valides.

Les constantes de caractère se composent d'un caractère simple inclus par une paire de comme quotes, ou choisissent ('ou double ("Elles peuvent également être exprimées par leur valeur ordinale (leur valeur d'cAscii, habituellement) suivie de a ` C '.

Les constantes de corde se composent d'un ordre des caractères inclus par une paire de comme quotes, ou choisissent ('ou double ("On permet également des ordres d'évasion dans le modèle de C. Voir la section C et les constantes de C ++ , pour une brève explication des ordres d'évasion.

Les constantes énumérées se composent d'une marque énumérée.

Les constantes booléennes comprennent les marques VRAI et FAUX.

Les constantes d'indicateur se composent des valeurs intégrales seulement.

Placez les constantes ne sont pas encore soutenus.

12,4,3,4 Modula-2 se transfère

Si la vérification de type et de gamme sont placées automatiquement par GDB, ils tous les deux se transfèrent sur sur toutes les fois que la langue de travail change en Modula-2. Ceci se produit indépendamment de si vous ou GDB a choisi la langue de travail.

Si vous permettez à GDB de placer la langue automatiquement, écrire alors le code a compilé à partir d'un dossier dont les extrémités nommées avec `.mod ' place la langue de travail à Modula-2. Voir la section avoir GDB réglé la langue automatiquement , pour d'autres détails.

12,4,3,5 Déviations de Modula-2 standard

Quelques changements ont été faits pour faciliter les programmes Modula-2 pour corriger. Ceci est fait principalement par l'intermédiaire de détacher sa sévérité de type:

Ã€ la différence de dans Modula-2 standard, des constantes d'indicateur peuvent être constituées par des nombres entiers. Ceci vous permet de modifier des variables d'indicateur pendant la correction. (dans Modula-2 standard, l'adresse réelle contenue dans une variable d'indicateur est cachée de vous; elle peut seulement être modifiée par la tÃ¢che directe à une variable ou à une expression d'indicateur différente qui ont renvoyé un indicateur.)

Des ordres d'évasion de C peuvent être employés en cordes et caractères pour représenter les caractères non-imprimables. GDB imprime des cordes avec ces ordres d'évasion inclus. Les caractères non-imprimables simples sont employer imprimé ` CHR(nnn' format.

L'opérateur de tÃ¢che (: =renvoie la valeur de son argument droit.

Toutes les procédures intégrées modifient et renvoient leur argument.

12,4,3,6 Contrôles du type Modula-2 et de la gamme

Avertissement: dans ce dégagement, GDB n'effectue pas encore la vérification de type ou de gamme.

GDB considère l'équivalent de type de deux variables Modula-2 si:

Elles sont des types qui ont été équivalent avoué par l'intermédiaire de a TYPE T1 = T2 rapport

Ils ont été déclarés sur la même ligne. (note: C'est vrai du compilateur de GNU Modula-2, mais il peut ne pas être vrai d'autres compilateurs.)

Aussi longtemps que la vérification de type est permise, n'importe quelle tentative de combiner les variables dont les types ne sont pas équivalents est une erreur.

La vérification de gamme est faite sur toutes les opérations mathématiques, tÃ¢che, limites d'index de rangée, et toutes les fonctions et procédures intégrées.

12,4,3,7 Les opérateurs de portée :: et .

Il y a quelques différences subtiles entre l'opérateur de la portée Modula-2 (.et l'opérateur de portée de GDB (::Les deux ont la syntaxe semblable:

Â

module. identification de la portée:: d'identification

là où portée est le nom d'un module ou un procédé, module le nom d'un module, et identification est n'importe quelle marque avouée dans votre programme, excepté un autre module.

Employer :: recherche des marques GDB d'opérateur la portée indiquée près portée pour la marque identification. Si on ne le trouve pas dans la portée indiquée, alors GDB recherche toutes les portées enfermant celui indiqué près portée.

Employer . recherche des marques GDB d'opérateur la place courante pour la marque indiquée près identification cela a été importé du module de définition indiqué près module. Avec cet opérateur, c'est une erreur si la marque identification n'a pas été importé du module de définition moduleou si identification n'est pas une marque dedans module.

12,4,3,8 GDB et Modula-2

Les commandes d'un certain GDB font employer peu en mettant les programmes au point Modula-2. Cinq commandes secondaires de copie réglée et montrez la copie appliquez-vous spécifiquement à C et à C ++ : vtbl de ` ' demangle de ` ' ASM-demangle de ` ' objet de ` 'et union de ` '. Les quatre premiers appliquent à C ++ , et au bout au C union tapez, qui n'a aucun analogue direct dans Modula-2.

@ l'opérateur (voir les expressions de section ), tandis que disponible avec aucune langue, n'est pas utile avec Modula-2. Son intention est de faciliter la correction des rangées dynamiques , qui ne peuvent pas être créées dans Modula-2 car elles bidon en C ou C ++ . Cependant, parce qu'une adresse peut être indiquée par une constante intégrale, la construction ` {type}adrexp' est encore utile.

En manuscrits de GDB, l'opérateur de l'inégalité Modula-2 # est interprété comme commencement d'un commentaire. Utilisation < > au lieu de cela.

12,5 Langues non soutenues

En plus de l'autre les langages de programmation plein-soutenus, GDB fournit également un pseudo-langage, appelé minimal. Il ne représente pas un vrai langage de programmation, mais fournit un ensemble de possibilités près de ce que les langages de C ou d'assemblage fournissent. Ceci devrait permettre à la plupart des opérations simples d'être effectué tout en corrigeant une application qui emploie une langue actuellement non soutenue par GDB.

Si la langue est placée à automobileGDB choisira automatiquement cette langue si l'armature courante correspond à une langue sans support.

13. Examiner le Tableau de symbole

Les commandes décrites en ce chapitre vous permettent de vous enquérir au sujet des symboles (noms des variables, des fonctions et des types) définis dans votre programme. Cette information est inhérente au texte de votre programme et ne change pas car votre programme s'exécute. GDB la trouve dans la table du symbole de votre programme, dans le dossier indiqué quand vous avez commencé GDB (voir les dossiers de choix de section ), ou par un des ordres de dossier-gestion (voir les commandes de section d'indiquer des dossiers ).

De temps en temps, vous pouvez devoir vous référer aux symboles qui contiennent les caractères peu communs, que GDB traite d'habitude comme délimiteurs de mot. Le cas le plus fréquent est en se rapportant à des variables statiques dans d'autres fichiers source (voir la section programmer des variables ). Des noms de dossier sont enregistrés dans des fichiers d'exécution en tant que symboles de correction, mais GDB analyserait d'habitude un nom de fichier typique, comme le ` foo.c ', comme trois mots foo de ` ' `.' ` c '. Pour permettre à GDB de reconnaître ` foo.c ' comme symbole simple, enfermez-le dans des quotes simples; par exemple,

Â

p 'foo.c'::x

recherche la valeur de X dans la portée du ` foo.c de dossier '.

adresse d'information symbole

Décrivez pour où les données symbole est stocké. Pour une variable de registre, ceci indique quel registre il est gardé dedans. Pour non-enregistrez la variable locale, ceci imprime l'empiler-armature excentrée à laquelle la variable est toujours stockée.

Notez le contraste avec copie de ` etsymbole'qui ne fonctionne pas du tout pour une variable de registre, et pour une variable locale de pile imprime l'adresse exacte de l'instantiation courant de la variable.

symbole d'information addr

Imprimez le nom d'un symbole qui est stocké à l'adresse addr. Si aucun symbole n'est stocké exactement à addrGDB imprime le symbole le plus proche et un excentrage de lui:

(gdb) initialize_vx du symbole 0x54320 d'information _ + 396 dans le text de section

C'est l'opposé du adresse d'information commande. Vous pouvez l'employer pour découvrir le nom d'une variable ou d'une fonction donnée son adresse.

whatis expr

Imprimez le type de données d'expression expr. expr n'est pas évalué réellement, et aucune opération côté-effectuante (telle que des tÃ¢ches ou des appels de fonction) à l'intérieur il ne ont pas lieu. Voir les expressions de section .

whatis

Imprimez le type de données de $la dernière valeur dans l'histoire de valeur.

ptype typename

Imprimez une description de type de données typename. typename peut être le nom d'un type, ou pour le code de C il peut avoir la forme classe de ` classe-nom' struct de ` struct-étiquette' union de ` union-étiquette' ou enum de ` enum-étiquette'.

ptype expr

ptype

Imprimez une description du type d'expression expr. ptype diffère de whatis en imprimant une description détaillée, au lieu juste du nom du type.

Par exemple, pour cette déclaration variable:

complexe de struct { double vrai; double imag; } v;

les deux commandes donnent ce rendement:

type des whatis v (de gdb ) = type du ptype v de struct (gdb) = complexe complexes de struct { double vrai; double imag; }

Comme avec whatisen utilisant ptype sans argument se rapporte au type de $la dernière valeur dans l'histoire de valeur.

types d'information regexp

types d'information

Imprimez une executee description de tous les types dont les noms s'assortissent regexp (ou tout saisit votre programme, si vous ne fournissez aucun argument). Chaque typename complet est assorti comme si c'étaient une ligne complète; ainsi, valeur de type du ` i ' fournit l'information sur le tout saisit votre programme dont les noms incluent la corde valeurmais type ^value$ du ` i ' fournit l'information seulement sur les types dont le nom complet est valeur.

Cette commande diffère de ptype de deux manières: premier, comme whatisil n'imprime pas une description détaillée; en second lieu, il énumère tous les fichiers source où un type est défini.

portée d'information addr

Enumérez toutes les variables locales à une portée particulière. Cette commande accepte un endroit -- un nom de fonction, une ligne de source, ou une adresse précédée par a ` * 'et copies toutes les variables locales à la portée définie par cet endroit. Par exemple:

(gdb) place de command_line_handler de portée d'information pour le command_line_handler: Le rl de symbole est un argument à stack/frame a excentré 8, la longueur 4. Le linebuffer de symbole est dans le stockage statique à l'adresse 0x150a18, la longueur 4. Le linelength de symbole est dans le stockage statique à l'adresse 0x150aç, la longueur 4. Le symbole p est une variable locale dans le registre $$esi, la longueur 4. Le symbole p1 est une variable locale dans le registre $$ebx, la longueur 4. Le nline de symbole est une variable locale dans le registre $$edx, la longueur 4. La répétition de symbole est une variable locale à l'armature a excentré -8, la longueur 4.

Cette commande est particulièrement utile pour déterminer quelles données à rassembler pendant une trace expérimentez , voient pour se rassembler .

source d'information

Montrez les informations sur le fichier source courant -- c'est-à-dire, le fichier source pour la fonction contenant le point courant d'exécution:

le nom du fichier source, et l'annuaire le contenant,

l'annuaire il a été compilé dedans,

sa longueur, dans les lignes,

quel langage de programmation on lui écrit dedans,

si l'exécutable inclut l'information de mise en point pour ce dossier, et si oui, dans quel format l'information est (par exemple, des COUPS, nain 2, etc.), et

si l'information de mise en point inclut des informations sur des macros de préprocesseur.

sources d'information

Imprimez les noms de tous les fichiers source dans votre programme pour lequel il y a d'information de mise en point, organisés en deux listes: dossiers dont les symboles ont été déjà lus, et dossiers dont les symboles seront lus quand nécessaires.

fonctions d'information

Imprimez les noms et les types de données de toutes les fonctions définies.

fonctions d'information regexp

Imprimez les noms et les types de données de toutes les fonctions définies dont les noms contiennent une allumette pour l'expression régulière regexp. Ainsi, step d'amusement d'information de ` ' trouve toutes les fonctions dont les noms incluent step ^step d'amusement d'information de ` ' trouve ceux par dont les noms commencent step. Si un nom de fonction contient les caractères qui sont en conflit avec la langue régulière d'expression (par exemple operator*(de `) 'ils peuvent être cités avec un antislash.

variables d'information

Imprimez les noms et les types de données de toutes les variables qui sont déclarées en dehors de des fonctions (c.-à-d. à l'exclusion des variables locales).

variables d'information regexp

Imprimez les noms et les types de données de toutes les variables (excepté des variables locales) dont les noms contiennent une allumette pour l'expression régulière regexp.

classes d'information

classes d'information regexp

Montrez toutes les classes Objectives-C dans votre programme, ou (avec regexp argument) tout ceux assortissant une expression régulière particulière.

sélecteurs d'information

sélecteurs d'information regexp

Montrez tous les sélecteurs Objectifs-C dans votre programme, ou (avec regexp argument) tout ceux assortissant une expression régulière particulière.

Quelques systèmes permettent les différents fichiers d'exécution qui composent votre programme à remplacer sans arrêter et remettre en marche votre programme. Par exemple, dans VxWorks vous pouvez simplement recompile un fichier et une subsistance d'exécution défectueux sur démarrer. Si vous executez sur un de ces systèmes, vous pouvez permettre à GDB de recharger les symboles pour automatiquement relinked des modules:

symbole-rechargement réglé dessus

Remplacez les définitions de symbole pour le fichier source correspondant quand un fichier d'exécution avec un nom particulier est revu.

placez le symbole-rechargement au loin

Ne remplacez pas les définitions de symbole en rencontrant des fichiers d'exécution du même nom plus d'une fois. C'est l'état de défaut; si vous ne executez pas sur un système qui permet relinking automatique des modules, vous devriez partir symbole-rechargement outre de, puisqu'autrement GDB peut jeter des symboles en liant de grands programmes, cela peut contenir plusieurs modules (de différents annuaires ou bibliothèques) avec le même nom.

montrez le symbole-rechargement

Montrez le courant sur ou outre de arrangement.

placez l'opaque-type-résolution dessus

Dites GDB de résoudre les types opaques. Un type opaque est un type avoué comme indicateur à a struct classeou unionpour l'exemple, struct MyType *qu'est employé dans un fichier source bien que la pleine déclaration de struct MyType est dans un autre fichier source. Le défaut est allumé.

Un changement de l'arrangement de ce commande secondaire n'entrera pas en vigueur avant la prochaine fois que des symboles pour un dossier sont chargés.

placez l'opaque-type-résolution au loin

Dites GDB de ne pas résoudre les types opaques. Dans ce cas-ci, le type est imprimé comme suit:

{ < aucunes zones d'information > }

montrez l'opaque-type-résolution

Montrez si des types opaques sont résolus ou pas.

symboles d'impression de maint nom de fichier

psymbols d'impression de maint nom de fichier

msymbols d'impression de maint nom de fichier

Ecrivez une décharge des données de symbole de correction dans le dossier nom de fichier. Ces commandes sont utilisées comme moyen de corriger le code de symbole-lecture de GDB. Seulement les symboles avec des données de correction sont inclus. Si vous employez symboles d'impression de maint de `GDB inclut tous les symboles pour lesquels il a déjà rassemblé les détails complets: c'est-à-dire, nom de fichier reflète des symboles pour seulement ces dossiers dont les symboles GDB a lus. Vous pouvez employer la commande sources d'information pour découvrir qui classe ceux-ci sont. Si vous employez psymbols d'impression de maint de ` au lieu de cela, la décharge montre des informations sur des symboles que GDB sait seulement partiellement -- c'est-à-dire, les symboles définis dans les dossiers que GDB a écrémés, mais lisent pas encore complètement. En conclusion, msymbols d'impression de maint de ` décharges juste l'information minimale de symbole requise pour chaque fichier d'exécution duquel GDB a lu quelques symboles. Voir les commandes de section d'indiquer des dossiers , pour une discussion de la façon dont GDB lit des symboles (dans la description de symbole-dossier

symtabs d'information de maint [ regexp ]

psymtabs d'information de maint [ regexp ]

Enumérez symtab de struct ou partial_symtab de struct structures dont les noms s'assortissent regexp. Si regexp n'est pas donné, ne les énumère pas tous. la sortieinclut les expressions que vous pouvez copier dans un GDB corrigeant celui-ci pour examiner une structure particulière en plus détail. Par exemple:

le readin des psymtabs dwarf2read d'information de maint (de gdb ) { objfile/ home/gnu/build/gdb/gdb ((struct objfile *) 0x8è69d0) { psymtab/home/gnu/src/gdb/dwarf2read.c ((partial_symtab de struct *) 0x8474b10) aucun texte (nul) de fullname adresse 0x814d3c8 -- les globals 0x8158074 (* (statics de **) 0x8507a08 de partial_symbol de struct @ 9) (* (**) 0x40e95b78 @ 2882 de partial_symbol de struct) dépendances (aucune) } } des symtabs d'information de maint (de gdb) (gdb)

Nous voyons qu'il y a une table de symbole partielle dont le nom de fichier contient la corde ` dwarf2read 'appartenant au gdb de ` ' exécutable; et nous voyons que GDB n'a lu dedans aucun symtabs pourtant du tout. Si nous plaçons un break sur une fonction, cela fera lire GDB le symtab pour l'unité de compilation contenant cette fonction:

(gdb) cassez le break 1 de dwarf2_psymtab_to_symtab à 0x81ê5da: dossier/home/gnu/src/gdb/dwarf2read.c, ligne 1574. blockvector (nul) (nul ) de fullname de dirname de symtabs d'information de maint (de gdb) { objfile/home/gnu/build/gdb/gdb ((struct objfile *) 0x8è69d0) { symtab/home/gnu/src/gdb/dwarf2read.c ((symtab de struct *) 0x86c1f38) ((blockvector de struct *) 0x86c1bd0) (primaire)

NAIN 2 } } ( gdb) de debugformat

14. Changement De l'Exécution

Une fois que vous pensez vous avez trouvé une erreur dans votre programme, vous pourriez vouloir découvrir pour certain si corriger l'erreur apparente mènerait à corriger des résultats dans le reste de la course. Vous pouvez trouver la réponse par expérience, en utilisant les devices de GDB pour changer l'exécution du programme.

Par exemple, vous pouvez stocker de nouvelles valeurs dans des variables ou des endroits de mémoire, donner à votre programme un signal, le remettre en marche à une adresse différente, ou même retourner pr3maturément d'une fonction.

14,1 TÃ¢che aux variables

Pour changer la valeur d'une variable, évaluez une expression de tÃ¢che. Voir les expressions de section . Par exemple,

Â

copie x=4

stocke la valeur 4 dans la variable Xet imprime alors la valeur de l'expression de tÃ¢che (qui est 4). Voir la section en utilisant GDB avec différentes langues , pour plus d'information sur des opérateurs dans des langues soutenues.

Si vous n'êtes pas intéressé à voir la valeur de la tÃ¢che, employez placez commandez au lieu du copie commande. ensemble est vraiment le même que copie sauf que la valeur de l'expression n'est pas imprimée et n'est pas mise dans l'histoire de valeur (voir la section évaluer l'histoire ). L'expression est évaluée seulement pour ses effets.

Si le commencement de la corde d'argument du ensemble la commande semble identique à a ensemble le commande secondaire, emploient variable réglée commande au lieu de juste ensemble. Cette commande est identique à ensemble excepté son manque de commandes secondaires. Par exemple, si votre programme a une variable largeurvous obtenez une erreur si vous essayez de placer une nouvelle valeur avec juste ` width=13 réglé 'parce que GDB a la commande set width

Â

le type de largeur de whatis (de gdb ) = la largeur $4 = 13 de double ( gdb) p (gdb) ont placé la syntaxe width=47 inadmissible dans l'expression.

L'expression inadmissible, naturellement, est `=47 '. Afin de placer réellement le programme variable largeurutilisation

Â

(gdb) placez la variété width=47

Puisque ensemble la commande a beaucoup de commandes secondaires qui peuvent être en conflit avec les noms des variables de programme, il est une bonne idée d'employer variable réglée commande au lieu de juste ensemble. Par exemple, si votre programme a une variable gvous executez dans des problèmes si vous essayez de placer une nouvelle valeur avec juste ` g=4 réglé 'parce que GDB a la commande placez le gnutargetabrégé placez g

Â

le type des whatis g (de gdb ) = le double (gdb) p g $1 = 1 (gdb) ont placé g=4 (gdb) p r de g $2 = 1 (gdb) que le programme étant corrigé a été déjà commencé. Commencez-l'à partir du commencement? (y ou n) programme commençant de y: "/home/smith/cc_progs/a.out ": ne peut pas s'ouvrir pour lire des symboles: Cible inadmissible de bfd. (gdb) montrez que g la cible courante de BFD est "= 4".

La variable de programme g n'a pas changé, et vous avez silencieusement placé gnutarget à une valeur inadmissible. Afin de placer la variable gutilisation

Â

(gdb) placez la variété g=4

GDB permet des conversions plus implicites dans les tÃ¢ches que C; vous pouvez librement stocker une valeur de nombre entier dans une variable d'indicateur ou vice versa, et vous pouvez convertir n'importe quelle structure en n'importe quelle autre structure qui est la même longueur ou plus executee.

Pour stocker des valeurs dans les endroits arbitraires dans la mémoire, employez ` { ... } ' construction pour produire d'une valeur de type indiqué à une adresse indiquée (voir les expressions de section ). Par exemple, { int}0x83040 se rapporte à l'endroit de mémoire 0x83040 comme nombre entier (qui implique une certaines taille et représentation dans la mémoire), et

Â

placez { int}0x83040 = 4

stocke la valeur 4 dans cet endroit de mémoire.

14,2 Continuer à une adresse différente

D'habitude, quand vous continuez votre programme, vous faites ainsi à l'endroit où il s'est arrêté, avec continuez commande. Vous pouvez à la place continuer à une adresse de votre propre choix, avec les commandes suivantes:

saut linespec

Exécution de résumé à la ligne linespec. L'exécution s'arrête encore immédiatement s'il y a un break là. Voir la section imprimer des lignes de source , pour une description des différentes formes de linespec. Il est dans des habitudes courants d'employer tbreak commande en même temps que saut. Voir la section placer des breaks .

saut la commande ne change pas l'armature courante de pile, ou l'indicateur de pile, ou le contenu d'aucun endroit de mémoire ou d'aucun registre autre que le compteur de programme. Si ligne linespec est dans une fonction différente de celle actuellement l'exécution, les résultats peuvent être bizarres si les deux fonctions s'attendent à de différents modèles des arguments ou des variables locales. Pour cette raison, saut la commande demande la confirmation si la ligne indiquée n'est pas dans la fonction s'exécutant actuellement. Cependant, même les résultats bizarres sont prévisibles si vous êtes bien mis au courant du code de langage machine de votre programme.

saut *adresse

Exécution de résumé à l'instruction à l'adresse adresse.

Sur beaucoup de systèmes, vous pouvez obtenir plus ou moins le même effet que saut commandez en stockant une nouvelle valeur dans le registre $$pc. La différence est que ceci ne commence pas votre fonctionnement de programme; elle change seulement l'adresse d'où elle fonctionnera quand vous continuez. Par exemple,

Â

ensemble $$pc = 0x485

fait le prochain continuez la commande ou la commande d'progression s'exécutent à l'adresse 0x485plutôt qu'à l'adresse où votre programme s'est arrêté. Voir la section continuer et faire un pas .

L'occasion la plus commune pour employer saut la commande doit soutenir -- peut-être avec plus de breaks réglés -- au-dessus d'une partie d'un programme qui s'est déjà exécuté, afin d'examiner son exécution en plus détail.

14,3 Donnant à votre programme un signal

signal signal

Reprenez l'exécution où votre programme s'est arrêté, mais donnez-immédiatement lui le signal signal. signal peut être le nom ou le nombre d'un signal. Par exemple, sur beaucoup de systèmes signal 2 et signal SIGINT sont les deux manières d'envoyer un signal d'interruption.

Alternativement, si signal est zéro, continue l'exécution sans donner un signal. C'est utile quand votre programme arrêté à cause d'un signal et ordinaire verrait le signal une fois repris avec continuez commande; signal 0'de ` le cause au résumé sans signal.

signal ne répète pas quand vous serrez Retour une deuxième fois après exécution de la commande.

Appel signal la commande n'est pas identique à l'appel mise à mort utilité de la shell. Envoi d'un signal avec mise à mort fait décider GDB quoi faire avec le signal selon le signal manipulant des tables (voir les signaux de la section 5,3 ). signal la commande passe le signal directement à votre programme.

14,4 Renvoi d'une fonction

retour

retour expression

Vous pouvez décommander l'exécution d'un appel de fonction avec retour commande. Si vous donnez expression l'argument, sa valeur est employé comme la valeur de retour de la fonction.

Quand vous employez retourGDB jette l'armature choisie de pile (et toutes les armatures dans elle). Vous pouvez penser à ceci comme faisant le retour jeté d'armature pr3maturément. Si vous souhaitez indiquer une valeur à retourner, donnez cette valeur comme argument à retournez.

Ceci saute l'armature choisie de pile (voir la section choisir une armature ), et toutes les autres armatures à l'intérieur d'elle, laissant son visiteur comme armature restante les plus secrets. Que l'armature devient a choisi. La valeur indiquée est stockée dans les registres utilisés pour renvoyer des valeurs des fonctions.

retour la commande ne reprend pas l'exécution; elle laisse le programme arrêté dans le déclarer qui existerait si la fonction était juste retournée. En revanche, finition la commande (voir la section continuer et faire un pas ) reprend l'exécution jusqu'à ce que l'armature choisie de pile retourne naturellement.

14,5 Fonctions de programme d'appel

appel expr

Evaluez l'expression expr sans montrer vide valeurs retournées.

Vous pouvez employer cette variante de copie commandez si vous voulez exécuter une fonction de votre programme, mais sans encombrer la sortieavec vide valeurs retournées. Si le résultat n'est pas vide, il est imprimé et sauvé dans l'histoire de valeur.

14,6 Programmes de raccordement

Par défaut, GDB ouvre le dossier contenant le code exécutable de votre programme (ou le corefile) inaltérable. Ceci empêche des changements accidentels au code machine; mais il vous empêche également de raccorder intentionnellement votre programme binaire.

Si vous voudriez pouvoir raccorder le binaire, vous pouvez indiquer cela explicitement avec placez écrivent commande. Par exemple, vous pourriez vouloir allumer les drapeaux internes de correction, ou même dépanner secours.

placez écrivent dessus

l'ensemble amortissent

Si vous indiquez l'ensemble de ` écrivent sur 'GDB ouvre les dossiers exécutables et de noyau pour la lecture et l'écriture; si vous indiquez l'ensemble de ` amortissent ' (le défaut), GDB les ouvre inaltérables.

Si vous avez déjà chargé un dossier, vous devez le charger encore (employer exec-dossier ou noyau-dossier commande) après avoir changé placez écriventpour votre nouvel arrangement pour entrer en vigueur.

montrez écrivent

Affichage si des dossiers exécutables et les dossiers de noyau sont ouverts pour l'écriture aussi bien que la lecture.

15. Dossiers de GDB

GDB doit savoir le nom de fichier du programme à corriger, de tous les deux afin de lire sa table de symbole et afin de commencer votre programme. Pour corriger un vidage d'mémoire d'une course précédente, vous devez également dire à GDB le nom du dossier de vidage d'mémoire.

15,1 Commandes d'indiquer des dossiers

Vous pouvez vouloir indiquer des noms de dossier exécutable et d'mémoire de vidage. La manière habituelle de faire ceci a lieu au temps de mise en train, en utilisant les arguments aux commandes de la mise en train de GDB (voir la section obtenir dans et hors de GDB ).

De temps en temps il est nécessaire de changer en un dossier différent pendant une session de GDB. Ou vous pouvez démarrer GDB et oublier d'indiquer un dossier que vous voulez employer. Dans ces situations que le GDB commande d'indiquer de nouveaux dossiers soyez utile.

dossier nom de fichier

Utilisation nom de fichier comme le programme à corriger.

On le lit pour ses symboles et pour le contenu de la mémoire pure. C'est également le programme exécuté quand vous employez course commande. Si vous n'indiquez pas un annuaire et le dossier n'est pas trouvé dans l'annuaire de fonctionnement de GDB, GDB emploie la variable d'environnement CHEMIN comme liste d'annuaires à rechercher, juste comme la shell en recherchant un programme pour démarrer. Vous pouvez changer la valeur de cette variable, pour les deux GDB et votre programme, employer chemin commande.

Sur des systèmes avec les dossiers mémoire-tracés, un dossier auxiliaire a appelé le `nom de fichierle syms' peut tenir l'information de table de symbole pour nom de fichier. Si oui, GDB trace dans la table de symbole du `nom de fichiersyms', commençant vers le haut de plus rapidement. Voyez les descriptions des options de dossier `-tracé ' et `-readnow ' (disponible sur la ligne de commande, et avec les commandes dossier symbole-dossierou ajouter-symbole-dossierdécrit ci-dessous), pour plus d'information.

dossier

dossier sur sans l'écart des marques GDB d'argument n'importe quelle information il a le dossier exécutable et la table de symbole.

exec-dossier [ nom de fichier ]

Indiquez que le programme à démarrer (mais pas la table de symbole) est trouvé dedans nom de fichier. GDB recherche la variable d'environnement CHEMIN au besoin pour localiser votre programme. Omettre nom de fichier moyens de jeter l'information sur le dossier exécutable.

symbole-dossier [ nom de fichier ]

Lisez l'information de table de symbole à partir du dossier nom de fichier. CHEMIN est recherché si nécessaire. Employez dossier commandez d'obtenir la table de symbole et le programme de démarrer à partir du même dossier.

symbole-dossier sans l'argument dégage dehors l'information de GDB sur la table de symbole de votre programme.

symbole-dossier la commande fait oublier GDB les teneurs de ses variables de convenance, de l'histoire de valeur, et de tous les breaks et automobile-montre des expressions. C'est parce qu'elles peuvent contenir des indicateurs aux symboles d'enregistrement de données et aux types de données internes, qui font partie des vieilles données de table de symbole étant GDB intérieurs jetés.

symbole-dossier ne répète pas si vous serrez Retour encore après l'avoir exécuté une fois.

Quand GDB est configuré pour un environnement particulier, il comprend l'information de mise en point dans quelque format soit la norme produite pour cet environnement; peuvent vous employer un compilateur de GNU, ou d'autres compilateurs qui adhèrent aux conventions locales. Les meilleurs résultats sont habituellement obtenus à partir des compilateurs de GNU; par exemple, employer GCC vous pouvez produire de l'information de mise en point pour le code optimisé.

Pour la plupart des genres de fichiers d'exécution, excepté les vieux systèmes SVR3 en utilisant COFF, symbole-dossier la commande ne lit pas normalement la table de symbole dedans complètement tout de suite. Au lieu de cela, elle balaye la table de symbole rapidement pour trouver quels fichiers source et quels symboles sont présents. Les détails sont lus plus tard, un fichier source à la fois, car ils sont nécessaires.

Le but de cette stratégie à deux étages de lecture est de faire GDB commencer vers le haut plus rapidement. Pour la plupart, il est invisible excepté des pauses occasionnelles tandis que les détails de table de symbole pour un fichier source particulier sont lus. ( bavard réglé la commande peut transformer ces pauses en messages si désirée. Voyez) les avertissements facultatifs de section et les messages.

Nous n'avons pas mis en application la stratégie à deux étages pour COFF encore. Quand la table de symbole est stockée dans le format de COFF, symbole-dossier lit les données de table de symbole dedans complètement tout de suite. Notez que "stabs-in-COFF" fait toujours la stratégie à deux étages, puisque l'information de correction est réellement poignarde dedans le format.

symbole-dossier nom de fichier [ - readnow ] [ - tracé ]

dossier nom de fichier [ - readnow ] [ - tracé ]

Vous pouvez dépasser la stratégie à deux étages de GDB pour des tables de symbole de lecture en employant `-readnow ' l'option avec n'importe laquelle des commandes qui chargent l'information de table de symbole, si vous voulez être GDB sûrs a la table de symbole entière disponible.

Si mémoire-tracé les dossiers sont disponibles sur votre système par mmap appel de système, vous pouvez employer une autre option, `-tracé 'pour faire écrire GDB les symboles pour votre programme dans un dossier réutilisable. Les sessions de correction du futur GDB tracent dans l'information de symbole à partir de ce dossier auxiliaire de symbole (si le programme n'a pas changé), plutôt que temps de dépense lisant la table de symbole du programme exécutable. Employer `-tracé ' l'option a le même effet que commençant GDB avec `-tracé ' option de commande-ligne.

Vous pouvez employer les deux options ensemble, pour vous assurer le dossier auxiliaire de symbole a toute l'information de symbole pour votre programme.

Le dossier auxiliaire de symbole pour un programme a appelé myprog s'appelle `myprogsyms'. Une fois que ce dossier existe (à condition qu'il est plus nouveau que la correspondance exécutable), GDB essaye toujours de l'employer quand vous corrigez myprogaucune option spéciale ou commande n'est nécessaire.

Le dossier de `.syms'est spécifique à l'ordinateur central où vous executez GDB. Il tient une image exacte de la table de symbole interne de GDB. Il ne peut pas être partagé à travers les plateformes multiples de centre serveur.

noyau-dossier [ nom de fichier ]

Indiquez le lieu d'un dossier de vidage d'mémoire à employer comme "contenu de mémoire". Traditionnellement, les dossiers de noyau contiennent seulement quelques parties de l'espace adresse du processus qui a produit d'elles; GDB peut accéder au dossier exécutable lui-même pour d'autres pièces.

noyau-dossier sans l'argument indique qu'aucun core file ne doit être employé.

Notez que le core file est ignoré quand votre programme fonctionne réellement sous GDB. So, si vous aviez exécuté votre programme et vous souhaitez corriger un core file à la place, vous doit tuer le sous-processus dans lequel le programme fonctionne. Pour faire ceci, employez mise à mort commande (voir la section tuer le processus d'enfant ).

ajouter-symbole-dossier nom de fichier adresse

ajouter-symbole-dossier nom de fichier adresse [ - readnow ] [ - tracé ]

ajouter-symbole-dossier nom de fichier - ssection adresse ...

ajouter-symbole-dossier la commande lit l'information additionnelle de table de symbole à partir du dossier nom de fichier. Vous emploieriez cette commande quand nom de fichier a été dynamiquement chargé (par quelques autres moyens) dans le programme qui fonctionne. adresse si soyez l'adresse de mémoire à laquelle le dossier a été chargé; GDB ne peut pas figurer ceci dehors pour lui-même. Vous pouvez en plus indiquer un nombre arbitraire de `-ssection adresse' des paires, pour donner un nom explicite de section et adresse de base pour cette section. Vous en pouvez indiquer adresse comme expression.

La table de symbole du dossier nom de fichier est ajouté à la table de symbole à l'origine lue avec symbole-dossier commande. Vous pouvez employer ajouter-symbole-dossier commandez tout nombre de fois; les nouvelles données de symbole ont ainsi lu des subsistances s'ajoutant au vieux. Pour jeter toutes les vieilles données de symbole à la place, employez symbole-dossier commande sans tous arguments.

Bien que nom de fichier est typiquement un dossier de bibliothèque partagée, un dossier exécutable, ou un autre fichier d'exécution qui a été entièrement replacé pour charger dans un processus, vous pouvez également charger l'information symbolique dossiers de `.o réadressable des ', aussi longtemps que:

l'information symbolique du dossier se réfère seulement aux symboles d'éditeur de liens définis du fait dossier, pas aux symboles définis par d'autres fichiers d'exécution,

chaque section que l'information symbolique du dossier se rapporte a été chargée réellement dans l'inférieur, pendant qu'elle apparaît dans le dossier, et

vous pouvez déterminer l'adresse à laquelle chaque section a été chargée, et fournir ces derniers au ajouter-symbole-dossier commande.

Certains ont inclus les logiciels d'exploitation, comme le soleil Chorus et VxWorks, peut charger les dossiers réadressables dans un programme fonctionnant déjà; de tels systèmes prévoient typiquement les exigences au-dessus de facile à se réunir. Cependant, il est important d'identifier que beaucoup de systèmes indigènes emploient des procédures complexes de lien (linkonce sectionnez la table de factorisation et de constructeur de C++, par exemple) ce prévoyez les exigences difficiles à se réunir. En général, on ne peut pas assumer cela qui emploie ajouter-symbole-dossier lire une information symbolique réadressable du fichier d'exécution aura le même effet qu'incorporant le fichier d'exécution réadressable dans le programme de la manière normale.

ajouter-symbole-dossier ne répète pas si vous serrez Retour après l'avoir employé.

Vous pouvez employer `-tracé ' et `-readnow ' options juste comme avec symbole-dossier commandez, de changer pour comment GDB contrôle l'information de table de symbole nom de fichier.

ajouter-partager-symbole-dossier

ajouter-partager-symbole-dossier la commande peut être employée seulement sous le logiciel d'exploitation du CXUX de Harris pour le Motorola 88k. GDB recherche automatiquement les bibliothèques partagées, cependant si GDB ne trouve pas le vôtre, vous pouvez démarrer ajouter-partager-symbole-dossier. Il ne prend aucun argument.

section

section la commande change l'adresse de base de la SECTION de section du dossier d'exec en ADDR. Ceci peut être employé si le dossier d'exec ne contient pas des adresses de section, (comme dans le format d'a.out), ou quand les adresses indiquées dans le dossier lui-même sont erronées. Chaque section doit être changée séparément. dossiers d'information commandez, décrit ci-dessous, des listes toutes les sections et leurs adresses.

dossiers d'information

cible d'information

dossiers d'information et cible d'information soyez synonyme; imprimez la cible courante (voir la section indiquer une cible de correction ), y compris les noms des dossiers exécutable et d'mémoire de vidage actuellement en service par GDB, et les dossiers dont des symboles ont été chargés. La commande cible d'aide énumère toutes les cibles possibles plutôt que courant ceux.

sections d'information de maint

Une autre commande qui peut vous fournir des informations supplémentaires sur des sections de programme est sections d'information de maint. En plus de l'information de section montrée près dossiers d'informationcette commande montre l'excentrage de drapeaux et de dossier de chaque section dans les dossiers exécutable et d'mémoire de vidage. En outre, sections d'information de maint fournit les options suivantes de commande (qui peuvent être arbitrairement combinées):

ALLOBJ

Montrez les sections pour tous les fichiers d'exécution chargés, y compris les bibliothèques partagées.

sections

Information d'affichage seulement pour appelé sections.

section-drapeaux

Information d'affichage seulement pour les sections pour lesquelles section-drapeaux soyez vrai. Les drapeaux de section que GDB connaît actuellement sont environ:

ALLOC

La section aura l'espace assigné dans le processus quand chargée. L'ensemble pour toutes les sections excepté ceux qui contiennent corrigent l'information.

CHARGE

La section sera chargée à partir du dossier dans la mémoire de processus d'enfant. Placez pour le code et les données préinitialisés, espace libre pour bss sections.

RELOCALISATION

La section doit être replacée avant le chargement.

FIXE

La section ne peut pas être modifiée par le processus d'enfant.

CODE

La section contient le code exécutable seulement.

DONNEES

La section contient des données seulement (aucun code exécutable).

ROM

La section résidera dans la ROM.

CONSTRUCTEUR

La section contient des données pour des listes de constructor/destructor.

HAS_contents

La section n'est pas vide.

NEVER_load

Une instruction à l'éditeur de liens de ne pas produire la section.

COFF_shared_library

Un avis à l'éditeur de liens que la section contient l'information de bibliothèque partagée de COFF.

IS_common

La section contient des symboles communs.

placez les confiance-fixe-sections dessus

Dites à GDB que les sections fixes dans votre fichier d'exécution sont vraiment inaltérables (c.-à-d. que leur contenu pas changement). Dans ce cas, GDB peut chercher des valeurs de ces sections hors du fichier d'exécution, plutôt que du programme de cible. Pour quelques cibles (notamment enfoncé), ceci peut être un perfectionnement significatif à l'exécution de correction.

Le défaut est éteint.

placez les confiance-fixe-sections au loin

Dites GDB de ne pas faire confiance aux sections fixes. Ceci signifie que le contenu de la section pourrait changer tandis que le programme fonctionne, et doit donc être cherché de la cible une fois nécessaire.

Toutes les commandes d'dossier-indication permettent des noms absolus et relatifs de dossier comme arguments. GDB toujours convertit le nom de fichier en nom de fichier absolu et se rappelle le de cette façon.

GDB soutient HP-ux, SunOS, SVr4, Irix 5, et bibliothèques partagées d'cIbm RS/6000.

GDB charge automatiquement des définitions de symbole des bibliothèques partagées quand vous employez course commandez, ou quand vous examinez un core file. (avant vous publiez executez commandez, GDB ne comprend pas des références à une fonction dans une bibliothèque partagée, toutefois -- à moins que vous corrigez un core file).

Sur HP-ux, si le programme charge une bibliothèque explicitement, GDB charge automatiquement les symboles à l'heure du shl_load appel.

Il y a des périodes, cependant, quand vous pouvez souhaiter charger pas automatiquement des définitions de symbole des bibliothèques partagées, comme quand elles sont particulièrement grandes ou il y a bon nombre d'entre elles.

Pour commander le chargement automatique des symboles de bibliothèque partagée, employez les commandes:

l'ensemble automobile-solib-s'ajoutent mode

Si mode est surdes symboles de toutes les bibliothèques des programmes résultants partagées seront chargés automatiquement quand l'inférieur commence l'exécution, vous attachent à un inférieur indépendamment commencé, ou quand l'éditeur de liens dynamique informe GDB qu'une nouvelle bibliothèque a été chargée. Si mode est outre dedes symboles doivent être chargés manuellement, employer sharedlibrary commande. La valeur par défaut est sur.

montrez automobile-solib-s'ajoutent

Montrez le mode autoloading courant.

Pour charger explicitement des symboles de bibliothèque partagée, employez sharedlibrary commande:

part d'information

information sharedlibrary

Imprimez les noms des bibliothèques partagées qui sont actuellement chargées.

sharedlibrary regex

part regex

Chargez les symboles partagés de bibliothèque des programmes résultants pour des dossiers assortissant une expression régulière d'Unix. Comme avec des dossiers a chargé automatiquement, elle charge seulement les bibliothèques partagées exigées par votre programme pour un core file ou après la tapez course. Si regex est omis toutes les bibliothèques partagées requises par votre programme sont chargés.

Sur quelques systèmes, tels que les systèmes HP-ux, GDB soutient des symboles autoloading de bibliothèque partagée jusqu'à ce qu'une taille limiteuse de seuil soit atteinte. Ceci fournit l'avantage de laisser autoloading pour rester dessus à côté de défaut, mais l'évite d'autoloading les bibliothèques partagées excessivement grandes, jusqu'à un seuil qui est au commencement placé, mais qui vous pouvez modifier si vous souhaitez.

Au delà de ce seuil, des symboles des bibliothèques partagées doivent être explicitement chargés. Pour charger ces symboles, employez la commande sharedlibrary nom de fichier. L'adresse de base de la bibliothèque partagée est déterminée automatiquement par GDB et n'a pas besoin d'être indiquée.

Pour montrer ou placer le seuil, employez les commandes:

placez l'automobile-solib-limite seuil

Placez le seuil autoloading de taille, dans un nombre intégral de méga-octets. Si seuil est de non zéro et la bibliothèque partagée autoloading est permise, des symboles de toutes les bibliothèques des programmes résultants partagées sera chargée jusqu'à ce que toute la taille des symboles chargés de bibliothèque partagée excède ce seuil. Autrement, des symboles doivent être chargés manuellement, employer sharedlibrary commande. Le seuil de défaut est 100 (c.-à-d. mb 100).

montrez l'automobile-solib-limite

Montrez le seuil autoloading courant de taille, en méga-octets.

Des bibliothèques partagées sont également soutenues dans beaucoup croisent ou des configurations à distance de correction. Une copie des bibliothèques de la cible doit être présente sur le système hôte; elles doivent être identiques aux bibliothèques de cible, bien que les copies sur la cible puissent être dépouillées aussi longtemps que les copies sur le centre serveur ne sont pas.

Vous devez dire à GDB où les bibliothèques de cible sont, de sorte qu'il puisse charger les copies correctes -- autrement, il peut essayer de charger les bibliothèques du centre serveur. GDB a deux variables pour indiquer les annuaires de recherche pour des bibliothèques de cible.

placez le solib-absolu-préfixe chemin

Si cette variable est placée, chemin sera employé comme préfixe pour tous les chemins absolus de bibliothèque partagée; beaucoup de chargeurs d'exécution stockent les chemins absolus à la bibliothèque partagée dans la mémoire du programme de cible. Si vous employez solib-absolu-préfixe de ` ' pour trouver les bibliothèques partagées, elles doivent être présentées de la même manière qui elles sont sur la cible, hiérarchie avec par exemple `/usr/lib 'sous chemin.

Vous pouvez placer la valeur par défaut de solib-absolu-préfixe de ` ' en employant le configurer-temps ` -- avec-sysroot ' option.

montrez le solib-absolu-préfixe

Montrez le préfixe courant de bibliothèque partagée.

placez le solib-rechercher-chemin chemin

Si cette variable est placée, chemin est une liste deux points-séparée d'annuaires pour rechercher les bibliothèques partagées. solib-rechercher-chemin de ` ' est employé ensuite solib-absolu-préfixe de ` ' ne localise pas la bibliothèque, ou si le chemin à la bibliothèque est relatif au lieu de l'absolu. Si vous voulez employer solib-rechercher-chemin de ` ' au lieu de solib-absolu-préfixe de ` 'soyez sûr de placer solib-absolu-préfixe de ` ' à un annuaire nonexistant pour empêcher GDB de trouver les bibliothèques de votre centre serveur.

montrez le solib-rechercher-chemin

Montrez le chemin de recherche courant de bibliothèque partagée.

15,2 Information de mise en point dans les dossiers séparés

GDB vous permet de mettre l'information de mise en point d'un programme dans un dossier séparé de l'exécutable elle-même, d'une manière dont permet à GDB de trouver et charger l'information de mise en point automatiquement. Puisque l'information de mise en point peut être très grande -- parfois plus grand que le code exécutable lui-même -- quelques systèmes distribuent l'information de mise en point pour leurs executables dans les dossiers séparés, que les utilisateurs peuvent installer seulement quand ils doivent corriger un problème.

Si une information de mise en point exécutable a été extraite à un dossier séparé, l'exécutable devrait contenir un lien de correction donnant le nom du dossier d'information de mise en point (sans des composants d'annuaire), et une somme de son contenu. (la forme exacte d'un lien de correction est décrite ci-dessous.) Si le nom et prénoms de l'annuaire contenant l'exécutable est execdiret l'exécutable a un lien de correction qui indique le nom debugfilealors GDB recherchera automatiquement le dossier d'information de mise en point dans trois endroits:

l'annuaire contenant le dossier exécutable (c'est-à-dire, il recherchera un dossier appelé `execdirdebugfile',

un sous-répertoire de cet annuaire a appelé `.debug ' (c'est-à-dire, le ` de dossierexecdirdebugfile', et

un sous-répertoire du global corrigent l'annuaire de dossier qui inclut le plein chemin exécutable, et le nom du lien (c'est-à-dire, le ` de dossierglobaldebugdirexecdirdebugfile', où globaldebugdir est le global corrige l'annuaire de dossier, et execdir a été transformé en chemin relatif).

GDB vérifie sous chacun de ces noms un dossier d'information de mise en point dont les allumettes de somme qui données dans le lien, et lisent l'information de mise en point du premier qu'il trouve.

Ainsi, par exemple, si vous demandez GDB pour corriger `/usr/bin/ls', qui a un lien contenir le ` nommé ls.debug ', et les globaux corrigent l'annuaire sont `/usr/lib/debug ', alors GDB rechercheront corrigent l'information dans `/usr/bin/ls.debug ', `/usr/bin/.debug/ls.debug ', et `/usr/lib/debug/usr/bin/ls.debug '.

Vous pouvez placer le nom d'annuaire global d'information de correction, et regardez le nom GDB emploie actuellement.

placez l'corriger-dossier-annuaire annuaire

Placez l'annuaire au lequel GDB recherche les dossiers séparés d'information de mise en point annuaire.

montrez l'corriger-dossier-annuaire

Montrez les recherches de l'annuaire GDB des dossiers séparés d'information de mise en point.

Un lien de correction est une section spéciale du dossier exécutable appelé gnu_debuglink. La section doit contenir:

Un nom de fichier, tous les principaux composants d'annuaire étant coupés, a suivi d'un byte zéro,

zéro à trois bytes de la remplissage, comme nécessaires pour atteindre la prochaine frontière de quatre octets dans la section, et

une somme de quatre octets de CRC, stockée dans le même endianness utilisé pour le dossier exécutable lui-même. La somme est calculée sur contenu du dossier d'information de mise en point le plein par la fonction donnée ci-dessous, passant zéro en tant que crc argument.

N'importe quel format de dossier exécutable peut porter un lien de correction, aussi longtemps qu'il peut contenir une section appelée gnu_debuglink le contenu étant décrit ci-dessus.

Le dossier d'information de mise en point lui-même devrait être un exécutable ordinaire, contenant un ensemble complet des symboles d'éditeur de liens, des sections, et l'information de mise en point. Les sections du dossier d'information de mise en point devraient avoir les mêmes noms, adresses et tailles que le dossier original, mais elles n'ont pas besoin de ne contenir aucune donnée -- tout comme a bss section dans un ordinaire exécutable.

En date de décembre 2002, il n'y a aucune utilité standard de GNU pour produire exécutable séparé/des paires de dossier d'information de mise en point. Le paquet des elfutils de ` d'Ulrich Drepper, commençant par la version 0,53, contient une version de bande commandez tels que la commande foo de bande - f foo.debug enlève l'information de mise en point du foo de ` de dossier exécutable ', des endroits il dans le ` foo.debug de dossier ', et laisse un lien de correction dans le foo de ` '.

Puisqu'il y a beaucoup de différentes manières de calculer CRC's (polynômex, inversions, commande de byte, etc. différents), la manière la plus simple de décrire le CRC utilisé dedans gnu_debuglink les sections doit donner le code complet pour une fonction qui des calculs il:

Â

long gnu_debuglink_crc32 non signé (long crc non signé, char non signé * le buf, size_t len) { const statique long crc32_table[256 non signé ] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x70Ã£f48f, 0xe96Ã¡535, 0x9e649Ã¤3, 0x0edb8832, 0x79dcbÃ¥4, 0xe0dë91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0xÃ£b020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6dddeêb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0xÃ¥65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c6910ë, 0xd56041e4, 0xa2677172, 0x3c0é4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35bÃ¤8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,

0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de00Ã¡, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd510à, 0x71b18589, 0x06b6b51f, 0x9fbfeÃ¢5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7fÃ£0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0xç6c6162, 0x856530d8, 0xf26200ê, 0x6c069ëd, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0xÃ¡b55çe, 0xa3bc0074, 0xd4bb30e2, 0xÃ¢dfa541, 0x3dd895d7, 0xa4dç46d, 0xd3d6f4fb, 0x4369e9Ã£, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0xëdef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0xèb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6dÃ£é, 0x7aÃ£Ã¤a8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x870Ã¥3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7aÃ¤, 0x67ddÃ¢cc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6dÃ£é8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x3603Ã¢f6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fdà0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb4Ã¤92, 0x5cb3Ã£04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x75Ã£a39c, 0x026d930a, 0x9c090Ã£9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bfÃ¢82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1dê242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x8808Ã¤e6, 0xff0fÃ£70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf86àe69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70ddèe, 0xê048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0xé6e77db, 0xaed1Ã£Ã¢, 0xd9d6Ã¤dc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf2ç, 0xcabac2Ã¥, 0x53b39330, 0x24bÃ¢Ã¡6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667aè, 0xc461Ã¢b8, 0x5d681b02, 0xà6f2b94, 0xb40bbe37, 0xc30c8ea1, 0xÃ¤05df1b, 0x2d0èf8d }; char non signé * extrémité; crc = ~crc et 0xffffffff; pour (l'extrémité = le buf + len; buf < extrémité; ++buf) crc = crc32_table[(crc ^ * buf) et 0xff ] ^ (crc > > 8); ~crc de retour et 0xffffffff; }

15,3 Dossiers de symbole de lecture d'erreurs

Tout en lisant un dossier de symbole, GDB rencontre de temps en temps des problèmes, tels que des types de symbole il ne reconnaît pas, ou les bogues connus dans la sortiede compilateur. Par défaut, GDB ne vous informe pas de tels problèmes, puisqu'ils sont relativement communs et principalement d'intérêt de peuple les compilateurs de correction. Si vous êtes intéressé à voir des informations sur les tables de symbole malade-construites, vous pouvez l'un ou l'autre demander GDB pour imprimer seulement un message au sujet de chaque un tel type de problème, n'importe comment beaucoup de fois le problème se produit; ou vous pouvez demander GDB pour imprimer plus de messages, pour voir combien de fois les problèmes se produisent, avec placez les plaintes commande (voir des avertissements et les messages facultatifs de section ).

Les messages ont actuellement imprimé, et leurs significations, incluent:

bloc externe d'intérieur intérieur de bloc pas dedans symbole

L'information de symbole montre où les portées de symbole commencent et finissent (comme au début d'une fonction ou d'un bloc de rapports). Cette erreur indique qu'un bloc intérieur de portée n'est pas entièrement contenu dans ses blocs externes de portée.

GDB évite le problème en traitant le bloc intérieur comme si il a eu la même portée que le bloc externe. Dans le message d'erreur, symbole peut être montré comme "(ne savez pas)"si le bloc externe n'est pas une fonction.

bloc à adresse en panne

L'information de symbole pour des blocs de portée de symbole devrait se produire par ordre d'adresses croissantes. Cette erreur indique qu'elle ne fait pas ainsi.

GDB n'évite pas ce problème, et a l'ennui localiser des symboles dans le fichier source dont les symboles il lit. (vous pouvez souvent déterminer quel fichier source est affecté par l'indication ensemble bavard dessus. Voir des avertissements et les messages facultatifs de section .)

mauvaise adresse de début de bloc raccordée

L'information de symbole pour un bloc de portée de symbole a une adresse de début plus petite que l'adresse de la ligne de source précédente. Ceci est connu pour se produire dans le compilateur de SunOS 4,1,1 (et plus tôt) C.

GDB évite le problème en traitant le bloc de portée de symbole comme commençant sur la ligne de source précédente.

la mauvaise table de corde a excentré dans le symbole n

Nombre de symbole n contient un indicateur dans la table de corde qui est plus grande que la taille de la table de corde.

GDB évite le problème en considérant le symbole avoir le nom fooqui peut poser d'autres problèmes si beaucoup de symboles finissent vers le haut avec ce nom.

type inconnu de symbole 0xnn

L'information de symbole contient les nouveaux types de données que GDB ne sait pas encore lire. 0xnn est le type de symbole de uncomprehended l'information, dans l'hexadécimal.

GDB évite l'erreur en ignorant cette information de symbole. Ceci vous permet habituellement de mettre votre programme au point, bien que certains symboles ne soient pas accessibles. Si vous rencontrez un tel problème et vous sentez comme le corriger, vous pouvez corriger gdb avec lui-même, break dessus plaignez-vousallez alors jusqu'à la fonction read_dbx_symtab et examinez * bufp pour voir le symbole.

le type de moignon a le nom NUL

GDB n'a pas pu trouver la définition complète pour un struct ou une classe.

disparus d'indicateur de const/volatile (bien si en utilisant g++ v1.x), obtenus ...

L'information de symbole pour une fonction de membre de C ++ manque de l'information que les versions récentes du compilateur devraient avoir produit pour lui.

disparité d'information entre le compilateur et le programme de mise au point

GDB n'a pas pu analyser des spécifications de type produites par le compilateur.

16. Indication d'une cible de correction

Une cible est l'environnement d'exécution occupé par votre programme.

Souvent, GDB fonctionne dans le même environnement de centre serveur que votre programme; dans ce cas, la cible de correction est indiquée comme effet secondaire quand vous employez dossier ou noyau commandes. Quand vous avez besoin de plus de flexibilité -- par exemple, courant GDB sur un centre serveur physiquement séparé, ou commandant un système autonome au-dessus d'une porte série ou un système en temps réel au-dessus d'un raccordement de TCP/ip -- vous pouvez employer cible commandez d'indiquer un des types de cible configurés pour GDB (voir les commandes de section pour des cibles de gestion ).

16,1 Cibles actives

Il y a trois classes des cibles: processus, dossiers de noyau, et dossiers exécutables. GDB peut fonctionner concurremment sur jusqu'à trois cibles actives, une dans chaque classe. Ceci vous permet (par exemple) de commencer un processus et d'inspecter son activité sans abandonner votre travail sur un core file.

Par exemple, si vous vous exécutez gdb a.out de ` 'puis le dossier exécutable a.out est la seule cible active. Si vous indiquez un core file aussi bien -- vraisemblablement d'une course antérieure qui s'est brisée et coredumped -- puis GDB a deux cibles actives et les emploie l'en tandem, regardant d'abord dans la cible corefile, alors dans le dossier exécutable, pour satisfaire des demandes des adresses de mémoire. (typiquement, ces deux classes de cible sont complémentaires, puisque les dossiers de noyau contiennent seulement la mémoire lecture/écriture d'un programme -- variables et ainsi de suite -- plus le statut de machine, alors que les dossiers exécutables contiennent seulement le texte de programme et les données initialisées.)

Quand vous tapez coursevotre dossier exécutable devient une cible de processus active aussi bien. Quand une cible de processus est en activité, toutes les commandes de GDB demandant des adresses de mémoire se rapportent à cette cible; des adresses dans une cible de fichier en cours d'utilisation de noyau ou de dossier exécutable sont obscurcies tandis que la cible de processus est en activité.

Employez noyau-dossier et exec-dossier commandes de choisir d'un nouveau ou cible exécutable (voir de section les commandes core file d'indiquer des dossiers ). Pour indiquer comme cible un processus qui fonctionne déjà, employez attachez commande (voir la section corriger un processus déjà-courant ).

16,2 Commandes pour des cibles de gestion

cible type paramètres

Relie l'environnement de centre serveur de GDB à un une machine cible ou processus. Une cible est typiquement un protocole pour parler aux fonctions de mise au point. Vous employez l'argument type pour indiquer le type ou protocole de la machine cible.

Autre paramètres sont interprétés par le protocole de cible, mais incluent typiquement des choses comme des noms de device ou des noms d'hôte pour se relier à, des nombres de processus, et des vitesses baud.

cible la commande ne répète pas si vous serrez Retour encore après exécution de la commande.

cible d'aide

Montre les noms de toutes les cibles disponibles. Pour montrer des cibles actuellement choisies, employez l'un ou l'autre cible d'information ou dossiers d'information (voir les commandes de section d'indiquer des dossiers ).

aidez à viser nom

Décrivez une cible particulière, y compris tous les paramètres nécessaires pour la choisir.

placez le gnutarget args

GDB emploie sa propre bibliothèque BFD pour lire vos dossiers. GDB sait s'il lit un exécutable , un noyau , ou un dossier d'o; cependant, vous pouvez indiquer le format de dossier avec placez le gnutarget commande. Ã€ la différence des la plupart cible commandes, avec gnutarget cible se rapporte à un programme, pas une machine.

Avertissement: Pour indiquer un format de dossier avec placez le gnutargetvous devez savoir le nom réel de BFD.

Voir les commandes de section d'indiquer des dossiers .

montrez le gnutarget

Employez montrez le gnutarget commandez de montrer quel format de dossier gnutarget est placé pour lire. Si vous n'avez pas placé gnutargetGDB déterminera le format de dossier pour chaque dossier automatiquement, et montrez le gnutarget affichages le ` la cible courante de BDF est "automobile" '.

Voici quelques cibles communes (disponibles, ou pas, selon la configuration de GDB):

exec de cible programme

Un dossier exécutable. exec de cible de ` programme' est le même que exec-dossier de ` programme'.

noyau de cible nom de fichier

Un dossier de vidage d'mémoire. noyau de cible de ` nom de fichier' est le même que noyau-dossier de ` nom de fichier'.

extérieur de cible réalisateur

Cible périodique à distance dans le protocole GDB-spécifique. L'argument réalisateur indique quel device périodique à employer pour le raccordement (par exemple `/dev/ttya '). Voyez la correction à distance de section . visez l'extérieur soutient charge commande. C'est seulement utile si vous avez une autre manière d'obtenir le moignon au système de cible, et vous pouvez le mettre quelque part dans la mémoire où il n'obtiendra pas clobbered par le téléchargement.

sim de cible

Simulateur d'unité centrale de traitement de Builtin. GDB inclut des simulateurs pour la plupart des architectures. En général,

course de charge de sim de cible

travaux; cependant, vous ne pouvez pas supposer qu'une carte mémoire spécifique, des modules de gestion de périphérique, ou même un I/o de base est disponible, bien que quelques simulateurs fournissent ces derniers. Pour l'information au sujet de tous les détails processeur-spécifiques de simulateur, voyez la section appropriée dans les processeurs incorporés .

Quelques configurations peuvent inclure ces cibles aussi bien:

nrom de cible réalisateur

Emulateur de ROM de NetROM. Appuis de cette cible seulement

téléchargement.

Les différentes cibles sont disponibles sur différentes configurations de GDB; votre configuration peut avoir plus ou peu de cibles.

Beaucoup de cibles à distance exigent de vous de télécharger le code exécutable une fois que vous avez avec succès établi un raccordement.

charge nom de fichier

Selon quelles fonctions de mise au point à distance sont configurées dans GDB, charge la commande peut être disponible. Là où elle existe, on le cense faire nom de fichier (un exécutable) disponible pour corriger sur le système à distance -- par le téléchargement, ou l'enchaînement dynamique, par exemple. charge enregistre également nom de fichier table de symbole dans GDB, comme ajouter-symbole-dossier commande.

Si votre GDB n'a pas a charge commandez, en essayant de l'exécuter reçoit le message d'erreur "Vous ne pouvez pas faire cela quand votre cible est ... "

Le dossier est chargé à quelqu'adresse soit indiquée dans l'exécutable. Pour quelques formats de fichier d'exécution, vous pouvez indiquer l'adresse de charge quand vous liez le programme; pour d'autres formats, comme a.out, le format de fichier d'exécution indique une adresse fixe.

charge ne répète pas si vous serrez Retour encore après l'avoir employé.

16,3 Ordre de choix de byte de cible

Quelques types de processeurs, tels que les MIPS, le PowerPC, et le Renesas SH, offrent la capacité de démarrer de grands-endian ou petits-endian ordres de byte. Habituellement l'exécutable ou le symbole inclura un peu pour indiquer l'endian-ness, et vous n'aurez pas besoin de vous inquiéter de ce que d'employer. Cependant, vous pouvez trouvaille immobile il utile pour ajuster l'idée de GDB de l'endian-ness de processeur manuellement.

grand endian réglé

Demandez à GDB pour supposer que la cible est grande-endian.

placez endian peu

Demandez à GDB pour supposer que la cible est petite-endian.

placez l'automobile endian

Demandez à GDB pour employer l'ordre de byte lié à l'exécutable.

montrez endian

Montrez l'idée courante de GDB de l'ordre de byte de cible.

Notez que ces commandes ajustent simplement l'interprétation des données symboliques sur le centre serveur, et qu'elles n'ont absolument aucun effet sur le système de cible.

16,4 Correction à distance

Si vous essayez de mettre un programme au point fonctionnant sur une machine qui ne peut pas démarrer GDB de la manière habituelle, il est souvent utile d'employer la correction à distance. Par exemple, vous pourriez employer la correction à distance sur un grain de logiciel d'exploitation, ou sur un système réduit qui n'a pas un logiciel d'exploitation tout usage assez puissant pour démarrer un programme de mise au point complet.

Quelques configurations de GDB ont la publication périodique spéciale ou les interfaces de TCP/ip pour faire ce travail avec les cibles particulières de correction. En outre, GDB vient avec un protocole périodique générique (spécifique à GDB, mais non spécifique à tout système de cible particulier) que vous pouvez employer si vous écrivez les moignons à distance -- le code qui fonctionne sur le système à distance pour communiquer avec GDB.

D'autres cibles à distance peuvent être disponibles dans votre configuration de GDB; utilisation cible d'aide à la liste elles.

16,5 Affichage D'Objet De Grain

Affichage d'objet de grain de soutien de quelques cibles. En utilisant ce service, GDB communique particulièrement avec le logiciel d'exploitation et les informations d'affichage fondamentaux de bidon sur actionner les objets au niveau système tels que des mutexes et d'autres objets de synchronisation. Exactement qui objecte peut être montré est déterminé sur une base par-OS.

Employez placez l'cOs commandez de placer le logiciel d'exploitation. Ceci indique à GDB quel module d'affichage d'objet de grain à initialiser:

Â

(gdb) placez le Cisco d'cOs

Si placez l'cOs réussit, GDB montrera quelques informations sur le logiciel d'exploitation, et créera un nouveau information commandez ce qui peut être employé pour questionner la cible. information la commande est baptisée du nom du logiciel d'exploitation:

Â

(gdb) la liste de Cisco d'information de grain de Cisco objecte la description d'objet toute et tous les objets

D'autres commandes secondaires peuvent être employés pour questionner au sujet des objets particuliers connus par le grain.

Il n'y a actuellement aucune manière de déterminer autre que si un logiciel d'exploitation donné est soutenu pour l'essayer.

17. Programmes à distance de correction

17,1 Se relier à une cible à distance

Sur l'ordinateur central de GDB, vous aurez besoin d'une copie non décollée de votre programme, puisque GDB a besoin du symobl et de l'information de mise en point. Commencez vers le haut GDB comme d'habitude, en utilisant le nom de la copie locale de votre programme comme premier argument.

Si vous employez une ligne périodique, vous pouvez vouloir donner GDB ` -- baud ' l'option, ou emploient placez le remotebaud commandez avant cible commande.

Après ce, employez visez l'extérieur pour établir des communications avec la machine cible. Son argument indique comment communiquer -- par l'intermédiaire d'un devicename attaché à une ligne périodique directe, ou d'un port de TCP ou de UDP (probablement à un serveur terminal qui a alternativement une ligne périodique à la cible). Par exemple, employer une ligne périodique reliée au device a appelé `/dev/ttyb ':

Â

extérieur de cible/dev/ttyb

Pour employer un raccordement de TCP, employez un argument de la forme centre serveurport ou tcp:centre serveurport. Par exemple, se relier au port 2828 sur un serveur terminal a appelé manyfarms

Â

cible manyfarms:2828 à distance

Si votre cible à distance fonctionne réellement sur la même machine que votre session de programme de mise au point (par exemple un simulateur de votre cible fonctionnant sur le même centre serveur), vous pouvez omettre le hostname. Par exemple, pour se relier au port 1234 sur votre machine locale:

Â

extérieur:1234 de cible

Notez que les deux points sont encore exigés ici.

Pour employer un raccordement de UDP, employez un argument de la forme UDP:centre serveurport. Par exemple, pour se relier au port 2828 de UDP sur un serveur terminal appelé manyfarms

Â

cible udp:manyfarms:2828 à distance

En utilisant un raccordement de UDP pour la correction à distance, vous devriez maintenir dans l'esprit qui le ` U 'représente "incertain". Le UDP peut silencieusement laisser tomber des paquets sur les réseaux occupés ou incertains, qui causeront le ravage avec votre session de correction.

Maintenant vous pouvez employer toutes les commandes habituelles d'examiner et changer des données et de faire un pas et de continuer le programme à distance.

Toutes les fois que GDB attend le programme à distance, si vous tapez le caractère d'interruption (souvent CcGDB essaye d'arrêter le programme. Ceci peut ou peut ne pas réussir, dépendant en partie du matériel et les conducteurs périodiques que le système à distance emploie. Si vous tapez le caractère d'interruption de nouveau, GDB montre ce message de sollicitation:

Â

Interrompu tout en attendant le programme. Donnez vers le haut (et cessez de le corriger)? (y ou n)

Si vous tapez yGDB abandonne la session à distance de correction. (si vous décidez vous voulez essayer encore plus tard, vous pouvez employer extérieur de cible de ` ' pour se relier encore une fois de plus.) Si vous tapez nGDB va de nouveau à l'attente.

détachez

Quand vous avez fini de mettre le programme au point à distance, vous pouvez employer détachez commandez de le libérer de la commande de GDB. Le détachement de la cible reprend normalement son exécution, mais les résultats dépendront de votre moignon à distance particulier. Après détachez commandez, GDB est libre pour se relier à une autre cible.

débranchez

débranchement la commande se comporte le goût détachezsauf que la cible n'est pas généralement reprise. Elle attendra GDB (cet exemple ou encore) pour se relier et continuer de corriger. Après débranchement commandez, GDB est encore libre pour se relier à une autre cible.

17,2 Employer gdbserver programme

gdbserver est un programme de gestion pour par l'intermédiaire dont Unix-comme des systèmes, vous permet de relier votre programme à un GDB à distance extérieur de ciblemais sans lier dans le moignon habituel de correction.

gdbserver n'est pas un remplacement complet pour les moignons de correction, parce qu'il exige essentiellement les mêmes équipements du système d'exploitation que GDB lui-même . En fait, un système qui peut fonctionner gdbserver se relier à un GDB à distance a pu également démarrer GDB localement! gdbserver est parfois utile néanmoins, parce que c'est un programme beaucoup plus petit que GDB lui-même. Il est également plus facile de mettre en communication que tout le GDB, ainsi vous pouvez pouvoir obtenir avez commencé plus rapidement sur un nouveau système par employer gdbserver. En conclusion, si vous développez le code pour les systèmes en temps réel, vous pouvez constater que les différences impliquées dans l'opération en temps réel le rendent plus commode pour effectuer autant travail de développement comme possible sur un autre système, par exemple par la croix-compilation. Vous pouvez employer gdbserver pour faire un choix semblable pour la correction.

GDB et gdbserver communiquez par l'intermédiaire d'une ligne périodique ou d'un raccordement de TCP, en utilisant le protocole périodique à distance standard de GDB.

Sur la machine cible,

vous devez avoir une copie du programme que vous voulez mettre. gdbserver n'a pas besoin de la table de symbole de votre programme, ainsi vous pouvez dépouiller le programme au besoin pour ménager de l'espace. GDB sur le système hôte fait tout la manipulation de symbole.

Pour utiliser le serveur, vous devez lui dire comment communiquer avec GDB; le nom de votre programme; et les arguments pour votre programme. La syntaxe habituelle est:

programme de COMM. de cible > de gdbserver [ args... ]

COMM. est un nom de device (pour employer une ligne périodique) ou un hostname de TCP et un portnumber. Par exemple, pour corriger Emacs avec l'argument ` foo.txt ' et communiquez avec GDB au-dessus de la porte série `/dev/com1 ':

cible > gdbserver/dev/com1 emacs foo.txt

gdbserver attentes passivement pour le centre serveur GDB à communiquer avec lui.

Pour employer un raccordement de TCP au lieu d'une ligne périodique:

cible > gdbserver host:2345 emacs foo.txt

La seule différence de l'exemple précédent est le premier argument, indiquant que vous communiquez avec le centre serveur GDB par l'intermédiaire du TCP. ` host:2345 ' l'argument signifie cela gdbserver est s'attendre à un raccordement de TCP de machine centre serveur de ` ' au port local 2345 de TCP. (actuellement, centre serveur de ` ' la partie est ignorée.) Vous pouvez choisir tout nombre que vous voulez pour le nombre gauche aussi longtemps qu'il n'est en conflit avec aucun port de TCP déjà en service sur le système de cible (par exemple, 23 est réservé pour telnet (5) vous devez employer le même nombre gauche avec le centre serveur GDB extérieur de cible commande.

Sur quelques cibles, gdbserver le bidon attachent également aux programmes courants. Ceci est accompli par l'intermédiaire du -- attache argument. La syntaxe est:

COMM. de cible > de gdbserver -- attachez le pid

pid est l'identification de processus d'un processus fonctionnant actuellement. Il n'est pas nécessaire de se diriger gdbserver à un binaire pour le processus courant.

Vous pouvez corriger des processus de nom au lieu de l'identification de processus si votre cible a pidof utilité:

COMM. de cible > de gdbserver -- attachez le pidof PROGRAM` de `

Au cas où plus d'une copie de PROGRAMME est

démarrer, ou PROGRAMME a les fils multiples, la plupart des versions de pidof soutenez - s option pour renvoyer seulement la première identification de processus.

Sur l'ordinateur central,

reliez à votre cible (voir la section se relier à une cible à distance ). Pour des raccordements de TCP, vous devez partir vers le haut gdbserver avant d'employer extérieur de cible commande. Autrement vous pouvez obtenir une erreur dont le texte dépend du système hôte, mais comme laquelle regarde habituellement quelque chose raccordement de ` refusé '. Vous n'avez pas besoin d'employer charge commandez dans GDB en utilisant le gdbserver, puisque le programme est déjà sur la cible.

17,3 Employer gdbserve.nlm programme

gdbserve.nlm est un programme de gestion pour par l'intermédiaire dont des systèmes de NetWare, vous permet de relier votre programme à un GDB à distance extérieur de cible.

GDB et gdbserve.nlm communiquez par l'intermédiaire d'une ligne périodique, en utilisant le protocole périodique à distance standard de GDB.

Sur la machine cible,

vous devez avoir une copie du programme que vous voulez mettre. gdbserve.nlm n'a pas besoin de la table de symbole de votre programme, ainsi vous pouvez dépouiller le programme au besoin pour ménager de l'espace. GDB sur le système hôte fait tout la manipulation de symbole.

Pour utiliser le serveur, vous devez lui dire comment communiquer avec GDB; le nom de votre programme; et les arguments pour votre programme. La syntaxe est:

chargez le gdbserve [ BOARD=board ] [ PORT=port ] [ BAUD=baud ] programme [ args... ]

conseil et port indiquez la ligne périodique; baud indique la vitesse baud employée par le raccordement. port et noeud défaut à 0, baud défauts à 9600bps.

Par exemple, pour corriger Emacs avec l'argument ` foo.txt 'et communiquez avec la porte série numéro 2 ou panneau 1 d'excédent de GDB en utilisant un raccordement 19200bps:

chargez le gdbserve BOARD=1 PORT=2 BAUD=19200 emacs foo.txt

Sur l'ordinateur central de GDB, reliez à votre cible (voir la section se relier à une cible à distance ).

17,4 Configuration à distance

Les options suivantes de configuration sont disponibles quand des programmes à distance de correction:

matériel-watchpoint-limite à distance réglée limite

matériel-break-limite à distance réglée limite

Limitez GDB à employer limite break ou watchpoints à distance de matériel. Une limite de -1, le défaut, est traitée comme illimitée.

17,5 Mettre en application un moignon à distance

Les dossiers de moignon ont fourni l'instrument de GDB au côté de cible du protocole de transmission, et le côté de GDB est mis en application dans le ` remote.c de fichier source de GDB '. Normalement, vous pouvez simplement permettre à ces sous-programmes de communiquer, et ignorez les détails. (si vous mettez en application votre propre dossier de moignon, vous pouvez immobile ignorer les détails: commencez par un des dossiers existants de moignon. le ` sparc-stub.c ' est mieux organisée, et donc le plus facile à lire.)

Pour mettre un programme au point fonctionnant sur une autre machine (la machine cible de correction), vous devez d'abord vous charger pour tous les préalables habituels au programme à la course par elle-même. Par exemple, pour un programme C, vous avez besoin:

Une routine de démarrage pour installer l'environnement de temps d'exécution de C; ceux-ci ont habituellement un nom comme le ` crt0 '. La routine de démarrage peut être fournie par votre fournisseur de matériel, ou vous pouvez devoir écrire vos propres.

Une bibliothèque de sous-programme de C pour soutenir les appels de sous-programme de votre programme, l'entrée notamment de gestion et le rendement.

Une manière d'obtenir votre programme à l'autre machine -- par exemple, un programme de téléchargement. Ceux-ci sont souvent fournis par le fabricant de matériel, mais vous pouvez devoir écrire vos propres de la documentation de matériel.

La prochaine step est d'assurer votre programme pour employer une porte série pour communiquer avec la machine où GDB fonctionne ( l'ordinateur central ). D'une façon générale, l'arrangement ressemble à ceci:

Sur le centre serveur,

GDB comprend déjà comment employer ce protocole; quand tout autrement est installé, vous pouvez simplement employer extérieur de cible de ` ' commande (voir la section indiquer une cible de correction ).

Sur la cible,

vous devez lier avec votre programme quelques sous-programmes pour un but particulier qui mettent en application le protocole périodique à distance de GDB. Le dossier contenant ces sous-programmes s'appelle un moignon de correction .

Sur certaines cibles à distance, vous pouvez employer un programme auxiliaire gdbserver au lieu de lier un moignon dans votre programme. Voyez employer de section gdbserver programme , pour des détails.

Le moignon de correction est spécifique à l'architecture de la machine à distance; par exemple, employez le ` sparc-stub.c ' pour mettre des programmes au point sur des conseils de SPARC.

Ceux-ci les moignons à distance fonctionnants sont distribués avec GDB:

i386-stub.c

Pour Intel 386 et architectures compatibles.

m68k-stub.c

Pour des architectures de Motorola 680x0.

sh-stub.c

Pour les architectures SH de Renesas.

sparc-stub.c

Pour des architectures de SPARC.

sparcl-stub.c

Pour des architectures de Fujitsu SPARCLITE.

Dossier du ` Le README le 'dans la distribution de GDB peut énumérer d'autres moignons récemment supplémentaires.

17,5,1 Ce qui le moignon peut faire pour vous 17,5,2 ce que vous devez faire pour le moignon 17,5,3 le remontant toute

17,5,1 Ce que le moignon peut faire pour vous

Le moignon de correction pour votre architecture fournit ces trois sous-programmes:

set_debug_traps

Cette routine arrange pour handle_exception pour démarrer quand votre programme s'arrête. Vous devez appeler ce sous-programme explicitement près du commencement de votre programme.

handle_exception

Ce n'est jamais le workhorse central, mais vos appels de programme il explicitement -- le code d'installation arrange pour handle_exception pour démarrer quand un piège est déclenché.

handle_exception prend la commande quand votre programme s'arrête pendant l'exécution (par exemple, sur un break), et négocie des communications avec GDB sur l'ordinateur central. C'est où le protocole de transmissions est mis en application; handle_exception actes comme le représentant de GDB sur la machine cible. Elle commence en envoyant l'information récapitulative sur l'état de votre programme, puis continue à s'exécuter, recherchant et transmettant tous les besoins de l'information GDB, jusqu'à ce que vous exécutiez une commande de GDB qui fait votre résumé de programme; à ce point, handle_exception les retours commandent à votre propre code sur la machine cible.

break

Employez ce sous-programme auxiliaire pour faire votre programme contenir un break. Selon la situation particulière, ceci peut être la seule manière pour que GDB obtienne la commande. Par exemple, si votre machine cible a une certaine sorte de bouton d'interruption, vous n'aurez pas besoin d'appeler ceci; appuyer sur le bouton d'interruption transfère la commande à handle_exceptiondans l'effet, à GDB. Sur quelques machines, simplement la réception des caractères sur la porte série peut également déclencher un piège; encore, dans cette situation, vous n'avez pas besoin d'appeler break de votre propre programme -- simplement courant extérieur de cible de ` ' du centre serveur GDB la session obtient la commande.

Appel break si aucune de ces derniers n'est vraie, ou si vous voulez simplement vous assurer votre programme s'arrête à un point prédéterminé pour le début de votre session de correction.

17,5,2 Ce que vous devez faire pour le moignon

Les moignons de correction qui viennent avec GDB sont installés pour une architecture de morceau particulière, mais eux n'ont aucune information sur le reste de votre machine cible de correction.

D'abord de tous vous devez dire au moignon comment communiquer avec la porte série.

getDebugChar() interne

Ecrivez ce sous-programme pour lire un caractère simple de la porte série. Elle peut être identique à getchar pour votre système de cible; un nom différent est employé pour vous permettre de distinguer les deux si vous souhaitez.

putDebugChar(int) vide

Ecrivez ce sous-programme pour écrire un caractère simple à la porte série. Elle peut être identique à putchar pour votre système de cible; un nom différent est employé pour vous permettre de distinguer les deux si vous souhaitez.

Si vous voulez que GDB puisse arrêter votre programme tandis qu'il fonctionne, vous devez employer un conducteur périodique interrupt-driven, et assurez lui pour s'arrêter quand il reçoit a ^C (`\003 'le caractère de commande-C). C'est le caractère que GDB emploie pour indiquer au système à distance pour s'arrêter.

Obtenir la cible de correction pour renvoyer le statut approprié à GDB exige probablement des changements au moignon standard; on manière rapide et sale doit exécuter juste une instruction de renvoi (la partie "sale" est que GDB rapporte a SIGTRAP au lieu de a SIGINT

D'autres routines que vous devez fournir sont:

exceptionHandler vide (interne exception_numbervide *exception_address

Ecrivez cette fonction pour installer exception_address dans les tables de manipulation d'exception. Vous devez faire ceci parce que le moignon n'a aucune manière de savoir comme ce que sont les tables de manipulation d'exception sur votre système de cible (par exemple, la table du processeur pourrait être dans la ROM, contenant les entrées qui se dirigent à une table dans la RAM). exception_number est le nombre d'exception qui devrait être changé; sa signification est architecture-dépendante (par exemple, les différents nombres pourraient représenter se divisent par l'accès, etc.. zéro et mauvais). Quand cette exception se produit, la commande devrait être transférée directement à exception_addresset l'état de processeur (pile, registres, et ainsi de suite) devrait être juste comme il est quand une exception de processeur se produit. Ainsi si vous voulez employer une instruction de saut d'atteindre exception_addressce devrait être un saut simple, pas un saut au sous-programme.

Pour les 386, exception_address si soyez installé comme interruption déclenchent-elles de sorte que des interruptions soient masquées tandis que le traiteur execute. La porte devrait être au niveau 0 (le niveau le plus privilégié) de privilège. SPARC et les moignons 68k peuvent masquer les interruptions elles-mêmes sans aide de exceptionHandler.

flush_i_cache() vide

Sur SPARC et SPARCLITE seulement, écrivez ce sous-programme pour rincer la cachette d'instruction, le cas échéant, sur votre machine cible. S'il n'y a aucune cachette d'instruction, ce sous-programme peut être un ineffectif.

Sur les machines cibles qui ont des cachettes d'instruction, GDB exige de cette fonction de s'assurer que l'état de votre programme est stable.

Vous devez également vous assurer que cette routine de bibliothèque est disponible:

vide * memset(void *, interne, interne)

C'est la fonction de bibliothèque standard memset

ce ensembles par secteur de mémoire à une valeur connue. Si vous avez un des versions libres de libc.a memset peut être trouvé là; autrement, vous devez ou l'obtenir de votre fabricant de matériel, ou écrivez vos propres.

Si vous n'employez pas le compilateur de GNU C, vous pouvez avoir besoin d'autres sous-programmes standard de bibliothèque aussi bien; ceci change d'un moignon à l'autre, mais en général les moignons sont susceptibles d'employer n'importe lequel des sous-programmes communs de bibliothèque qui GCC se produit en tant que code intégré.

17,5,3 Le remontant tout

En résumé, quand votre programme est prêt à corriger, vous devez suivre ces steps.

Vous assurez vous avoir défini les routines de bas niveau de support (voir la section ce que vous devez faire pour le moignon ):

getDebugChar, putDebugChar, flush_i_cache, memset, exceptionHandler.

Insérez ces lignes près du dessus de votre programme:

Â

set_debug_traps(); breakpoint();

Pour le moignon 680x0 seulement, vous devez fournir une variable appelée exceptionHook. Normalement vous utilisation juste:

Â

vide (* exceptionHook)() = 0;

mais si avant d'appeler set_debug_trapsvous l'avez placé pour vous diriger à une fonction dans votre programme, cette fonction s'appelle quand GDB continue après arrêt sur un piège (par exemple, erreur d'autobus). La fonction indiquée près exceptionHook s'appelle avec un paramètre: interne ce qui est le nombre d'exception.

Compilez et liez ensemble: votre programme, le moignon de correction de GDB pour votre architecture de cible, et les sous-programmes de support.

Vous assurez vous avoir un raccordement périodique entre votre machine cible et le centre serveur de GDB, et identifiez la porte série sur le centre serveur.

Téléchargez votre programme à votre machine cible (ou y arrivez-la par quelque moyens le fabricant fournisse), et commencez-le.

Commencez GDB sur le centre serveur, et reliez à la cible (voir la section se relier à une cible à distance ).

19. GDB De Contrôle

Vous pouvez changer la manière que GDB agit l'un sur l'autre avec vous en employant ensemble commande. Pour des commandes commandant comment GDB montre des données, voir les arrangements d'impression . D'autres arrangements sont décrits ici.

19,1 Message de sollicitation

GDB indique sa promptitude pour lire une commande en imprimant une corde appelée le message de sollicitation . Cette corde est normalement `(gdb) '. Vous pouvez changer la corde prompte avec message de sollicitation réglé commande. Par exemple, quand la correction GDB avec GDB, il est utile pour changer le message de sollicitation dans un des sessions de GDB de sorte que vous puissiez toujours dire des quelles à vous parlez.

Note: message de sollicitation réglé n'ajoute pas un espace pour vous après que le message de sollicitation que vous avez placé. Ceci vous permet de placer un message de sollicitation qui finit dans un espace ou un message de sollicitation qui pas .

message de sollicitation réglé newprompt

Dirige GDB vers l'utilisation newprompt en tant que sa corde prompte dorénavant.

montrez le message de sollicitation

Imprime une ligne de la forme: le message de sollicitation de Gdb de ` est: votre-prompt'

19,2 Edition de commande

GDB lit ses commandes d'entrée par l'intermédiaire de l'interface de readline. Cette bibliothèque de GNU fournit à comportement conformé pour les programmes qui fournissent une interface de ligne de commande à l'utilisateur. Les avantages sont Emacs-modèle ou vi de GNU - dénommez en ligne l'édition des commandes, csh- comme la substitution d'histoire, et un stockage et le rappel de l'histoire de commande à travers des sessions de correction.

Vous pouvez commander le comportement de la ligne de commande éditant dans GDB avec la commande ensemble.

édition réglée

édition réglée dessus

Permettez l'édition de ligne de commande (permise par défaut).

placez l'édition au loin

Neutralisez l'édition de ligne de commande.

montrez l'édition

Montrez si l'édition de ligne de commande est permise.

19,3 Histoire de commande

GDB peut maintenir les commandes que vous tapez pendant vos sessions de correction, de sorte que vous puissiez être certain de avec précision ce qui s'est produit. Employez ces commandes de contrôler le service d'histoire de commande de GDB.

placez le nom de fichier d'histoire fname

Placez le nom du fichier historique de commande de GDB à fname. C'est le dossier où GDB lit une première liste d'histoire de commande, et où il écrit l'histoire de commande de cette session quand il sort. Vous pouvez accéder à cette liste par l'expansion d'histoire ou par la commande d'histoire éditant des caractères énumérés ci-dessous. Ce dossier se transfère sur la valeur de la variable d'environnement GDBHISTFILEou à `./.gdb_history ' ( `./_gdb_history ' sur le MSDOS) si cette variable n'est pas placée.

placez l'histoire économiser

placez l'histoire économiser dessus

Enregistrez l'histoire de commande dans un dossier, dont le nom peut être indiqué avec placez le nom de fichier d'histoire commande. Par défaut, cette option est handicapée.

placez l'histoire économiser au loin

Arrêtez l'histoire de commande d'enregistrement dans un dossier.

placez la taille d'histoire taille

Placez le nombre de commandes que GDB maintient dans son liste d'histoire. Ceci se transfère sur la valeur de la variable d'environnement HISTSIZEou à 256 si cette variable n'est pas placée.

L'expansion d'histoire assigne la signification spéciale au caractère !.

Depuis ! est également pas l'opérateur logique en C, expansion d'histoire n'est pas en ligne près défaut. Si vous décidez de permettre l'expansion d'histoire avec placez l'expansion d'histoire dessus commandez, vous peut parfois devoir suivre ! (quand elle est employée comme logique pas, dans une expression) avec un espace ou une étiquette pour l'empêcher d'être augmentée. Les équipements d'histoire de readline n'essayent pas la substitution sur les cordes ! = et ! (même lorsque l'expansion d'histoire est permise.

Les commandes de commander l'expansion d'histoire sont:

placez l'expansion d'histoire dessus

placez l'expansion d'histoire

Permettez l'expansion d'histoire. L'expansion d'histoire est éteinte près défaut.

placez l'expansion d'histoire au loin

Neutralisez l'expansion d'histoire.

Le code de readline vient avec une documentation plus complète des devices d'expansion d'édition et d'histoire. Utilisateurs peu familiers avec GNU Emacs ou vi peut souhaiter le lire.

montrez l'histoire

montrez le nom de fichier d'histoire

montrez l'histoire économiser

montrez la taille d'histoire

montrez l'expansion d'histoire

Ces commandes montrent l'état des paramètres d'histoire de GDB. montrez l'histoire par elle-même affichages chacun des quatre états.

montrez les commandes

Montrez les dix dernières commandes dans l'histoire de commande.

montrez les commandes n

Imprimez dix commandes centrées sur le nombre de commande n.

montrez les commandes +

Imprimez dix commandes juste aprés les commandes pour la dernière fois imprimées.

19,4 Taille d'écran

Certaines commandes à GDB peuvent produire de grandes quantités de rendement de l'information à l'écran. Pour vous aider à lire tout le lui, GDB fait une pause et vous demande l'entrée à la fin de chaque page de rendement. Type Retour quand vous voulez continuer le rendement, ou q pour jeter la sortierestant. En outre, l'arrangement de largeur d'écran détermine quand envelopper des lignes de rendement. Selon ce qui est imprimé, essais de GDB pour casser la ligne à un endroit lisible, plutôt qu'à le laisser simplement de déborder sur la ligne suivante.

Normalement GDB sait la taille de l'écran du logiciel de conducteur terminal. Par exemple, sur Unix GDB emploie la base de données de termcap ainsi que la valeur du LIMITE variable d'environnement et rangées stty et cols stty arrangements. Si ce n'est pas correct, vous pouvez le dépasser avec placez la taille et set width commandes:

placez la taille lpp

montrez la taille

set width complet

montrez la largeur

Ceux-ci ensemble les commandes indiquent une taille d'écran de lpp lignes et une largeur d'écran de complet caractères. L'associé exposition les commandes montrent les arrangements courants.

Si vous indiquez une taille des lignes zéro, GDB ne fait pas une pause pendant la sortien'importe comment longtemps la sortieest. C'est utile si la sortieest à un dossier ou à un amortisseur de rédacteur.

De même, vous pouvez indiquer largeur réglée 0'de ` pour empêcher GDB d'envelopper son rendement.

19,5 Nombres

Vous pouvez toujours écrire des nombres dans octal, décimal, ou l'hexadécimal dans GDB par les conventions habituelles: les nombres octaux commencent par ` 0'extrémité de nombres décimaux avec `.'et les nombres hexadécimaux commencent par ` 0x'. Des nombres qui commencent par aucune de ces derniers, par défaut, sont écrits dans la base 10; de même, l'affichage de défaut pour des nombres -- quand aucun format particulier n'est indiqué -- est la base 10. Vous pouvez changer la base de défaut pour entré et rendement avec placez la base commande.

placez l'entrée-base base

Placez la base de défaut pour l'entrée numérique. Choix soutenus pour base sont la décimale 8, 10, ou 16. base la nécessité elle-même soit indiquée ou clairement ou en utilisant la radix courante de défaut; par exemple, quelles de

placez la radix réglée 10 de la base 012. placez la base 0xa

place la base à la décimale. D'autre part, radix réglée 10'de ` laisse la radix inchangée n'importe ce qu'elle était.

placez la rendement-base base

Placez la base de défaut pour l'affichage numérique. Choix soutenus pour base sont la décimale 8, 10, ou 16. base la nécessité elle-même soit indiquée ou clairement ou en utilisant la radix courante de défaut.

montrez l'entrée-base

Montrez la base courante de défaut pour l'entrée numérique.

montrez la rendement-base

Montrez la base courante de défaut pour l'affichage numérique.

19,6 Configuration de l'cAbi courant

GDB peut déterminer l'cAbi (interface binaire d'application) de votre application automatiquement. Cependant, parfois vous devez dépasser ses conclusions. Employez ces commandes de contrôler la vue de GDB de l'cAbi courant.

Une configuration de GDB peut corriger des binaries pour les cibles multiples de logiciel d'exploitation, par l'intermédiaire de l'extérieur corrigeant ou émulation indigène. L'autodetect de volonté de GDB l'cOs ABI (logiciel d'exploitation ABI) en service, mais vous peut dépasser son employer de conclusion placez l'osabi commande. Un exemple où c'est utile est dans la correction des binaries qui emploient une bibliothèque alternative de C (par exemple UCLIBC pour GNU/Linux) qui n'a pas les mêmes marques d'identification que la bibliothèque standard de C pour votre plateforme fournit.

montrez l'osabi

Montrez l'cOs ABI actuellement en service.

placez l'osabi

Sans l'argument, montrez la liste d'cOs ABI disponible enregistré.

placez l'osabi abi

Placez l'cOs courant ABI à abi.

D'une façon générale, la manière dont un argument de type flotteur est passé à une fonction dépend de si la fonction est prototyped. Pour a prototyped la fonction (c.-à-d. d'cAnsi/iso de modèle), flotteur des arguments sont passés sans changement, selon la convention de l'architecture pour flotteur. Pour unprototyped des fonctions (c.-à-d. de K&r de modèle), flotteur des arguments sont d'abord favorisés au type double et alors passé.

Malheureusement, quelques formes de corrigent l'information n'indiquent pas sûrement si une fonction est prototyped. Si GDB appelle une fonction qui n'est pas marquée comme prototyped, il consulte contraindre-flotter-à-double réglé.

contraindre-flotter-à-double réglé

ensemble contraindre-flotter-à-double dessus

Arguments de type flotteur sera favorisé à double une fois passé à l'unprototyped la fonction. C'est l'arrangement de défaut.

contraindre-flotter-à-double réglé au loin

Arguments de type flotteur sera passé directement à unprototyped des fonctions.

GDB doit savoir l'cAbi utilisé pour les objets du C ++ de votre programme. Le C correct ++ ABI dépend de quel compilateur de C ++ a été employé pour établir votre application. GDB approuve seulement pleinement des programmes avec un C simple ++ ABI; si votre programme contient le code en utilisant C multiple ++ ABI ou si GDB ne peut pas identifier l'cAbi de votre programme correctement, vous pouvez dire à GDB quel ABI à employer. ABI actuellement soutenu incluent "gnu-v2", pour g++ versions avant 3,0, "gnu-v3", pour g++ versions 3,0 et plus tard, et "hpaCC" pour le compilateur de la norme ANSI C ++ de HP. D'autres compilateurs de C ++ peuvent employer l'"gnu-v2" ou "gnu-v3" ABI aussi bien. L'arrangement de défaut est "automobile".

montrez CP-abi

Montrez le C ++ ABI actuellement en service.

placez CP-abi

Sans l'argument, montrez la liste de C ++ ABI soutenu.

placez CP-abi abi

placez CP-abi automatique

Placez le C courant ++ ABI à abiou retour à la détection automatique.

19,7 Avertissements et messages facultatifs

Par défaut, GDB est silencieux au sujet de ses fonctionnements intérieurs. Si vous executez sur une machine lente, vous pouvez vouloir employer bavard réglé commande. Ceci fait GDB vous indiquer quand il fait une opération interne prolongée, ainsi vous ne penserez pas qu'elle s'est brisée.

Actuellement, les messages commandés près bavard réglé sont ceux qui annoncent que la table de symbole pour un fichier source est lue; voyez symbole-dossier dans les commandes d'indiquer des dossiers .

ensemble bavard dessus

Permet la sortiede GDB de certains messages informationnels.

bavard réglé au loin

Rendement des débronchements GDB de certains messages informationnels.

montrez bavard

Montre si bavard réglé est dessus ou isolé.

Par défaut, si GDB rencontre des bogues dans la table de symbole d'un fichier d'exécution, il est silencieux; mais si vous corrigez un compilateur, vous pouvez trouver cette information utile (voir les dossiers de symbole de lecture d'erreurs de section ).

placez les plaintes limite

Permet à GDB de produire limite plaintes au sujet de chaque type de symboles peu communs avant de devenir silencieux au sujet du problème. Ensemble limite à zéro pour supprimer toutes les plaintes; placez-l'à un grand nombre pour empêcher des plaintes d'être supprimée.

montrez les plaintes

Montre combien de plaintes GDB de symbole est autorisé pour produire.

Par défaut, GDB est prudent, et demande ce qui semble parfois être beaucoup de questions stupides de confirmer certaines commandes. Par exemple, si vous essayez d'exécuter un programme qui fonctionne déjà:

Â

(gdb) exécutez le programme étant corrigé a été déjà commencé. Commencez-l'à partir du commencement? (y ou n)

Si vous êtes disposé à faire face unflinchingly aux conséquences de vos propres commandes, vous pouvez neutraliser ce "device":

placez confirment au loin

Demandes de confirmation de débronchements.

placez confirment dessus

Permet des demandes de confirmation (le défaut).

montrez confirment

Montre l'état de demandes de confirmation.

19,8 Messages facultatifs au sujet des happenings internes

placez corrigent la voûte

S'allume ou outre de l'affichage du gdbarch corrigeant l'information. Le défaut est éteint

montrez corrigent la voûte

Montre l'état actuel de montrer le gdbarch corrigeant l'information.

placez corrigent l'événement

S'allume ou outre de l'affichage de l'événement de GDB corrigeant l'information. Le défaut est éteint.

montrez corrigent l'événement

Montre l'état actuel de montrer l'événement de GDB corrigeant l'information.

placez corrigent l'expression

S'allume ou outre de l'affichage de l'expression de GDB corrigeant l'information. Le défaut est éteint.

montrez corrigent l'expression

Montre l'état actuel de montrer l'expression de GDB corrigeant l'information.

placez corrigent l'armature

S'allume ou outre de l'affichage de l'armature de GDB corrigeant l'information. Le défaut est éteint.

montrez corrigent l'armature

Montre l'état actuel de montrer l'armature de GDB corrigeant l'information.

placez corrigent la surcharge

S'allume ou outre de l'affichage de la surcharge de GDB C ++ corrigeant l'information. Ceci inclut l'information telle que le rang des fonctions, etc... Le défaut est éteint.

montrez corrigent la surcharge

Montre l'état actuel de montrer la surcharge de GDB C ++ corrigeant l'information.

placez corrigent l'extérieur

S'allume ou outre de l'affichage des rapports sur tous les paquets envoyés dans les deux sens à travers la ligne périodique à la machine à distance. L'information est imprimée sur le jet standard de rendement de GDB. Le défaut est éteint.

montrez corrigent l'extérieur

Montre l'état d'affichage des paquets à distance.

placez corrigent la publication périodique

S'allume ou outre de l'affichage de l'information périodique de correction de GDB. Le défaut est éteint.

montrez corrigent la publication périodique

Montre l'état actuel de montrer l'information périodique de correction de GDB.

placez corrigent la cible

S'allume ou outre de l'affichage de la cible de GDB corrigeant l'information. Cette information inclut ce qui s'attaque dessus au niveau de cible de GDB, car il se produit. Le défaut est éteint.

montrez corrigent la cible

Montre l'état actuel de montrer la cible de GDB corrigeant l'information.

placez corrigent le varobj

S'allume ou outre de l'affichage de l'objet variable de GDB corrigeant l'information. Le défaut est éteint.

montrez corrigent le varobj

Montre l'état actuel de montrer l'objet variable de GDB corrigeant l'information.

20. Ordres en boîte des commandes

Hormis des commandes de break (voir les listes de commandes de break de section ), GDB fournit deux manières de stocker des ordres des commandes pour l'exécution comme unité: commandes définies pour l'utilisateur et fichiers de commande.

20,1 Commandes définies pour l'utilisateur

Une commande définie pour l'utilisateur est un ordre des commandes de GDB auxquelles vous assignez un nouveau nom comme commande. Ceci est fait avec définissez commande. Les ordres d'utilisateur peuvent accepter jusqu'à 10 arguments séparés par le whitespace. Des arguments sont consultés dans l'ordre d'utilisateur par l'intermédiaire de $$arg0 ... $$arg9. Un exemple insignifiant:

Â

définissez la copie d'additionneur $$arg0 + $$arg1 + $$arg2

Pour exécuter l'utilisation de commande:

Â

additionneur 1 2 3

Ceci définit la commande additionneurqui imprime la somme de ses trois arguments. Notez les arguments sont des substitutions des textes, ainsi ils peuvent mettre en référence des variables, employer des expressions complexes, ou même exécuter des appels inférieurs de fonctions.

définissez commandname

Définissez une commande appelée commandname. S'il y a déjà une commande par ce nom, vous êtes invités à confirmer que vous voulez le redéfinir.

La définition de la commande se compose d'autres lignes de commande de GDB, qui sont données après définissez commande. La fin de ces commandes est marquée par contenir de ligne extrémité.

si

Prend un argument simple, qui est une expression à évaluer. Il est suivi d'une série de commandes qui sont exécutées seulement si l'expression est vraie (de non zéro). Il peut alors sur option y a une ligne autrementsuivi d'une série de commandes qui sont seulement exécutées si l'expression était fausse. La fin de la liste est marquée par contenir de ligne extrémité.

tandis que

La syntaxe est semblable à sila commande prend un argument simple, qui est une expression à évaluer, et doit être suivie des commandes de s'exécuter, une par la ligne, terminée par extrémité. Les commandes sont exécutées à plusieurs reprises aussi longtemps que l'expression évalue pour rectifier.

document commandname

Documentez la commande définie pour l'utilisateur commandnamede sorte qu'il puisse être consulté près aide. La commande commandname la nécessité déjà soit définie. Cette commande lit des lignes de documentation juste comme définissez lit les lignes de la définition de commande, finissant avec extrémité. Après document la commande est finie, aide sur la commande commandname montre la documentation que vous avez écrite.

Vous pouvez employer document commandez encore de changer la documentation d'une commande. Redéfinition de la commande avec définissez ne change pas la documentation.

aide définie pour l'utilisateur

Enumérez toutes les commandes définies pour l'utilisateur, avec la première ligne de la documentation (si quel) pour chacun.

montrez l'utilisateur

montrez l'utilisateur commandname

Montrez les commandes de GDB employées pour définir commandname (mais non sa documentation). Si non commandname est donné, montre les définitions pour toutes les commandes définies pour l'utilisateur.

montrez la maximum-utilisateur-appeler-profondeur

placez la maximum-utilisateur-appeler-profondeur

La valeur de maximum-utilisateur-appeler-profondeur commande combien de niveaux de récursion sont permis dans des commandes définies pour l'utilisateur avant que GDB suspecte une récursion infinie et avorte la commande.

Quand des commandes définies pour l'utilisateur sont exécutées, les commandes de la définition ne sont pas imprimées. Une erreur dans n'importe quelle commande arrête l'exécution de la commande définie pour l'utilisateur.

Si utilisées interactivement, les commandes qui demanderaient la confirmation procèdent sans demander une fois utilisées à l'intérieur d'une commande définie pour l'utilisateur. Beaucoup de GDB commande que normalement les messages d'impression pour dire ce qu'ils font omettent les messages une fois utilisés dans une commande définie pour l'utilisateur.

20,2 Crochets définis pour l'utilisateur de commande

Vous pouvez définir les crochets , qui sont un genre spécial de commande définie pour l'utilisateur. Toutes les fois que vous executez la commande foo de ` 'si la commande définie pour l'utilisateur crochet-foo de ` ' existe, il est exécuté (sans des arguments) avant cette commande.

On peut également définir un crochet qui est run après la commande que vous vous êtes exécutée. Toutes les fois que vous executez la commande foo de ` 'si la commande définie pour l'utilisateur hookpost-foo de ` ' existe, il est exécuté (sans des arguments) ensuite cette commande. les crochets d'Poteau-exécution peuvent exister simultanément avec des crochets d'pré-exécution, pour la même commande.

Il est valide pour qu'un crochet appelle la commande qu'il accroche. Si ceci se produit, le crochet n'est pas exécuté de nouveau, évitant de ce fait la récursion d'infinte.

En outre, une pseudo-commande, arrêt de ` ' existe. Définir (le ` crochet-s'arrêtent 'fait les commandes associées s'exécuter chaque fois que l'exécution s'arrête dans votre programme: avant que des commandes de break soient runes, des affichages sont imprimés, ou l'armature de pile est imprimée.

Par exemple, pour ignorer SIGALRM les signaux tout en simple-faisant un pas, mais les traitent normalement pendant l'exécution normale, vous pourraient définir:

Â

définissez crochet-arrêtent des nopass de la poignée SIGALRM que l'extrémité définissent crochet-courent l'extrémité de passage de la poignée SIGALRM définissent crochet-continuent l'extrémité de passage de la poignée SIGLARM

Comme un autre exemple, au crochet à begining et à la fin du écho commande, et pour ajouter le texte supplémentaire au commencement et à la fin du message, vous pourriez définir:

Â

définissez l'extrémité de <<<--- d'écho d'crochet-écho définissent le monde d'écho de fin de --->>>\n d'écho d'hookpost-écho (gdb) bonjour < < < - - - bonjour --->>> du monde (gdb)

Vous pouvez définir un crochet pour n'importe quelle commande single-word dans GDB, mais pas pour des noms d'emprunt de commande; vous devriez définir un crochet pour le nom de base de commande, par exemple. backtrace plutôt que bt. Si une erreur se produit pendant l'exécution de votre crochet, l'exécution des commandes de GDB s'arrête et GDB publie un message de sollicitation (avant la commande que vous avez dactylographiée réellement a eu une chance de démarrer).

Si vous essayez de définir un crochet qui n'assortit aucune commande connue, vous obtenez un avertissement du définissez commande.

20,3 Fichiers de commande

Un fichier de commande pour GDB est un dossier des lignes qui sont des commandes de GDB. Commentaires (lignes commençant par #peut également être inclus. Une ligne vide dans un fichier de commande ne fait rien; elle ne signifie pas pour répéter la dernière commande, comme elle du terminal.

Quand vous commencez GDB, il exécute automatiquement des commandes à partir de ses dossiers d'init , normalement appelés le `.gdbinit ' (6) . Pendant le démarrage, GDB fait ce qui suit:

Lit le dossier d'init (si quel) dans votre répertoire local (7) .

Options et opérandes de ligne de commande de processus.

Lit le dossier d'init (si quel) dans l'annuaire de fonctionnement courant.

Lit des fichiers de commande indiqués par `-x ' option.

Le dossier d'init dans votre répertoire local peut placer des options (comme plaintes réglées de `qui affectent le traitement suivant des options et des opérandes de ligne de commande. Des dossiers d'Init ne sont pas exécutés si vous employez `-nx ' option (voir les modes de choix de section ).

Sur quelques configurations de GDB, le dossier d'init est connu par un nom différent (ce sont typiquement des environnements où une forme spécialisée de GDB peut devoir coexister avec d'autres formes, par conséquent un nom différent pour le dossier de l'init de la version spécialisée). Ce sont les environnements avec des noms spéciaux de dossier d'init:

VxWorks (OS en temps réel de systèmes de fleuve de vent): `.vxgdbinit '

OS68K (OS en temps réel de systèmes de données d'Enea): `.os68gdbinit '

Es-1800 (émulateur de telecom ab M68000 d'Ericsson): `.esgdbinit '

Vous pouvez également demander l'exécution d'un fichier de commande avec source commande:

source nom de fichier

Exécutez le fichier de commande nom de fichier.

Les lignes dans un fichier de commande sont exécutées séquentiellement. Elles ne sont pas imprimées pendant qu'elles sont exécutées. Une erreur dans n'importe quelle commande termine l'exécution du fichier de commande et la commande est retournée à la console.

Commandes qui demanderaient la confirmation si utilisé interactivement procèdent sans demander une fois utilisées dans un fichier de commande. Beaucoup de GDB commande que normalement les messages d'impression pour dire ce qu'ils font omettent les messages une fois appelés à partir des fichiers de commande.

GDB accepte également la commande entrée de l'entrée standard. En ce mode, la sortienormal va au rendement standard et la sortied'erreur va à l'erreur type. Les erreurs dans un fichier de commande fourni sur l'entrée standard ne terminent pas l'exécution du fichier de commande -- l'exécution continue la prochaine commande.

Â

le gdb < cmds > notent 2>&1

(la syntaxe ci-dessus changera selon la shell utilisée.) Cet exemple exécutera des commandes des cmds de ` de dossier . Tous les rendement et erreurs seraient dirigés vers la notation de ` '.

20,4 Commandes pour la sortiecommandé

Pendant l'exécution d'un fichier de commande ou d'une commande définie pour l'utilisateur, la sortienormal de GDB est supprimé; le seul rendement qui apparaît est ce qui est explicitement imprimé par les commandes dans la définition. Cette section décrit trois commandes utiles pour produire exactement du rendement que vous voulez.

écho texte

Copie texte. Des caractères non imprimants peuvent être inclus dedans texte employer des ordres d'évasion de C, comme `\n ' pour imprimer un caractère NL. Aucun caractère NL n'est imprimé à moins que vous indiquiez un. En plus des ordres d'évasion standard de C, un antislash a suivi aux stands d'un espace pour un espace. C'est utile pour montrer une corde avec les espaces au début ou l'extrémité, depuis les espaces de mener et traîner sont autrement équilibrées de tous les arguments. Pour imprimer ` et foo = 'employez la commande écho de ` \ et = de foo \ '.

Un antislash à la fin de texte peut être employé, comme en C, pour continuer la commande sur les lignes suivantes. Par exemple,

faites écho ceci est un certain text\n \ qui est continued\n \ sur plusieurs lines.\n

produit le même rendement As

faites écho ceci est un certain écho de text\n qui est écho de continued\n sur plusieurs lines.\n

rendement expression

Imprimez la valeur de expression et rien mais cette valeur: aucuns caractères NL, non ` $nn = '. La valeur n'est pas écrite dans l'histoire de valeur l'un ou l'autre. Voir les expressions de section , pour plus d'information sur des expressions.

produisez/fmt expression

Imprimez la valeur de expression dans le format fmt. Vous pouvez employer les mêmes formats que pour copie. Voir la section produire des formats , pour plus d'information.

printf corde expressions...

Imprimez les valeurs du expressions sous la commande de corde. expressions sont séparés par des virgules et peuvent être des nombres ou des indicateurs. Leurs valeurs sont imprimées comme indiqué près cordeexactement comme si votre programme devaient exécuter le sous-programme de C

printf (corde, expressions...);

Par exemple, vous pouvez imprimer deux valeurs dans le sortilège comme ceci:

printf "foo, barre-foo = 0x%x, 0x%x\n", foo, barre-foo

Les seuls antislash-échappent aux ordres que vous pouvez employer dans la corde de format êtes le simple qui se composent de l'antislash suivi d'une lettre.

21. Interprètes De Commande

GDB soutient les interprètes multiples de commande, et de l'infrastructure de commande pour permettre à des utilisateurs ou des auteurs d'interface utilisateur de commuter entre les interprètes ou les commandes de course dans d'autres interprètes.

GDB soutient actuellement deux interprètes de commande, l'interprète de console (parfois appelé l'interprète de commande-ligne ou le CLI) et l'interprète d'interface de machine (ou GDB/mi). Ce manuel décrit tous les deux interfaces dans le grand détail.

Par défaut, GDB commencera par l'interprète de console. Cependant, l'utilisateur peut choisir de commencer GDB avec un autre interprète par indiquer `-i ' ou ` -- interprète ' options de démarrage. Les interprètes définis incluent:

console

La console ou l'interprète traditionnelle de commande-ligne. C'est l'interprète le plus souvent utilisé avec GDB. Sans l'interprète indiqué au temps d'exécution, GDB utilisera cet interprète.

mille

La plus nouvelle interface de GDB/mi (actuellement mi2Utilisé principalement par des programmes souhaitant employer GDB en tant que principal un GUI de programme de mise au point ou un ide. Pour plus d'information, voyez l'interface de GDB/mi .

mi2

L'interface courante de GDB/mi.

mi1

L'interface de GDB/mi incluse dans GDB 5,1, 5,2, et 5,3.

L'interprète employé par GDB peut ne pas être dynamiquement commuté au temps d'exécution. Bien que possible, ceci a pu mener à une situation très périlleuse. Considérez un ide en utilisant GDB/mi. Si un utilisateur entre la commande "interprète-a placé la console" dans une vue de console, GDB commuterait à utiliser l'interprète de console, rendant l'ide inopérable!

Bien que vous puissiez seulement choisir un interprète simple au démarrage, vous pouvez exécuter des commandes dans n'importe quel interprète de l'interprète courant en utilisant la commande appropriée. Si vous executez l'interprète de console, employez simplement interprète-exec commande:

Â

donnée-liste-enregistrer-noms de mille d'interprète-exec "-"

GDB/mi a une commande semblable, bien qu'il soit seulement disponible dans les versions de GDB qui soutiennent la version 2 de GDB/mi (ou plus grand).

22. Interface utilisateur Des Textes de GDB

L'interface utilisateur des textes de GDB, TUI en bref, est une interface terminale qui emploie malédictions la bibliothèque pour montrer le fichier source, la sortied'assemblée, les registres de programme et GDB commande dans les fenêtres séparées des textes. Le TUI est disponible seulement quand GDB est configuré avec -- permettez-tui configurez l'option (voir la section B.3 configurez options ).

22,1 Vue d'ensemble de TUI

Le TUI a deux modes d'affichage qui peuvent être commutés tandis que GDB fonctionne:

Un mode de malédictions (ou TUI) en lequel il montre plusieurs fenêtres des textes sur la borne.

Un mode standard qui correspond au GDB a configuré sans TUI.

En mode de TUI, GDB peut montrer plusieurs la fenêtre des textes sur la borne:

commande

Cette fenêtre est la fenêtre de commande de GDB avec le message de sollicitation de GDB et les sorties de GDB. L'entrée de GDB est encore contrôlée en utilisant le readline mais par le TUI. La fenêtre de commande est toujours évidente.

source

La fenêtre de source montre le fichier source du programme. La ligne courante aussi bien que des breaks actifs sont montrées dans cette fenêtre.

assemblée

La fenêtre d'assemblée montre la sortiede démontage du programme.

registre

Cette fenêtre montre les registres de processeur. Elle détecte quand un registre est changé et quand c'est le cas, les registres qui ont changé sont accentués.

Les fenêtres de source et d'assemblée montrent la position de programme en cours en accentuant la ligne courante et en les marquant avec ` > ' marqueur. Des breaks sont également indiqués avec deux marqueurs. Un premier indique le type de break:

B

break qui a été frappé au moins par le passé.

b

break qui n'a été jamais frappé.

H

break de matériel qui a été frappé au moins par le passé.

h

break de matériel qui n'a été jamais frappé.

Le deuxième marqueur indique si le break est permis ou pas:

+

Le break est permis.

-

Le break est handicapé.

Les fenêtres de source, d'assemblée et de registre sont attachées au fil et la position d'armature. Elles sont mises à jour quand le fil courant change, quand l'armature change ou quand le compteur de programme change. Ces trois fenêtres sont arrangées par le TUI selon plusieurs dispositions. La disposition définit qui de ces trois fenêtres sont évidents. Les dispositions suivantes sont disponibles:

source

assemblée

source et assemblée

source et registres

assemblée et registres

Sur la fenêtre de commande une ligne d'état fournit la diverse information au sujet du processus courant commencent corrigé. La ligne d'état est mise à jour quand l'information il montre des changements. Les champs suivants sont montrés:

cible

Indique la cible courante de gdb (voir la section indiquer une cible de correction ).

processus

Fournit des informations sur le nombre courant de processus ou de fil. Quand aucun processus n'est corrigé, ce champ est placé à Aucun processus.

fonction

Donne le nom courant de fonction de l'armature choisie. Le nom est demangled si demangling est allumé (voir la section 8,7 imprimer des arrangements ). Quand il n'y a aucun symbole correspondant au compteur de programme en cours la corde ?? est montré.

ligne

Indique le nombre de ligne courante de l'armature choisie. Quand le nombre de ligne courante n'est pas connu la corde ?? est montré.

PC

Indique l'adresse de compteur de programme en cours.

22,2 Attaches Principales de TUI

Le TUI installe plusieurs attaches principales dans les keymaps de readline (voir la section 27. Ligne De Commande Editant ). Ils laissent partir ou entrer dans le mode ou eux de TUI fonctionnez directement sur la disposition et des fenêtres de TUI. Le TUI fournit également un keymap de SingleKey qui lie plusieurs clefs directement aux commandes de GDB. Les attaches principales suivantes sont installées pour le mode de TUI et le mode de norme de GDB.

C-x CA

C-x a

C-x A

Entrez ou laissez le mode de TUI. Quand le mode de TUI est laissé, la gestion de fenêtre de malédictions est laissée et GDB fonctionne en utilisant sa écriture standard de mode sur la borne directement. Quand le mode de TUI est entré, la commande est donnée de nouveau aux fenêtres de malédictions. L'écran est alors régénéré.

C-x 1

Employez une disposition de TUI avec seulement une fenêtre. La disposition l'un ou l'autre sera source de ` ' ou ` '. Quand le mode de TUI n'est pas en activité, il commutera au mode de TUI.

Pensez à cette attache de clef comme Emacs C-x 1 lier.

C-x 2

Employez une disposition de TUI avec au moins deux fenêtres. Quand la disposition courante montre déjà deux fenêtres, une prochaine disposition avec deux fenêtres est employée. Quand une nouvelle disposition est choisie, une fenêtre sera toujours commune à la disposition précédente et au neuf.

Pensez à elle comme Emacs C-x 2 lier.

C-x o

Changez la fenêtre active. Le TUI associe plusieurs attaches principales (comme le défilement et les touches de déplacement du curseur) à la fenêtre active. Cette commande donne le foyer à la prochaine fenêtre de TUI.

Pensez à elle comme Emacs C-x o lier.

C-x s

Employez le keymap de TUI SingleKey qui lie la clef simple aux commandes de gdb (voir le mode principal simple de la section 22,3 TUI ).

Les attaches principales suivantes sont manipulées seulement par le mode de TUI:

PgUp

Mettez en rouleau la page de la fenêtre active une vers le haut.

PgDn

Mettez en rouleau la page de la fenêtre active une vers le bas.

Vers le haut de

Mettez en rouleau la ligne de la fenêtre active une.

Vers le bas

Mettez en rouleau la ligne de la fenêtre active une vers le bas.

Gauche

Mettez en rouleau la colonne de la fenêtre active une à gauche.

Droite

Mettez en rouleau la droite de colonne de la fenêtre active une.

Cl

Régénérez l'écran.

Dans le mode de TUI, les touches de déplacement du curseur sont employées par la fenêtre active pour le défilement. Ceci signifie qu'elles sont disponibles pour le readline quand la fenêtre active est la fenêtre de commande. Quand la fenêtre de commande n'a pas le foyer, il est nécessaire d'employer l'autre clef de readline

attaches comme CP C-n Cb et Cf.

22,3 TUI Choisissent Le Mode Principal

Le TUI fournit un mode de SingleKey dans lequel il installe une clef particulière liant dans les keymaps de readline pour relier des clefs simples à quelques commandes de gdb.

c

continuez

d

vers le bas

f

finition

n

après

q

annulez le mode de SingleKey.

r

executez

s

step

u

vers le haut de

v

locals d'information

W

là où

D'autres clefs commutent temporairement au message de sollicitation de commande de GDB. La clef qui a été serrée est insérée dans l'amortisseur d'édition de sorte qu'il soit possible de tapezr la plupart des commandes de GDB sans interaction avec le mode de TUI SingleKey. Une fois que la commande est écrite le mode de TUI SingleKey est reconstitué. La seule manière de laisser de manière permanente ce mode est en frappant q ou `C-x s'.

22,4 Commandes de détail de TUI

Le TUI a des commandes spécifiques de commander les fenêtres des textes. Ces commandes sont toujours disponibles, cela est elles ne dépendent pas du mode terminal courant en lequel GDB fonctionne. Quand GDB est en mode standard, employer ces commandes commutera automatiquement en mode de TUI.

victoire d'information

Enumérez et donnez la taille de toutes les fenêtres montrées.

disposition après

Montrez la prochaine disposition.

prev de disposition

Montrez la disposition précédente.

src de disposition

Montrez la fenêtre de source seulement.

ASM de disposition

Montrez la fenêtre d'assemblée seulement.

fente de disposition

Montrez la fenêtre de source et d'assemblée.

regs de disposition

Montrez la fenêtre de registre ainsi que la fenêtre de source ou d'assemblée.

focalisez après|prev|src|ASM|regs|fente

Placez le foyer à la fenêtre appelée. Cette commande laisse changer la fenêtre active de sorte que la mise en rouleau des clefs puisse être affectée à une autre fenêtre.

régénérez

Régénérez l'écran. C'est semblable à employer Cl clef.

mise à jour

Mettez à jour la fenêtre de source et le point courant d'exécution.

winheight nom +compte

winheight nom -compte

Changez la taille de la fenêtre nom par compte lignes. Les comptes positifs augmentent la taille, alors que les comptes négatifs la diminuent.

22,5 Variables de configuration de TUI

Le TUI a plusieurs variables de configuration qui commandent l'aspect des fenêtres sur la borne.

placez le tui frontière-aimable aimable

Choisissez l'aspect de frontière pour les fenêtres de source, d'assemblée et de registre. Les valeurs possibles sont les suivantes:

l'espace

Employez un caractère d'espace pour dessiner la frontière.

ASCII

Employez les caractères d'cAscii + - et|pour dessiner la frontière.

acs

Employez le jeu de caractères alternatif pour dessiner la frontière. La frontière est dessinée en utilisant des infographies par coordonnées de caractère si la borne les soutient.

placez l'actif-frontière-mode de tui mode

Choisissez les attributs pour montrer la frontière de la fenêtre active. Les valeurs possibles sont normal standout inverse demi moitié-half-standout "bold" et "bold"-bold-standout.

placez le frontière-mode de tui mode

Choisissez les attributs pour montrer la frontière d'autres fenêtres. mode peut être un de ce qui suit:

normal

Employez les attributs normaux pour montrer la frontière.

standout

Employez le mode de standout.

renversez

Employez le mode de vidéo inverse.

demi

Employez demi de mode lumineux.

moitié-half-standout

Employez demi de mode lumineux et de standout.

"bold"

Employez le mode lumineux ou "bold"supplémentaire.

"bold"-bold-standout

Employez le mode supplémentaire lumineux ou "bold"et de standout.

Veuillez envoyer le FSF et les enquêtes et les questions de GNU à gnu@gnu.org . Il y a également d'autres manières d'entrer en contact avec le FSF.

Ces pages sont maintenues par les lotisseurs de GDB .

Copyright Free Software Foundation, Inc., Endroit De 59 Temples - Suite 330, Boston, MA 02111, Etats-Unis.

In extenso copier et distribution de cet article entier est autorisé dans n'importe quel milieu, si cette notification est préservée.

Ce document a été produit par l'administrateur de GDB octobre, 28 2003 texi2html employants

23. Employer GDB sous GNU Emacs

Une interface spéciale vous permet d'employer GNU Emacs pour regarder (et éditer) les fichiers source pour le programme que vous mettez avec GDB.

Pour employer cette interface, employez la commande Gdb de MX dans Emacs. Donnez le dossier exécutable que vous voulez corriger comme argument. Cette commande commence GDB comme sous-processus d'Emacs, avec l'entrée et la sortiepar un amortisseur nouvellement créé d'Emacs.

Employer GDB sous Emacs est juste comme employer GDB normalement excepté deux choses:

Tous les entrée et rendement "terminaux" passe par l'amortisseur d'Emacs.

Ceci s'applique tous les deux aux commandes de GDB et à leur rendement, et à l'entrée et au rendement faits par le programme vous corrigez.

C'est utile parce qu'il signifie que vous pouvez copier le texte des commandes précédentes et les entrer encore; vous pouvez même employer des parties du rendement de cette façon.

Tous les équipements du mode de la shell d'Emacs sont disponibles pour agir l'un sur l'autre avec votre programme. En particulier, vous pouvez envoyer à des signaux la manière habituelle -- par exemple, Cc Cc pour une interruption, Cc C-z pour un arrêt.

GDB montre le code source par Emacs.

Chaque fois que GDB montre le contenu de la pile, Emacs trouve automatiquement le fichier source de cette armature et met une flèche (` = > 'à la marge gauche de la ligne courante. Emacs emploie un amortisseur séparé pour l'affichage de source, et dédouble l'écran pour montrer votre session de GDB et la source.

GDB Explicite liste ou les commandes de recherche produisent toujours la sortiecomme d'habitude, mais vous n'avez probablement aucune raison de les employer d'Emacs.

Si vous indiquez un nom de fichier absolu une fois incité pour Gdb de MX l'argument, alors Emacs place votre annuaire de fonctionnement courant à où votre programme réside. Si vous indiquez seulement le nom de fichier, alors Emacs place votre annuaire de fonctionnement courant à à l'annuaire lié à l'amortisseur précédent. Dans ce cas-ci, GDB peut trouver votre programme en recherchant votre environnement CHEMIN variable, mais sur quelques logiciels d'exploitation il ne pourrait pas trouver la source. Ainsi, bien que la session d'entrée et de rendement de GDB procède normalement, l'amortisseur auxiliaire ne montre pas la source et la ligne courantes d'exécution.

L'annuaire de fonctionnement initial de GDB est imprimé sur la ligne supérieure de l'amortisseur de GDB I/o et ceci sert de défaut aux commandes qui indiquent des dossiers pour GDB pour opérer. Voir les commandes de section d'indiquer des dossiers .

Par défaut, Gdb de MX appelle le programme appelé le gdb de ` '. Si vous devez appeler GDB par un nom différent (par exemple, si vous gardez plusieurs configurations autour, avec différents noms) vous pouvez adapter la variable aux besoins du client d'Emacs gud-gdb-commande-nom pour démarrer celui que vous voulez.

Dans l'amortisseur de GDB I/o, vous pouvez employer ces commandes spéciales d'Emacs en plus des commandes standard de mode de shell:

Ch m

Décrivez les devices du mode du GDB d'Emacs.

Cc De Cs

Exécutez à une autre ligne de source, comme le GDB step commande; mettez à jour également le viseur pour montrer le dossier et l'endroit courants.

Cc C-n

Exécutez à la prochaine ligne de source dans cette fonction, sautant tous les appels de fonction, comme le GDB après commande. Mettez à jour alors le viseur pour montrer le dossier et l'endroit courants.

Ci De Cc

Exécutez une instruction, comme le GDB stepi commande; viseur de mise à jour en conséquence.

Cf De Cc

Exécutez jusqu'à ce que sortie de l'armature choisie de pile, comme le GDB finition commande.

Cc De Cr

Continuez l'exécution de votre programme, comme le GDB continuez commande.

Cc <

Montez le nombre d'armatures indiquées par l'argument numérique (voir les arguments numériques de ` de section du manuel de GNU Emacs ), comme le GDB vers le haut de commande.

Cc >

Descendez le nombre d'armatures indiquées par l'argument numérique, comme le GDB vers le bas commande.

Dans tout fichier source, la commande d'Emacs C-x Spc (gud-cassezdit GDB de placer un break sur le point de ligne de source est dessus.

Si vous tapez MX speedbaralors Emacs montre une armature séparée qui montre un backtrace quand l'amortisseur de GDB I/o est courant. Déplacez le point à n'importe quelle armature dans la pile et tapez Retour pour le faire devenir l'armature courante et montrer la source associée dans l'amortisseur de source. Alternativement, déclic Mouse-2 pour faire l'armature choisie devenez la courante.

Si vous supprimez accidentellement source-montrez l'amortisseur, une manière facile de l'obtenir est de retour tapezr la commande f dans l'amortisseur de GDB, pour demander un affichage d'armature; quand vous executez sous Emacs, ceci recrée l'amortisseur de source au besoin pour vous montrer le contexte de l'armature courante.

Les fichiers source montrés dans Emacs sont dans les amortisseurs ordinaires d'Emacs qui visitent les fichiers source de la manière habituelle. Vous pouvez éditer les dossiers avec ces amortisseurs si vous souhaitez; mais maintenez dans l'esprit que GDB communique avec Emacs en termes de nombres de ligne. Si vous ajoutez ou supprimez des lignes du texte, les nombres de ligne que GDB sait cessent de correspondre correctement au code. La description donnée ici est pour la version 21,3 de GNU Emacs et une description plus détaillée de son interaction avec GDB est donnée du manuel d'Emacs (voir les programmes de mise au point de ` de section du manuel de GNU Emacs ).

24. L'Interface de GDB/mi

Fonction et but

GDB/mi est une interface orientée par machine basée par ligne des textes à GDB. On le prévoit spécifiquement pour soutenir le développement des systèmes qui utilisent le programme de mise au point en tant que juste un petit composant d'un plus grand système.

Ce chapitre est des spécifications de l'interface de GDB/mi. On lui écrit sous forme de manuel de référence.

Notez que GDB/mi est toujours en construction, ainsi certains des devices décrits ci-dessous sont sujets inachevés et au changement.

Notation et terminologie

Ce chapitre emploie la notation suivante:

| sépare deux solutions de rechange.

[ quelque chose ] indique cela quelque chose est facultatif: il peut ou ne peut être donné.

( groupe * signifie cela groupe à l'intérieur des parenthèses peut répéter zéro fois ou plus.

( groupe + signifie cela groupe à l'intérieur des parenthèses peut répéter une ou plusieurs fois.

"corde" signifie une shell corde.

Remerciements

Dans l'ordre alphabétique: Andrew Cagney, Fernando Nasser, Stan Shebs et Elena Zannoni.

24,1 Syntaxe De Commande de GDB/mi

24,1,1 Syntaxe D'Entrée de GDB/mi

commande ==>

cli-commande | mille-commande

cli-commande ==>

[ marque ] cli-commande nloù cli-commande est n'importe quelle commande existante de GDB CLI.

mille-commande ==>

[ marque ] "-" opération ("" option * [ "--" ] ("" paramètre * nl

marque ==>

"tout ordre des chiffres"

option ==>

"-" paramètre [ "" paramètre ]

paramètre ==>

non-blanc-ordre | c-corde

opération ==>

quelles des opérations décrites en ce chapitre

non-blanc-ordre ==>

quelque chose, s'il ne contient pas les caractères spéciaux comme "-", nl""" et naturellement ""

c-corde ==>

""" sept-peu-OIN-c-corde-contenu """

nl ==>

CR|Cr-LF

Notes:

Les commandes de CLI sont encore manipulées par l'interprète de MI; leur rendement est décrit ci-dessous.

marquequand le présent, est passé en arrière quand la commande finit.

Quelques commandes de MI acceptent des arguments facultatifs en tant qu'élément de la liste de paramètre. Chaque option est identifiée par mener ` - ' (tiret) et peut être suivi d'un paramètre facultatif d'argument. Les options se produisent d'abord dans la liste de paramètre et peuvent être délimitées d'employer normal de paramètres ` - - ' (c'est utile quand quelques paramètres commencent par un tiret).

Pragmatique:

Nous voulons l'accès facile à la syntaxe existante de CLI (pour corriger).

Nous voulons qu'elle soit facile de repèrer une opération de MI.

24,1,2 GDB/mi A produit La Syntaxe

la sortiede GDB/mi se compose des disques zéro ou plus hors bande suivis, sur option, d'un disque simple de résultat. Ce disque de résultat est pour la commande la plus récente. L'ordre des disques de rendement est terminé près `(gdb) '.

Si une commande d'entrée était mise en tête avec a marque alors la sortiecorrespondant pour cette commande sera également mis en tête par cela mêmes marque.

rendement ==>

( hors bande * [ résultat-enregistrez ] "(gdb)" nl

résultat-enregistrez ==>

[ marque ] "^" résultat-classe (", " résultat * nl

hors bande ==>

async-enregistrez | jet-enregistrez

async-enregistrez ==>

exec-async-rendement | statut-async-rendement | annoncer-async-rendement

exec-async-rendement ==>

[ marque ] "*" async-rendement

statut-async-rendement ==>

[ marque ] "+" async-rendement

annoncer-async-rendement ==>

[ marque ] "=" async-rendement

async-rendement ==>

async-classe (", " résultat * nl

résultat-classe ==>

"fait"|"courant"|"relié"|"erreur"|"sortie"

async-classe ==>

"arrêté"| d'autres (où d'autres sera ajouté selon les besoins -- c'est toujours à l'étude).

résultat ==>

variable "=" valeur

variable ==>

corde

valeur ==>

const | tuple | liste

const ==>

c-corde

tuple ==>

"{ }"|"{" résultat (", " résultat * "}"

liste ==>

"[ ]"|"[" valeur (", " valeur * "]"|"[" résultat (", " résultat * "]"

jet-enregistrez ==>

console-jet-rendement | cible-jet-rendement | notation-jet-rendement

console-jet-rendement ==>

"~" c-corde

cible-jet-rendement ==>

"@" c-corde

notation-jet-rendement ==>

"et" c-corde

nl ==>

CR|Cr-LF

marque ==>

tout ordre des chiffres .

Notes:

Tout la sortieordonnance l'extrémité dans une ligne simple contenant une période.

marque est de la demande la correspondance. Si une commande d'exécution est interrompue par `-exec-interrompez ' commandez, marque lié au `*stopped ' le message est celui de la commande originale d'exécution, pas celui de la commande d'interruption.

statut-async-rendement contient des informations de statut en cours sur le progrès d'une opération lente. Elle peut être jetée. Tout la sortiede statut est mis en tête près ` + '.

exec-async-rendement contient le changement asynchrone d'état sur la cible (arrêté, commencé, disparu). Tout la sortied'async est mis en tête près ` * '.

annoncer-async-rendement contient l'information supplémentaire que le client devrait manipuler (par exemple, une nouvelle information de break). Tous informent la sortiesont mis en tête près ` = '.

console-jet-rendement est produit qui devrait être montré comme est dans la console. C'est la réponse textuelle à une commande de CLI. Tout la sortiede console est mis en tête près ~ de ` '.

cible-jet-rendement est la sortieproduit par le programme de cible. Tout la sortiede cible est mis en tête près ` @ '.

notation-jet-rendement est le texte produit venant des internals, par exemple des messages de GDB qui devraient être montrés en tant qu'élément d'un registre d'erreurs. Tout la sortiede notation est mis en tête près ` et '.

Les nouvelles commandes de GDB/mi devraient seulement produire listes contenir valeurs.

Voir les disques de jet de la section GDB/mi , pour plus de détails au sujet des divers disques de rendement.

24,1,3 Exemples simples d'interaction de GDB/mi

Cette sous-section présente plusieurs exemples simples d'interaction en utilisant l'interface de GDB/mi. Dans ces exemples, ` - > ' signifie que la ligne suivante est passée à GDB/mi comme entrée, tandis que ` < - ' signifie la sortiereçu de GDB/mi.

Arrêt De Cible

Voici un exemple d'arrêter le processus inférieur:

Â

- > - arrêt < - (gdb)

et plus tard:

Â

< - * arrêt, reason="stop", address="0x123", source="a.c:123 " < - (gdb)

Commande Simple de CLI

Voici un exemple d'une commande simple de CLI étant passée par GDB/mi et dessus au CLI.

Â

- > copie 1+2 < - &"print 1+2\n " < - ~"$1 = 3\n" < - ^done < - (gdb)

Commande Avec Des Effets Secondaires

Â

- > - symbole-dossier xyz.exe < - * break, nr="3", address="0x123", source="a.c:123 " < - (gdb)

Une Mauvaise Commande

Voici ce qui se produit si vous passez une commande inexistante:

Â

- > - des déchets < - ^error, msg="Undefined la commande de MI: déchets " < - (gdb)

24,2 Compatibilité de GDB/mi avec CLI

Pour aider des utilisateurs au courant de l'interface existante du CLI de GDB, GDB/mi accepte des commandes existantes de CLI. Comme indiqué par la syntaxe, de telles commandes peuvent être directement écrites dans l'interface de GDB/mi et GDB répondra.

Ce mécanisme est fourni comme aide aux réalisateurs des clients de GDB/mi et pas comme interface fiable dans le CLI. Puisque la commande est interpreteted dans un environnement qui assume le comportement de GDB/mi, la sortieexact de telles commandes est susceptible de finir vers le haut d'être un hybride sans support de rendement de GDB/mi et de CLI.

24,3 Disques De Rendement de GDB/mi

24,3,1 Disques De Résultat de GDB/mi 24,3,2 Disques De Jet de GDB/mi 24,3,3 Disques Hors bande de GDB/mi

24,3,1 Disques De Résultat de GDB/mi

En plus d'un certain nombre d'avis hors bande, la réponse à une commande de GDB/mi inclut un des indications suivantes de résultat:

"^done" [ ", " résultats ]

L'opération synchrone était réussie, résultats sont les valeurs de retour.

"^running"

L'opération asynchrone a été avec succès commencée. La cible fonctionne.

"^error" ", " c-corde

L'opération a échoué. c-corde contient le message d'erreur correspondant.

24,3,2 Disques De Jet de GDB/mi

GDB intérieurement maintient un certain nombre de jets de rendement: la console, la cible, et la notation. la sortiea prévu pour chacun de ces jets est dirigé par l'interface de GDB/mi en utilisant des disques de jet .

Chaque disque de jet commence par un caractère unique de préfixe qui identifie son jet (voir la section GDB/mi produire la syntaxe ). En plus du préfixe, chaque disque de jet contient a corde-rendement. C'est texte brut (avec une nouvelle ligne implicite) ou une corde citée de C (qui ne contient pas un caractère NL implicite).

"~" corde-rendement

Le jet de rendement de console contient le texte qui devrait être montré dans la fenêtre de console de CLI. Il contient les réponses textuelles aux commandes de CLI.

"@" corde-rendement

Le jet de rendement de cible contient n'importe quel rendement textuel de la cible courante.

"et" corde-rendement

Le jet de notation contient des messages de correction produit par les internals de GDB's.

24,3,3 Disques Hors bande de GDB/mi

Des disques hors bande sont employés pour informer le client de GDB/mi des changements additionnels qui se sont produits. Ces changements peuvent être une conséquence de GDB/mi (par exemple, un break modifié) ou un résultat d'activité de cible (par exemple, cible arrêtée).

Ce qui suit est une liste préliminaire de disques hors bande possibles.

"*" "arrêt"

24,4 Format De Description De Commande de GDB/mi

Les sections restantes décrivent des blocs de commandes. Chaque bloc de commandes est présenté d'une mode semblable à cette section.

Notez les les coupures de ligne montrées dans les exemples sont ici seulement pour la lisibilité. Ils n'apparaissent pas dans le vrai rendement. Notez en outre que les commandes avec un exemple non-disponible (N.a.) ne sont pas encore mis en application.

Motivation

La motivation pour cette collection de commandes.

Introduction

Une brève introduction à cette collection de commandes en général.

Commandes

Pour chaque commande dans le bloc, ce qui suit est décrit:

Synthèse

Â

- args de commande...

Commande de GDB

La commande correspondante de GDB CLI.

Résultat

Hors bande

Notes

Exemple

24,5 Commandes de table de break de GDB/mi

Les documents GDB/mi de cette section commande pour des breaks de manoeuvrer.

- casser-après Commande

Synthèse

Â

- casser-après le compte de nombre

Le nombre de break nombre n'est pas en effet jusqu'à ce qu'il ait été frappé compte périodes. Pour voir comment ceci est reflété dans la sortiedu `-casser-liste ' la commande, voient la description du `-casser-liste ' commande ci-dessous.

Commande de GDB

La commande correspondante de GDB est le ` ignorent '.

Exemple

Â

(gdb) - casser-insérez le ^done , bkpt={number="1", addr="0x000100d0", file="hello.c", le line="5 principaux "} (gdb) - casser-après 1 ^done de 3 ~ (gdb) - ^done de casser-liste, BreakpointTable={nr_rows="1", nr_cols="6", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[bkpt={number="1", type="breakpoint", disp="keep", enabled="y ",

addr="0x000100d0", func="main", file="hello.c", line="5", times="0 ", ignore="3 "} ] } (gdb)

- casser-condition Commande

Synthèse

Â

- expr de nombre de casser-condition

break nombre arrêtera le programme seulement si la condition dedans expr est vrai. La condition devient une partie de `-casser-liste ' rendement (voyez la description du `-casser-liste ' commande ci-dessous).

Commande de GDB

La commande correspondante de GDB est état de ` '.

Exemple

Â

(gdb) - casser-condition 1 1 ^done (gdb) - ^done de casser-liste, BreakpointTable={nr_rows="1", nr_cols="6 ", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[bkpt={number="1", type="breakpoint", disp="keep", enabled="y ", addr="0x000100d0", func="main", file="hello.c", line="5", cond="1 ", times="0", ignore="3 "} ] } (gdb)

- casser-supprimez Commande

Synthèse

Â

- casser-supprimez (break) +

Supprimez le breakpoint(s) dont les nombres sont indiqués dans la liste d'argument. Ceci est évidemment reflété dans la liste de break.

Commande de GDB

La commande correspondante de GDB est effacement de ` '.

Exemple

Â

(gdb) - casser-supprimez 1 ^done (gdb) - ^done de casser-liste, BreakpointTable={nr_rows="0", nr_cols="6 ", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[ ] } (gdb)

- casser-neutralisez Commande

Synthèse

Â

- casser-neutralisez (break) +

Neutralisez appelé break(s). Le champ ` permis ' dans la coupure la liste est maintenant placée à ` n ' pour appelé break(s).

Commande de GDB

La commande correspondante de GDB est le ` neutralisent '.

Exemple

Â

(gdb) - casser-neutralisez le ^done 2 (gdb) - ^done de casser-liste, BreakpointTable={nr_rows="1", nr_cols="6 ", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", le col_name="disp", le colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", le col_name="what", le colhdr="What" } ], body=[bkpt={number="2", type="breakpoint", disp="keep", enabled="n ", addr="0x000100d0", func="main", file="hello.c", line="5", times="0 "} ] } (gdb)

- casser-permettez Commande

Synthèse

Â

- casser-permettez (break) +

Permettez (précédemment neutralisé) break(s).

Commande de GDB

La commande correspondante de GDB est le ` permettent '.

Exemple

Â

(gdb) - casser-permettez le ^done 2 (gdb) - ^done de casser-liste, BreakpointTable={nr_rows="1", nr_cols="6 ", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", le col_name="disp", le colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", le col_name="what", le colhdr="What" } ], body=[bkpt={number="2", type="breakpoint", disp="keep", enabled="y ", addr="0x000100d0", func="main", file="hello.c", line="5", times="0 "} ] } (gdb)

- casser-information Commande

Synthèse

Â

- break casser-information

Obtenez les informations sur un break simple.

Commande de GDB

La commande correspondante de GDB est coupure d'information de ` break'.

Exemple

N.a.

- casser-insérez Commande

Synthèse

Â

- casser-insérez [ - t ] [ - h ] [ - r ] [ - état de c ] [ - j'ignorer-compte ] [ - fil de p ] [ ligne|addr ]

S'indiqué, lignepeut être un de:

fonction

filename:linenum

filename:function

* adresse

Les paramètres facultatifs possibles de cette commande sont:

`-t '

Insérez un break tempoary.

`-h '

Insérez un break de matériel.

`-c condition'

Faites le conditionnel de break dessus condition.

`-i ignorer-comptez'

Initialisez ignorer-comptez.

`-r '

Insérez un break régulier dans toutes les fonctions dont les noms assortissent l'expression régulière donnée. D'autres drapeaux ne sont pas applicables à l'expresson régulier.

Résultat

Le résultat est sous la forme:

Â

^done, bkptno="number", func="funcname ", file="filename", line="lineno "

là où nombre est le nombre de GDB pour ce break, funcname est le nom de la fonction où le break a été inséré, nom de fichier est le nom du fichier source qui contient cette fonction, et lineno est le nombre de ligne de source dans ce dossier.

Note: ce format est ouvert de changement.

Commande de GDB

Les commandes correspondantes de GDB sont coupure de ` ' tbreak de ` ' hbreak de ` ' thbreak de ` 'et rbreak de ` '.

Exemple

Â

(gdb) - casser-insérez le ^done , bkpt={number="1", addr="0x0001072c", file="recursive2.c", le line="4 principaux "} (gdb) - casser-insérez - ^done de foo de t, bkpt={number="2", addr="0x00010774", file="recursive2.c", line="11" } (gdb) - le ^done de casser-liste, BreakpointTable={nr_rows="2", le nr_cols="6 ", hdr=[{width="3", alignment="-1", le col_name="number", le colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", le col_name="enabled", le colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[bkpt={number="1", type="breakpoint", disp="keep", enabled="y - casser-insérez - le foo de r. * foo(int de ~int, internes); ^done, bkpt={number="3", addr="0x00010774", file="recursive2.c", line="11 "} (gdb)

- casser-liste Commande

Synthèse

Â

- casser-liste

Montre la liste de breaks insérés, montrant les champs suivants:

nombre de ` '

nombre du break

type de ` '

type du break: break de ` ' ou watchpoint de ` '

disposition de ` '

si le break est supprimé ou neutralisé quand il est frappé: subsistance de ` ' ou nokeep de ` '

` permis '

est le break permis ou le non: ` y ' ou ` n '

adresses de `

endroit de mémoire auquel le break est placé

` ce qui '

endroit logique du break, exprimé par le nom de fonction, nom de fichier, nombre de ligne

temps de `

nombre de fois où le break a été frappé

S'il n'y a aucun break ou watchpoints, BreakpointTable corps le champ est une liste vide.

Commande de GDB

La commande correspondante de GDB est coupure d'information de ` '.

Exemple

Â

(gdb) - ^done de casser-liste, BreakpointTable={nr_rows="2", nr_cols="6 ", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[bkpt={number="1", type="breakpoint", disp="keep", enabled="y ", addr="0x000100d0", func="main", file="hello.c", line="5", times="0 "}, bkpt={number="2", type="breakpoint", disp="keep", enabled="y", addr="0x00010114", func="foo", file="hello.c", line="13", times="0 "} ] }

Voici un exemple du résultat quand il n'y a aucun break:

Â

(gdb) - ^done de casser-liste, BreakpointTable={nr_rows="0", nr_cols="6 ", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[ ] } (gdb)

- casser-observez Commande

Synthèse

Â

- casser-observez [ - a|- r ]

Créez un watchpoint. Avec `-a ' option il créera un watchpoint d'accès, c.-à-d. un watchpoint dont déclenche sur lu ou sur une inscription à l'endroit de mémoire. Avec `-r ' l'option, le watchpoint créé est un watchpoint lu, c.-à-d. elle déclenchera seulement quand l'endroit de mémoire est consulté pour la lecture. Sans l'une ou l'autre des options, le watchpoint créé est un watchpoint régulier, c.-à-d. il déclenchera quand l'endroit de mémoire est consulté pour l'écriture. Voir la section placer des watchpoints .

Notez cela `-casser-liste ' rapportera une liste simple de watchpoints et de breaks insérés.

Commande de GDB

Les commandes correspondantes de GDB sont montre de ` ' awatch de ` 'et rwatch de ` '.

Exemple

Réglage d'un watchpoint sur une variable dans principal fonction:

Â

(gdb) - casser-observez le ^done de x, wpt={number="2", l'exp="x "} (gdb) - exec-continuez à ^running le ^done, le reason="watchpoint-trigger", wpt={number="2", l'exp="x" }, value={old="-268439212", le new="55 "}, le frame={func="main", l'args=[], file="recursive2.c", le line="5" } (gdb)

Plaçant un watchpoint sur une variable locale à une fonction. GDB arrêtera l'exécution du programme deux fois: d'abord pour la valeur changeante variable, puis pour sortir de watchpoint de la portée.

Â

(gdb) - casser-observez le ^done de C, wpt={number="5", l'exp="C "} (gdb) - exec-continuez à ^running le ^done, le reason="watchpoint-déclenchement", wpt={number="5", l'exp="C"}, value={old="-276895068", le new="3 "}, frame={func="callee4", l'args=[ ], file="../../../devo/gdb/testsuite/gdb.mi/basics.c", le line="13" } (gdb) - exec-continuent à ^running le ^done, le reason="watchpoint-scope", wpnum="5 ", frame={func="callee3", args=[{name="strarg ", value="0x11940 l'argument.\""}], de corde du \"A file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="18 "} (gdb)

breaks et watchpoints de liste, à différents points dans l'exécution du programme. Notez qu'une fois que le watchpoint sort de la portée, elle est supprimée.

Â

(gdb) - casser-observez le ^done de C, wpt={number="2", exp="C "} (gdb) - le ^done de casser-liste, BreakpointTable={nr_rows="2", nr_cols="6", hdr=[{width="3", alignment="-1", le col_name="number", le colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[bkpt={number="1", le type="breakpoint", le disp="keep", enabled="y ", addr="0x00010734", func="callee4 ", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="8", times="1 "}, bkpt={number="2", type="watchpoint", disp="keep", enabled="y" value={old="-276895068", new="3 "}, frame={func="callee4", args=[ ], file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="13" } (gdb) - ^done de casser-liste, BreakpointTable={nr_rows="2", nr_cols="6 ", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[bkpt={number="1", type="breakpoint", disp="keep", enabled="y ", addr="0x00010734", func="callee4 ", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="8", times="1 "}, bkpt={number="2", type="watchpoint", disp="keep value="0x11940 argument.\""}], de corde du \"A file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="18 "} (gdb) - ^done de casser-liste, BreakpointTable={nr_rows="1", nr_cols="6", hdr=[{width="3", alignment="-1", col_name="number", colhdr="Num "}, { width="14", alignment="-1", col_name="type", colhdr="Type" }, { width="4", alignment="-1", col_name="disp", colhdr="Disp "}, { width="3", alignment="-1", col_name="enabled", colhdr="Enb" }, { width="10", alignment="-1", col_name="addr", colhdr="Address "}, { width="40", alignment="2", col_name="what", colhdr="What" } ], body=[bkpt={number="1", type="breakpoint", disp="keep", enabled="y ", addr="0x00010734", func="callee4 ", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="8", times="1 "} ] } (gdb)

24,6 Manipulation De Données de GDB/mi

Cette section décrit les commandes de GDB/mi qui manoeuvrent des données: examinez la mémoire et les registres, évaluent des expressions, etc...

- donnée-démontez Commande

Synthèse

Â

- donnée-démontez [ - s commencent-addr - extrémité-addr de e ]|[ - nom de fichier de f - l linenum [ - lignes de n ] ] -- mode

Là où:

`commencez-addr'

est l'adresse de commencement (ou $$pc

`extrémité-addr'

est l'adresse de fin

`nom de fichier'

est le nom du dossier à démonter

`linenum'

est le nombre de ligne à démonter autour

`lignes'

est le le nombre de lignes de démontage à produire. S'il est -1, la fonction entière sera démontée, au cas où non extrémité-addr est indiqué. Si extrémité-addr est indiqué comme valeur différente de zéro, et lignes est inférieur au nombre de lignes de démontage entre commencez-addr et extrémité-addrseulement lignes des lignes sont montrées; si lignes est plus haut que le nombre de lignes entre commencez-addr et extrémité-addrseulement aligne à extrémité-addr sont montrés.

`mode'

est 0 (démontage de signification seulement) ou 1 (source et démontage mélangés de signification).

Résultat

la sortiepour chaque instruction se compose de quatre champs:

Adresse

Fonctionnel-nom

Excentrage

Instruction

Notez que quelqu'inclus dans le domaine d'instruction, ne soit pas manoeuvré directely par GDB/mi, c.-à-d. il n'est pas possible d'ajuster son format.

Commande de GDB

Il n'y a aucun tracer direct de cette commande au CLI.

Exemple

Démontez de la valeur courante de $$pc à $$pc + 20

Â

(gdb) - donnée-démontez - s $$pc - e "$$pc + 20" -- 0 ^done, l'asm_insns=[ { address="0x000107c0", fonctionnel-name="main", offset="4 ", inst="mov 2, %o0 "}, { address="0x000107c4", fonctionnel-name="main", offset="8", inst="sethi %hi(0x11800), %o2 "}, { address="0x000107c8", fonctionnel-name="main", offset="12", inst="or %o2, 0x140, %o1\t! 0x11940 < _ lib_version+8 > "}, { address="0x000107cc", fonctionnel-name="main", offset="16", inst="sethi %hi(0x11800), %o2 "}, { address="0x000107d0", fonctionnel-name="main", offset="20", inst="or %o2, 0x168, %o4\t! 0x11968 < _ lib_version+48 > "} ] (gdb)

Démontez le tout principal fonction. La ligne 32 fait partie de principal.

Â

- donnée-démontez - f basics.c - l 32 -- 0 ^done, l'asm_insns=[ { address="0x000107bc", fonctionnels-name="main", offset="0 ", inst="save %sp, -112, %sp "}, { address="0x000107c0", fonctionnel-name="main", offset="4", inst="mov 2, %o0 "}, { address="0x000107c4", fonctionnel-name="main", offset="8", inst="sethi %hi(0x11800), %o2 "}, [... ] { address="0x000108ç", fonctionnel-name="main", offset="96", inst="ret" }, { address="0x00010820", fonctionnel-name="main", offset="100", inst="restore "} ] (gdb)

Démontez 3 instructions dès le début de principal

Â

(gdb) - donnée-démontez - f basics.c - l 32 - fonctionnel-name="main"de n 3 -- 0 ^done, asm_insns=[ { address="0x000107bc", fonctionnel-name="main", offset="0" , inst="save %sp, -112, %sp "} , { address="0x000107c0", fonctionnel-name="main", offset="4" , inst="mov 2, %o0 "} , { address="0x000107c4", offset="8", inst="sethi %hi(0x11800), %o2 "} ] (gdb)

Démontez 3 instructions dès le début de principal en mode mélangé:

Â

(gdb) - donnée-démontez - f basics.c - l 32 - ^done de n 3 -- 1, l'asm_insns=[ src_and_asm_line={line="31 ", /de file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb \ testsuite/gdb.mi/basics.c", le line_asm_insn=[ { address="0x000107bc", fonctionnel-name="main", offset="0 ", inst="save %sp, -112, %sp "}]}, src_and_asm_line={line="32 ", /de file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb \

testsuite/gdb.mi/basics.c", line_asm_insn=[ { address="0x000107c0", fonctionnel-name="main", offset="4 ", inst="mov 2, %o0 "}, { address="0x000107c4", fonctionnel-name="main", offset="8", inst="sethi %hi(0x11800), "}]}] %o2 (gdb)

- donnée-évaluer-expression Commande

Synthèse

Â

- expr d'donnée-évaluer-expression

Evaluez expr comme expression. L'expression a pu contenir un appel inférieur de fonction. L'appel de fonction s'exécutera synchroniquement. Si l'expression contient les espaces, elle doit être enfermée dans de doubles quotes.

Commande de GDB

Les commandes correspondantes de GDB sont copie de ` ' ` produit 'et appel de ` '. Dans gdbtk seulement, il y a une correspondance ` gdb_eval ' commande.

Exemple

Dans l'exemple suivant, les nombres qui précèdent les commandes sont la marque décrite en syntaxe de commande de GDB/mi . Notification comment GDB/mi renvoie la même marque dans son rendement.

Â

211-data-evaluate-expression A 211^done, "( gdb) 311-data-evaluate-expression &A value="1 311^done, value="0xefffeb7c" (gdb) 411-data-evaluate-expression A+3 411^done, value="4 " (gdb) 511-data-evaluate-expression" A + 3 " 511^done, value="4" (gdb)

- donnée-liste-changer-s'enregistre Commande

Synthèse

Â

- donnée-liste-changer-s'enregistre

Montrez une liste des registres qui ont changé.

Commande de GDB

GDB n'a pas un analogue direct pour cette commande; gdbtk a la commande correspondante gdb_changed_register_list de ` '.

Exemple

Sur un conseil de PPC MBX:

Â

(gdb) - exec-continuez à ^running (gdb) * arrêté, le reason="breakpoint-hit", bkptno="1", frame={func="main ", args=[], file="try.c", line="5 "} (gdb) - donnée-liste-changer-enregistre ^done,changed-registers=["0"," 1", "2"," 4", "5"," 6", "7"," 8", "9", "10"," 11", "13"," 14", "15"," 16", "17"," 18", "19"," 20", "21"," 22", "23", "24"," 25", "26"," 27", "28"," 30", "31"," 64"

- donnée-liste-enregistrer-noms Commande

Synthèse

Â

- donnée-liste-enregistrer-noms [ (regno) + ]

Montrez une liste de noms de registre pour la cible courante. Si aucun argument n'est donné, elle montre une liste des noms de tous les registres. Si des nombres de nombre entier sont donnés comme arguments, elle imprimera une liste des noms des registres correspondant aux arguments. Pour assurer l'uniformité entre un nom de registre et son nombre, la liste de rendement peut inclure des noms de registre vides.

Commande de GDB

GDB n'a pas une commande à la laquelle correspond `-donnée-liste-enregistrer-no. Dans gdbtk il y a une commande correspondante gdb_regnames de `.

Exemple

Pour le conseil de PPC MBX:

(gdb) - donnée-liste-enregistrer-noms ^done,register-names=["r0", "r1"," r2", "r3"," r4", "r5"," r6", "r7", "r8"," r9", "r10"," r11", "r12"," r13", "r14"," r15", "r16"," r17", "r18", "r19"," r20", "r21"," r22", "r23"," r24", "r25"," r26", "r27"," r28", "r29", "r30"," r31", "f0"," f1", "f2"," f3", "f4"," f5",

- donnée-liste-enregistrer-valeurs Commande

Synthèse

Â

- fmt de donnée-liste-enregistrer-valeurs [ (regno) * ]

Montrez le contenu des registres. fmt est le format selon lequel le contenu des registres doit être retourné, suivi d'une liste facultative de nombres indiquant les registres pour montrer. Une liste absente de nombres indique que les teneurs de tous les registres doivent être retournées.

Formats permis pour fmt soyez:

X

Hexadécimal

o

Octal

t

Binaire

d

Décimal

r

Cru

N

Normal

Commande de GDB

Les commandes correspondantes de GDB sont repérage d'information de ` ' tout-repérage d'information de ` 'et (dans gdbtk gdb_fetch_registers de `.

Exemple

Pour un panneau de PPC MBX (note: les coupures de ligne sont pour la lisibilité seulement, elles n'apparaissent pas dans la sortieréel):

Â

(gdb) - le ^done 65 des donnée-liste-enregistrer-valeurs r 64, enregistrez-values=[{number="64", value="0xfe00a300 "}, { number="65", value="0x00029002" } ] (gdb) - le ^done des donnée-liste-enregistrer-valeurs X, s'enregistrent-values=[{number="0", value="0xfe0043c8 "}, { number="1", value="0x3fff88"}, {number="2", value="0xfffffffe" }, { number="3", value="0x0"}, {number="4", value="0xa "}, { number="5", value="0x3fff68"}, {number="6", value="0x3fff58" }, { number="7", value="0xfe011e98"}, {number="8", value="0x2 "}, { number="9", value="0xfa202820"}, {number="10", value="0xfa202808" }, { number="11", value="0x1"}, {number="12", value="0x0 "}, { number="13", value="0x4544"}, {number="14", value="0xffdfffff" }, { number="15", value="0xffffffff"}, {number="16", { number="23", value="0xffffffff"}, {number="24", value="0xffffffff "}, { number="25", value="0xffffffff"}, {number="26", value="0xfffffffb" }, { number="27", value="0xffffffff"}, {number="28", value="0xf7bfffff "}, { number="29", value="0x0"}, {number="30", value="0xfe010000" }, { number="31", value="0x0"}, {number="32", value="0x0 "}, { number="33", value="0x0"}, {number="34", value="0x0" }, { number="35", value="0x0"}, {number="36", value="0x0 "}, { number="37", value="0x0"}, {number="38", value="0x0" }, { number="39", value="0x0"}, {number="40", value="0x0 "}, { number="41", value="0x0"}, {number="42", value="0x0" }, { number="43", value="0x0"}, {number="44", value="0x0 "}, { number="57", value="0x0"}, {number="58", value="0x0 "}, { number="59", value="0x0"}, {number="60", value="0x0" }, { number="61", value="0x0"}, {number="62", value="0x0 "}, { number="63", value="0x0"}, {number="64", value="0xfe00a300" }, { number="65", value="0x29002"}, {number="66", value="0x202f04b5 "}, { number="67", value="0xfe0043b0"}, {number="68", value="0xfe00bé4" }, { number="69", value="0x20002b03 "} ] (gdb)

- donnée-lire-mémoire Commande

Synthèse

Â

- nr-cols de nr-rangées de mot-taille de mot-format d'adresse de donnée-lire-mémoire [ - o byte-a excentré ] [ aschar ]

là où:

`adresse'

Une expression indiquant l'adresse du premier mot de mémoire à lire. Des expressions complexes contenant l'espace blanc inclus devraient être citées en utilisant la convention de C.

`mot-format'

Le format à employer pour imprimer les mots de mémoire. La notation est la même que pour GDB copie commande (voir la section produire des formats ).

`mot-taille'

La taille de chaque mot de mémoire dans les bytes.

`nr-rangées'

Le nombre de rangées dans la table de rendement.

`nr-cols'

Le nombre de colonnes dans la table de rendement.

`aschar'

Si le présent, indique que chaque rangée devrait inclure une décharge d'cAscii. La valeur de aschar est employé comme caractère de remplissage entre le moment où un byte n'est pas un membre du jeu de caractères imprimable d'cAscii (les caractères imprimables d'cAscii sont ceux dont le code est 32 et 126, inclusivement).

`byte-excentrez'

Un excentrage à ajouter au adresse avant de chercher la mémoire.

Cette commande montre le contenu de mémoire comme table de nr-rangées par nr-cols mots, chaque mot étant mot-taille bytes. Au total, nr-rangées * nr-cols * mot-taille des bytes sont lus (retourné As total-byt de `Si moins que le nombre demandé de bytes soyez retourné par la cible, les mots absents sont employer identifié ` N/a '. Le nombre de bytes lus de la cible est retourné dedans nr-byt de ` et l'adresse commençante lisait la mémoire dedans addr de ` '.

De suivant/précédent l'adresse la rangée ou page est disponible dedans prochain-rangée de ` ' et prev-rangée de ` ' ` next-page ' et prev-page de ` '.

Commande de GDB

La commande correspondante de GDB est x'de `. gdbtk a gdb_get_mem de ` ' commande lue de mémoire.

Exemple

Lisez six bytes de mémoire commençant à bytes+6 mais excentrez alors près -6 bytes. Format en tant que trois rangées de deux colonnes. Un byte par mot. Montrez chaque mot dans le sortilège.

Â

(gdb) 9-data-read-memory - o -6 -- bytes+6 X 1 3 2 9^done, addr="0x00001390", nr-bytes="6", total-bytes="6 ", prochains-row="0x00001396", prev-row="0x0000138e", next-page="0x00001396 ", prev-page="0x000013Ã¥", memory=[ { addr="0x00001390",data=["0x00", "0x01" ] }, { addr="0x00001392",data=["0x02", "0x03" ] }, { addr="0x00001394",data=["0x04", "0x05" ] } ] (gdb)

Lisez deux bytes de mémoire commençant à l'adresse shorts + 64 et l'affichage comme mot simple a composé dans la décimale.

Â

(gdb) 5-data-read-memory shorts+64 d 2 1 1

5^done, addr="0x00001510", nr-bytes="2", total-bytes="2 ", prochain-row="0x00001512", prev-row="0x0000150e ", prochains-page="0x00001512", prev-page="0x0000150e", memory=[ { addr="0x00001510", data=["128 "] } ] (gdb)

Lisez trente deux bytes de mémoire commençant à bytes+16 et format en tant que huit rangées de quatre colonnes. Incluez un codage de corde avec x'de ` utilisé comme caractère non-imprimable.

Â

(gdb) 4-data-read-memory bytes+16 X 1 8 4 x 4^done, addr="0x00001Ã¡0", nr-bytes="32", total-bytes="32 ", prochain-row="0x000013c0", prev-row="0x0000139c ", prochain-page="0x000013c0", prev-page="0x00001380", memory=[ { addr="0x00001Ã¡0",data=["0x10", "0x11"," 0x12", "0x13"],ascii="xxxx" }, { addr="0x00001Ã¡4",data=["0x14", "0x15"," 0x16", "0x17"],ascii="xxxx" }, { addr="0x00001Ã¡8",data=["0x18", "0x19"," 0x1a", "0x1b"],ascii="xxxx" }, { addr="0x00001Ã¡c",data=["0xç", "0x1d"," 0x1e", "0x1f"],ascii="xxxx" }, { addr="0x000013b0",data=["0x20", "0x21"," 0x22", "0x23"],ascii ="!\"#"}, { addr="0x000013b4",data=["0x24", "0x25"," 0x26", "0x27"],ascii="$%& '" }, { addr="0x000013b8",data=["0x28"," 0x29", "0xà"," 0x2b"],ascii="()*+ "}, { addr="0x000013bc",data=["0x2c"," 0x2d", "0xè"," 0x2f"],ascii =",-./"}] (gdb)

- montrer-supprimez Commande

Synthèse

Â

- montrer-supprimez le nombre

Supprimez l'affichage nombre.

Commande de GDB

La commande correspondante de GDB est affichage d'effacement de ` '.

Exemple

N.a.

- montrer-neutralisez Commande

Synthèse

Â

- montrer-neutralisez le nombre

Neutralisez l'affichage nombre.

Commande de GDB

La commande correspondante de GDB est le ` neutralisent l'affichage '.

Exemple

N.a.

- montrer-permettez Commande

Synthèse

Â

- montrer-permettez le nombre

Permettez l'affichage nombre.

Commande de GDB

La commande correspondante de GDB est le ` permettent l'affichage '.

Exemple

N.a.

- montrer-insérez Commande

Synthèse

Â

- montrer-insérez l'expression

Affichage expression chaque fois que le programme s'arrête.

Commande de GDB

La commande correspondante de GDB est affichage de ` '.

Exemple

N.a.

- montrer-liste Commande

Synthèse

Â

- montrer-liste

Enumérez les affichages. Ne montrez pas les valeurs courantes.

Commande de GDB

La commande correspondante de GDB est affichage d'information de ` '.

Exemple

N.a.

- environnement-CD Commande

Synthèse

Â

- pathdir environnement-CD

Placez l'annuaire de fonctionnement de GDB.

Commande de GDB

La commande correspondante de GDB est Cd de ` '.

Exemple

Â

(gdb) - environnement-CD/^done de kwikemart/marge/ezannoni/flathead-dev/devo/gdb (gdb)

- environnement-annuaire Commande

Synthèse

Â

- environnement-annuaire [ - r ] [ pathdir ] +

Ajoutez les annuaires pathdir au commencement du chemin de recherche pour des fichiers source. Si `-r ' l'option est employée, le chemin de recherche est remise à zéro au chemin de recherche de défaut. Si annuaires pathdir sont fournis en plus du `-r ' l'option, le chemin de recherche est la première remise et alors l'addition se produit en tant que normale. Des annuaires multiples peuvent être indiqués, séparé par des blancs. L'indication des annuaires multiples dans une commande simple a comme conséquence les annuaires supplémentaires au commencement du chemin de recherche dans le même ordre qu'ils ont été présentés dans la commande. Si les blancs sont nécessaires en tant qu'élément d'un nom d'annuaire, double-cite devrait être employé autour du nom. Dans la sortiede commande, le chemin révélera séparé par le caractère d'annuaire-séparateur de système. Le caractère d'annuaire-seperator ne doit pas n'être employé dans aucun nom d'annuaire. Si aucun annuaire n'est indiqué, le chemin de recherche courant est montré.

Commande de GDB

La commande correspondante de GDB est dir de ` '.

Exemple

Â

(gdb) - ^done de l'environnement-annuaire/ kwikemart/marge/ezannoni/flathead-dev/devo/gdb, ^done d'environnement-annuaire de source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd "( gdb) -" ", source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd " (gdb) - environnement-annuaire - r/^done de home/jjohnstn/src/gdb/ usr/src, source-path="/home/jjohnstn/src/gdb:/usr/src:$cdir:$cwd" (gdb) - environnement-annuaire - ^done de r, source-path="$cdir:$cwd " (gdb)

- environnement-chemin Commande

Synthèse

Â

- environnement-chemin [ - r ] [ pathdir ] +

Ajoutez les annuaires pathdir au commencement du chemin de recherche pour des fichiers d'exécution. Si `-r ' l'option est employée, le chemin de recherche est remise à zéro au chemin de recherche original qui a existé à la mise en train de gdb. Si annuaires pathdir sont fournis en plus du `-r ' l'option, le chemin de recherche est la première remise et alors l'addition se produit en tant que normale. Des annuaires multiples peuvent être indiqués, séparé par des blancs. L'indication des annuaires multiples dans une commande simple a comme conséquence les annuaires supplémentaires au commencement du chemin de recherche dans le même ordre qu'ils ont été présentés dans la commande. Si les blancs sont nécessaires en tant qu'élément d'un nom d'annuaire, double-cite devrait être employé autour du nom. Dans la sortiede commande, le chemin révélera séparé par le caractère d'annuaire-séparateur de système. Le caractère d'annuaire-seperator ne doit pas n'être employé dans aucun nom d'annuaire. Si aucun annuaire n'est indiqué, le chemin courant est montré.

Commande de GDB

La commande correspondante de GDB est chemin de ` '.

Exemple

Â

(gdb) - ^done d'environnement-chemin, path="/usr/bin " (gdb) - environnement-chemin/kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb/^done de casier, path="/kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb:/bin:/usr/bin" (gdb) - environnement-chemin - ^done de r/ usr/local/bin, path="/usr/local/bin:/usr/bin " (gdb)

- environnement-pwd Commande

Synthèse

Â

- environnement-pwd

Montrez l'annuaire de fonctionnement courant.

Commande de GDB

La commande correspondante de GDB est pwd de ` '.

Exemple

Â

(gdb) - ^done d'environnement-pwd, cwd="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb " (gdb)

24,7 Commande de programme de GDB/mi

Arrêt de programme

En raison de l'exécution, le programme inférieur peut fonctionner à l'accomplissement, s'il ne rencontre aucun break. Dans ce cas-ci la sortieinclura un code de sortie, si le programme a sorti exceptionnellement.

Exemples

Programme sorti normalement:

Â

(gdb) - exec-executez ^running (gdb) x = 55 * arrêté, reason="exited-normally " (gdb)

Programme sorti exceptionnellement:

Â

(gdb) - exec-executez ^running (gdb) x = 55 * arrêté, le reason="exited", exit-code="01 " (gdb)

Une autre manière que le programme peut se terminer est si elle reçoit un signal comme SIGINT. Dans ce cas-ci, GDB/mi montre ceci:

Â

(gdb) * arrêté, reason="exited-signalled", signal-name="SIGINT ", signal-meaning="Interrupt "

- exec-avortez Commande

Synthèse

Â

- exec-avortez

Tuez le programme courant inférieur.

Commande de GDB

La commande correspondante de GDB est mise à mort de ` '.

Exemple

N.a.

- exec-arguments Commande

Synthèse

Â

- args d'exec-arguments

Placez les arguments inférieurs de programme, pour être employé dans le prochain `-exec-executez '.

Commande de GDB

La commande correspondante de GDB est args réglés de `.

Exemple

N'ayez pas un autour.

- exec-continuez Commande

Synthèse

Â

- exec-continuez

Commande asynchrone. Reprend l'exécution du programme inférieur jusqu'à ce qu'un break soit produit, ou jusqu'aux sorties inférieures.

Commande de GDB

La correspondance correspondante de GDB est le ` continuent '.

Exemple

Â

- exec-continuez à ^running le monde de @Hello ( de gdb) * arrêté, le reason="breakpoint-hit", bkptno="2", le frame={func="foo", l'args=[ ], file="hello.c", le line="13 "} (gdb)

- exec-finissez Commande

Synthèse

Â

- exec-finissez

Commande asynchrone. Reprend l'exécution du programme inférieur jusqu'à ce que la fonction courante soit sortie. Montre les résultats retournés par la fonction.

Commande de GDB

La commande correspondante de GDB est finition de ` '.

Exemple

Renvoi de fonction vide.

Â

- exec-finissez ^running le @hello (de gdb ) du foo * arrêté, du reason="function-finished", du frame={func="main", de l'args=[ ], de file="hello.c", du line="7 "} (gdb)

Fonction retournant autre que vide. Le nom de la variable interne de GDB stockant le résultat est imprimé, ainsi que la valeur elle-même.

Â

- exec-finissez ^running (gdb) * arrêté, le reason="function-finished", frame={addr="0x000107b0", func="foo ", args=[{name="a", value="1"], le {name="b", value="9 "} }, file="recursive2.c", line="14" }, le gdb-résultat-var="$1", return-value="0 " (gdb)

- exec-interrompez Commande

Synthèse

Â

- exec-interrompez

Commande asynchrone. Interrompt l'exécution de fond de la cible. Note comment la marque liée au message d'arrêt est celle pour la commande d'exécution qui a été interrompue. La marque pour l'interruption elle-même apparaît seulement dans `^done ' rendement. Si l'utilisateur essaye d'interrompre un programme non exécuté, un message d'erreur sera imprimé.

Commande de GDB

La commande correspondante de GDB est interruption de ` '.

Exemple

Â

(gdb) 111-exec-continue 111^running (gdb) 222-exec-interrupt 222^done (gdb) 111*stopped, signal-name="SIGINT", signal-meaning="Interrupt ", frame={addr="0x00010140", func="foo", args=[], file="try.c", line="13 "} (gdb) (gdb) - exec-interrompez le ^error, msg="mi_cmd_exec_interrupt: Exécution inférieure." (gdb)

- exec-prochain Commande

Synthèse

Â

- exec-prochain

Commande asynchrone. Reprend l'exécution du programme inférieur, s'arrêtant quand le commencement de la prochaine ligne de source est atteint.

Commande de GDB

La commande correspondante de GDB est ` après '.

Exemple

Â

- exec-prochain ^running (gdb) * arrêté, reason="end-faisant un pas-range", line="8", file="hello.c " (gdb)

- exec-prochain-instruction Commande

Synthèse

Â

- exec-prochain-instruction

Commande asynchrone. Exécute une instruction de machine. Si l'instruction est un appel de fonction continue jusqu'à ce que la fonction retourne. Si le programme s'arrête à une instruction au milieu d'une ligne de source, l'adresse sera aussi bien imprimée.

Commande de GDB

La commande correspondante de GDB est nexti de ` '.

Exemple

Â

(gdb) - exec-prochain-instruction ^running (gdb) * arrêté, reason="end-faire un pas-gamme ", addr="0x000100d4", line="5", file="hello.c " (gdb)

- exec-retournez Commande

Synthèse

Â

- exec-retournez

Retour courant de fonction de marques immédiatement. N'exécute pas l'inférieur. Montre la nouvelle armature courante.

Commande de GDB

La commande correspondante de GDB est retour de ` '.

Exemple

Â

(gdb) 200-break-insert callee4 200^done, bkpt={number="1", addr="0x00010734 ", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="8 "} (gdb) 000-exec-run 000^running (gdb) 000*stopped, reason="breakpoint-hit", bkptno="1", frame={func="callee4", args=[ ], file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="8 "} (gdb) 205-break-delete 205^done (gdb) 111-exec-return 111^done, frame={level="0", func="callee3", args=[{name="strarg ", value="0x11940 argument.\""}], de corde du \"A file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="18 "} (gdb)

- exec-executez Commande

Synthèse

Â

- exec-executez

Commande asynchrone. Commence l'exécution de l'inférieur à partir du commencement. L'inférieur s'exécute jusqu'à ce que l'un ou l'autre un break soit produit ou les sorties de programme.

Commande de GDB

La commande correspondante de GDB est ` run '.

Exemple

Â

(gdb) - casser-insérez le ^done principal, bkpt={number="1", addr="0x0001072c", file="recursive2.c", line="4 "} (gdb) - exec-executez ^running (gdb) * arrêté, le reason="breakpoint-hit", bkptno="1", le frame={func="main", l'args=[], file="recursive2.c", line="4 "} (gdb)

- exec-montrer-arguments Commande

Synthèse

Â

- exec-montrer-arguments

Imprimez les arguments du programme.

Commande de GDB

La commande correspondante de GDB est args d'exposition de `.

Exemple

N.a.

- exec-step Commande

Synthèse

Â

- exec-step

Commande asynchrone. Reprend l'exécution du programme inférieur, s'arrêtant quand le commencement de la prochaine ligne de source est atteint, si la prochaine ligne de source n'est pas un appel de fonction. Si elle est, arrêtez à la première instruction de la fonction appelée.

Commande de GDB

La commande correspondante de GDB est step de ` '.

Exemple

Progression dans une fonction:

Â

- exec-step ^running (gdb) * arrêté, reason="end-faire un pas-gamme ", frame={func="foo", args=[{name="a", value="10 "}, { name="b", value="0"}], file="recursive2.c", line="11" } (gdb)

Progression régulière:

Â

- exec-step ^running (gdb) * arrêté, reason="end-faisant un pas-range", line="14", file="recursive2.c " (gdb)

- exec-step-instruction Commande

Synthèse

Â

- exec-step-instruction

Commande asynchrone. Reprend l'inférieur qui exécute une instruction de machine. Le rendement, une fois que GDB s'est arrêté, changera selon, que nous nous soyons arrêtés au milieu d'une ligne de source ou pas. Dans l'ancien cas, l'adresse auquel le programme s'est arrêtée sera aussi bien imprimé.

Commande de GDB

La commande correspondante de GDB est stepi de ` '.

Exemple

Â

(gdb)

- exec-step-instruction ^running (gdb) * arrêté, reason="end-faire un pas-gamme ", frame={func="foo", args=[], file="try.c", line="10 "} (gdb) - exec-step-instruction ^running (gdb) * arrêté, reason="end-faire un pas-gamme", frame={addr="0x000100f4", func="foo", args=[], file="try.c", line="10 "} (gdb)

- exec-jusqu'à ce que Commande

Synthèse

Â

- exec-jusqu'à ce que [ endroit ]

Commande asynchrone. Exécute l'inférieur jusqu'au endroit indiqué dans l'argument est atteint. S'il n'y a aucun argument, l'inférieur s'exécute jusqu'à ce qu'une ligne de source plus grande que la courante soit atteinte. La raison de l'arrêt dans ce cas-ci sera ` endroit-atteint '.

Commande de GDB

La commande correspondante de GDB est ` jusque à '.

Exemple

Â

(gdb) - exec-jusqu'à ce que recursive2.c:6 ^running (gdb) x = 55 * arrêté, reason="location-reached", frame={func="main", args=[ ], file="recursive2.c", line="6 "} (gdb)

- dossier-exec-et-symboles Commande

Synthèse

Â

- dossier de dossier-exec-et-symboles

Indiquez le dossier exécutable à corriger. Ce dossier est celui dont la table de symbole est également lue. Si aucun dossier n'est indiqué, la commande dégage l'information exécutable et de symbole. Si des breaks sont placés en utilisant cette commande sans les arguments, GDB produira des messages d'erreur. Autrement, aucun rendement n'est produit, excepté un avis d'accomplissement.

Commande de GDB

La commande correspondante de GDB est dossier de ` '.

Exemple

Â

(gdb) - ^done des dossier-exec-et-symboles/ kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx (gdb)

- dossier-exec-dossier Commande

Synthèse

Â

- dossier de dossier-exec-dossier

Indiquez le dossier exécutable à corriger. Différent `-dossier-exec-et-symbolla table de symbole n'est pas lue à partir de ce dossier. Si utilisé sans argument, GDB dégage les informations sur le dossier exécutable. Aucun rendement n'est produit, excepté un avis d'accomplissement.

Commande de GDB

La commande correspondante de GDB est exec-dossier de ` '.

Exemple

Â

(gdb) - ^done du dossier-exec-dossier/ kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx (gdb)

- dossier-liste-exec-sections Commande

Synthèse

Â

- dossier-liste-exec-sections

Enumérez les sections du dossier exécutable courant.

Commande de GDB

La commande de GDB dossier d'information de ` ' expositions, parmi le repos, la même information que cette commande. gdbtk a une commande correspondante gdb_load_info de ` '.

Exemple

N.a.

- dossier-liste-exec-source-dossier Commande

Synthèse

Â

- dossier-liste-exec-source-dossier

Enumérez le nombre de ligne, le fichier source courant, et le chemin absolu au fichier source courant pour le courant exécutable.

Commande de GDB

Il n'y a aucune commande de GDB qui correspond directement à celle-ci.

Exemple

Â

(gdb) 123-file-list-exec-source-file 123^done, line="1", file="foo.c", fullname="/home/bar/foo.c " (gdb)

- dossier-liste-exec-source-dossiers Commande

Synthèse

Â

- dossier-liste-exec-source-dossiers

Enumérez les fichiers source pour le courant exécutable.

Commande de GDB

Il n'y a aucune commande de GDB qui correspond directement à celle-ci. gdbtk a une commande analogue gdb_listfiles de `.

Exemple

N.a.

- dossier-liste-partager-bibliothèques Commande

Synthèse

Â

- dossier-liste-partager-bibliothèques

Enumérez les bibliothèques partagées dans le programme.

Commande de GDB

La commande correspondante de GDB est information de ` partagée '.

Exemple

N.a.

- dossier-liste-symbole-dossiers Commande

Synthèse

Â

- dossier-liste-symbole-dossiers

Dossiers de symbole de liste.

Commande de GDB

La commande correspondante de GDB est dossier d'information de ` ' (une partie d'elle).

Exemple

N.a.

- dossier-symbole-dossier Commande

Synthèse

Â

- dossier de dossier-symbole-dossier

Lisez l'information de table de symbole du indiquée dossier argument. Une fois utilisé sans arguments, information de table de symbole de GDB d'espaces libres. Aucun rendement n'est produit, excepté un avis d'accomplissement.

Commande de GDB

La commande correspondante de GDB est symbole-dossier de ` '.

Exemple

Â

(gdb) - ^done du dossier-symbole-dossier/ kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx (gdb)

24,8 Commandes diverses de GDB dans GDB/mi

- gdb-sortie Commande

Synthèse

Â

- gdb-sortie

Sortez GDB immédiatement.

Commande de GDB

Correspond approximativement à ` stoppé '.

Exemple

Â

(gdb) - gdb-sortie

- gdb-placez Commande

Synthèse

Â

- gdb-placez

Placez un GDB interne variable.

Commande de GDB

La commande correspondante de GDB est ` réglé '.

Exemple

Â

(gdb) - gdb-placez $$foo=3 le ^done (gdb)

- gdb-montrez Commande

Synthèse

Â

- gdb-montrez

Montrez la valeur courante d'une variable de GDB.

Commande de GDB

La commande correspondante de GDB est exposition de ` '.

Exemple

Â

(gdb) - gdb-montrez annotent le ^done, value="0 " (gdb)

- gdb-version Commande

Synthèse

Â

- gdb-version

Montrez l'information de version pour GDB. Used la plupart du temps dans l'essai.

Commande de GDB

Il n'y a aucune commande équivalente de GDB. GDB par défaut montre cette information quand vous commencez une session interactive.

Exemple

Â

(gdb) - base libre de logiciel du ~Copyright 2000 du gdb 5,2,1 de la gdb-version ~gnu, inc.. ~gdb est logiciel libre, couvert par le permis de grand public de GNU, et le ~you sont bienvenu pour le changer et/ou pour distribuer des copies de lui dans certains états de ~. ~Type "exposition copiant" pour voir les conditions. le ~There n'est absolument aucune garantie pour GDB. tapez l'"garantie d'exposition" pour des détails de ~. les ~This GDB ont été configurés en tant que "- - host=sparc-sun-solaris2.5.1 -- target=ppc-eabi". ^done

(gdb)

- interprète-exec Commande

Synthèse

Â

- ordre d'interprète d'interprète-exec

Exécutez indiqué commande dans donné interprète.

Commande de GDB

La commande correspondante de GDB est interprète-exec de ` '.

Exemple

Â

(gdb) - la lecture &"During principale de symbole de "coupure de console d'interprète-exec", ne pourrait pas analyser le type; programme de mise au point hors du ~"Breakpoint 1 du structure-type format.\n de date?.\n "lecture &"During de symbole, mauvais" à 0x8074fc6: classez../../src/gdb/main.c, ^done de la ligne 743.\n " (gdb)

24,9 Commandes De Manipulation De Pile de GDB/mi

- empiler-information-armature Commande

Synthèse

Â

- empiler-information-armature

Obtenez l'information sur l'armature courante.

Commande de GDB

La commande correspondante de GDB est armature d'information de ` ' ou armature de ` ' (sans arguments).

Exemple

N.a.

- empiler-information-profondeur Commande

Synthèse

Â

- empiler-information-profondeur [ maximum-profondeur ]

Renvoyez la profondeur de la pile. Si l'argument de nombre entier maximum-profondeur est indiqué, ne compte pas là-bas maximum-profondeur armatures.

Commande de GDB

Il n'y a aucune commande équivalente de GDB.

Exemple

Pour une pile avec l'armature nivelle 0 à 11:

Â

(gdb) - ^done d'empiler-information-profondeur, depth="12 " (gdb) - ^done de l'empiler-information-profondeur 4, depth="4" (gdb) - ^done de l'empiler-information-profondeur 12, depth="12 " (gdb) - ^done de l'empiler-information-profondeur 11, depth="11" (gdb) - ^done de l'empiler-information-profondeur 13, depth="12 " (gdb)

- empiler-liste-arguments Commande

Synthèse

Â

- montrer-valeurs d'empiler-liste-arguments [ haut-armature d'bas-armature ]

Montrez une liste des arguments des armatures entre bas-armature et haut-armature (inclus). Si bas-armature et haut-armature ne sont pas fournis, n'énumèrent pas les arguments pour la pile d'appel de totalité.

montrer-valeurs l'argument doit avoir une valeur de 0 ou de 1. Une valeur de 0 signifie que seulement les noms des arguments sont énumérés, une valeur de 1 signifie que des noms et les valeurs des arguments sont imprimés.

Commande de GDB

GDB n'a pas une commande équivalente. gdbtk a a gdb_get_args de ` commandez de ce qui recouvre partiellement avec la fonctionnalité `-empiler-liste-argumen.

Exemple

Â

(gdb) - ^done d'empiler-liste-armatures, stack=[ frame={level="0", addr="0x00010734", func="callee4 ", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="8 "}, frame={level="1", addr="0x0001076c", func="callee3", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="17 "}, frame={level="2", addr="0x0001078c", func="callee2", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="22 "}, frame={level="3", addr="0x000107b4", func="callee1", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="27 "}, frame={level="4", addr="0x000107e0", func="main", file="../../../devo/gdb/testsuite/gdb.mi/basics.c", line="32 "} ] (gdb) - les empiler-liste-arguments 0 ^done, empilent-args=[ frame={level="0", args=[ ] }, frame={level="1", args=[name="strarg" ] }, frame={level="2", args=[name="intarg", name="strarg "] }, frame={level="3", args=[name="intarg", name="strarg", name="fltarg" ] }, frame={level="4", args=[ ] } ] (gdb) - les empiler-liste-arguments 1 ^done, empilent-args=[ frame={level="0", args=[ ] }, frame={level="1 ", args=[{name="strarg", value="0x11940 l'argument.\""}]}, de corde du \"A frame={level="2", args=[ { name="intarg", value="2 "}, { name="strarg", value="0x11940 argument.\""}]}, de corde de \"A { frame={level="3", args=[ { name="intarg", value="2 "}, { name="strarg", value="0x11940 argument.\""}, de corde de \"A { name="fltarg", value="3.5 "}]}, frame={level="4", args=[ ] } ] (gdb) - empiler-liste-arguments 0 ^done 2 2, empilent-args=[frame={level="2", args=[name="intarg", name="strarg "] } ] (gdb) - des empiler-liste-arguments 1 ^done 2 2, stack-args=[frame={level="2", args=[{name="intarg", value="2 "}, { name="strarg", value="0x11940 argument.\""}]}] de corde de \"A (gdb)

- empiler-liste-armatures Commande

Synthèse

Â

- empiler-liste-armatures [ haut-armature d'bas-armature ]

Enumérez les armatures actuellement sur la pile. De chaque armature elle montre l'information suivante:

`niveau'

Le nombre d'armature, 0 étant l'armature le plus élevé, c.-à-d. la fonction les plus secrets.

`addr'

$$pc valeur de cette armature.

`fonctionnel'

Nom de fonction.

`dossier'

Nom de fichier du fichier source où la fonction vit.

`ligne'

Nombre de ligne correspondant au $$pc.

Si appelé sans arguments, cette commande imprime un backtrace pour la pile de totalité. Si donné deux arguments de nombre entier, elle montre les armatures dont les niveaux sont entre les deux arguments (inclus). Si les deux arguments sont égaux, elle montre l'armature simple au niveau correspondant.

Commande de GDB

Les commandes correspondantes de GDB sont backtrace de ` ' et ` où '.

Exemple

Plein backtrace de pile:

Â

(gdb) - ^done d'empiler-liste-armatures, pile = [ frame={level="0", addr="0x0001076c", func="foo ", file="recursive2.c", line="11 "}, frame={level="1", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "}, frame={level="2", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "}, frame={level="3", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "}, frame={level="4", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "}, frame={level="5", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "}, frame={level="6", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "}, frame={level="7", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "}, frame={level="8", addr="0x000107a4", func="foo", file="recursive2.c", line="4 "} ] (gdb)

Montrez les armatures entre low_frame et high_frame

Â

(gdb) - ^done 5 des empiler-liste-armatures 3, pile = [ frame={level="3", addr="0x000107a4", func="foo ", file="recursive2.c", line="14 "}, frame={level="4", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "}, frame={level="5", addr="0x000107a4", func="foo", file="recursive2.c", line="14 "} ] (gdb)

Montrez une armature simple:

Â

(gdb) - ^done 3, pile des empiler-liste-armatures 3 = [ frame={level="3", addr="0x000107a4", func="foo ", file="recursive2.c", line="14 "} ] (gdb)

- empiler-liste-locals Commande

Synthèse

Â

- imprimer-valeurs d'empiler-liste-locals

Montrez les noms variables locaux de l'armature courante. Avec un argument de 0 imprime seulement les noms des variables, avec l'argument des copies 1 également leurs valeurs.

Commande de GDB

locals d'information de ` dans GDB, gdb_get_locals de ` dans gdbtk.

Exemple

Â

(gdb) - ^done de l'empiler-liste-locals 0, locals=[name="A", name="B", name="C "] (gdb) - ^done de l'empiler-liste-locals 1, locals=[{name="A", value="1"}, {name="B", value="2" }, { name="C", value="3 "} ] (gdb)

- empiler-choisir-armature Commande

Synthèse

Â

- framenum d'empiler-choisir-armature

Changez l'armature courante. Choisissez une armature différente framenum sur la pile.

Commande de GDB

Les commandes correspondantes de GDB sont armature de ` ' ` vers le haut ' ` vers le bas ' choisir-armature de ` ' ` vers le haut-silencieux 'et ` vers le bas-silencieux '.

Exemple

Â

(gdb) - ^done de l'empiler-choisir-armature 2 (gdb)

24,10 Commandes De Question De Symbole de GDB/mi

- symbole-information-adressez Commande

Synthèse

Â

- symbole-information-adressez le symbole

Décrivez où symbole est stocké.

Commande de GDB

La commande correspondante de GDB est adresses d'information de `.

Exemple

N.a.

- symbole-information-dossier Commande

Synthèse

Â

- symbole-information-dossier

Montrez le dossier pour le symbole.

Commande de GDB

Il n'y a aucune commande équivalente de GDB. gdbtk a ` gdb_find_file '.

Exemple

N.a.

- symbole-information-fonction Commande

Synthèse

Â

- symbole-information-fonction

Montrez dans quelle fonction le symbole vit.

Commande de GDB

gdb_get_function de ` ' dans gdbtk.

Exemple

N.a.

- symbole-information-ligne Commande

Synthèse

Â

- symbole-information-ligne

Montrez les adresses de noyau du code pour une ligne de source.

Commande de GDB

La commande correspondante de GDB est ligne d'information de ` '. gdbtk a gdb_get_line de ` ' et ` gdb_get_file ' commandes.

Exemple

N.a.

- symbole-information-symbole Commande

Synthèse

Â

- addr de symbole-information-symbole

Décrivez quel symbole est à l'endroit addr.

Commande de GDB

La commande correspondante de GDB est symbole d'information de ` '.

Exemple

N.a.

- symbole-liste-fonctions Commande

Synthèse

Â

- symbole-liste-fonctions

Enumérez les fonctions dans l'exécutable.

Commande de GDB

fonctions d'information de ` dans GDB, gdb_listfunc de ` ' et gdb_search de ` ' dans gdbtk.

Exemple

N.a.

- symbole-liste-lignes Commande

Synthèse

Â

- nom de fichier de symbole-liste-lignes

Imprimez la liste de lignes qui contiennent le code et leur programme associé adresse pour le nom de fichier donné de source. Les entrées sont assorties dans l'ordre croissant de PC.

Commande de GDB

Il n'y a aucune commande correspondante de GDB.

Exemple

Â

(gdb) - ^done des symbole-liste-lignes basics.c, lines=[{pc="0x08048554", line="7"}, {pc="0x080485Ã¤", line="8 "} ] (gdb)

- symbole-liste-types Commande

Synthèse

Â

- symbole-liste-types

Enumérez tous les noms de type.

Commande de GDB

Les commandes correspondantes sont types d'information de ` dans GDB, gdb_search de ` ' dans gdbtk.

Exemple

N.a.

- symbole-liste-variables Commande

Synthèse

Â

- symbole-liste-variables

Enumérez tous les noms variables globaux et statiques.

Commande de GDB

variables d'information de ` dans GDB, gdb_search de ` ' dans gdbtk.

Exemple

N.a.

- symbole-placez Commande

Synthèse

Â

- symbole-placez

Commande de GDB

gdb_loc de ` ' dans gdbtk.

Exemple

N.a.

- symbole-type Commande

Synthèse

Â

- variable de symbole-type

Montrez le type de variable.

Commande de GDB

La commande correspondante de GDB est ptype de ` ' gdbtk a ` gdb_obj_variable '.

Exemple

N.a.

24,11 Commandes De Manipulation De Cible de GDB/mi

- cible-attachez Commande

Synthèse

Â

- cible-attachez le pid|dossier

Attache à un processus pid ou un dossier dossier en dehors de de GDB.

Commande de GDB

La commande correspondante de GDB est attache de ` '.

Exemple

N.a.

- cible-comparer-sections Commande

Synthèse

Â

- cible-comparer-sections [ section ]

Comparez les données de la section section sur la cible au dossier d'exec. Sans argument, toutes les sections sont comparées.

Commande de GDB

L'équivalent de GDB est comparer-sectio de `.

Exemple

N.a.

- cible-détachez Commande

Synthèse

Â

- cible-détachez

Démontez de la cible à distance. Il n'y a aucun rendement.

Commande de GDB

La commande correspondante de GDB est le ` détachent '.

Exemple

Â

(gdb) - cible-détachez le ^done (gdb)

- cible-débranchez Commande

Synthèse

Â

- cible-débranchez

Démontez de la cible à distance. Il n'y a aucun rendement.

Commande de GDB

La commande correspondante de GDB est débranchement de ` '.

Exemple

Â

(gdb) - cible-débranchez le ^done (gdb)

- cible-téléchargez Commande

Synthèse

Â

- cible-téléchargez

Charge l'exécutable sur la cible à distance. Elle imprime un message de mise à jour chaque demi de deuxième, qui inclut les champs:

section de ` '

Le nom de la section.

` section-envoyé '

La taille de ce qui a été envoyé jusqu'ici pour cette section.

section-taille de ` '

La taille de la section.

` total-envoyé '

Toute la taille de ce qui a été envoyé jusqu'ici (le courant et les sections précédentes).

total-taille de ` '

La taille de l'exécutable global à télécharger.

Chaque message est envoyé comme disque de statut (voir la section GDB/mi produire la syntaxe ).

En outre, il imprime le nom et la taille des sections, car ils sont téléchargés. Ces messages incluent les champs suivants:

`section'

The name of the section.

`section-size'

The size of the section.

`total-size'

The size of the overall executable to download.

At the end, a summary is printed.

GDB Command

The corresponding GDB command is `load'.

Example

Note: each status message appears on a single line. Here the messages have been broken down so that they can fit onto a page.

(gdb)

-target-download

+download,{section=".text",section-size="6668",total-size="9880"}

+download,{section=".text",section-sent="512",section-size="6668",

total-sent="512",total-size="9880"}

+download,{section=".text",section-sent="1024",section-size="6668",

total-sent="1024",total-size="9880"}

+download,{section=".text",section-sent="1536",section-size="6668",

total-sent="1536",total-size="9880"}

+download,{section=".text",section-sent="2048",section-size="6668",

total-sent="2048",total-size="9880"}

+download,{section=".text",section-sent="2560",section-size="6668",

total-sent="2560",total-size="9880"}

+download,{section=".text",section-sent="3072",section-size="6668",

total-sent="3072",total-size="9880"}

+download,{section=".text",section-sent="3584",section-size="6668",

total-sent="3584",total-size="9880"}

+download,{section=".text",section-sent="4096",section-size="6668",

total-sent="4096",total-size="9880"}

+download,{section=".text",section-sent="4608",section-size="6668",

total-sent="4608",total-size="9880"}

+download,{section=".text",section-sent="5120",section-size="6668",

total-sent="5120",total-size="9880"}

+download,{section=".text",section-sent="5632",section-size="6668",

total-sent="5632",total-size="9880"}

+download,{section=".text",section-sent="6144",section-size="6668",

total-sent="6144",total-size="9880"}

+download,{section=".text",section-sent="6656",section-size="6668",

total-sent="6656",total-size="9880"}

+download,{section=".init",section-size="28",total-size="9880"}

+download,{section=".fini",section-size="28",total-size="9880"}

+download,{section=".data",section-size="3156",total-size="9880"}

+download,{section=".data",section-sent="512",section-size="3156",

total-sent="7236",total-size="9880"}

+download,{section=".data",section-sent="1024",section-size="3156",

total-sent="7748",total-size="9880"}

+download,{section=".data",section-sent="1536",section-size="3156",

total-sent="8260",total-size="9880"}

+download,{section=".data",section-sent="2048",section-size="3156",

total-sent="8772",total-size="9880"}

+download,{section=".data",section-sent="2560",section-size="3156",

total-sent="9284",total-size="9880"}

+download,{section=".data",section-sent="3072",section-size="3156",

total-sent="9796",total-size="9880"}

^done,address="0x10004",load-size="9880",transfer-rate="6586",

write-rate="429"

(gdb)

- cible-exec-statut Commande

Synthèse

- cible-exec-statut

Fournissez les informations sur l'état de la cible (, qu'elle fonctionne ou pas, par exemple).

Commande de GDB

Il n'y a aucune commande équivalente de GDB.

Exemple

N.a.

- cible-liste-disponible-cibles Commande

Synthèse

- cible-liste-disponible-cibles

Enumérez les cibles possibles pour se relier à.

Commande de GDB

La commande correspondante de GDB est cible d'aide de ` '.

Exemple

N.a.

- cible-liste-courant-cibles Commande

Synthèse

- cible-liste-courant-cibles

Décrivez la cible courante.

Commande de GDB

L'information correspondante est imprimée près dossier d'information de ` ' (entre autres).

Exemple

N.a.

- cible-liste-paramètres Commande

Synthèse

- cible-liste-paramètres

Commande de GDB

Aucun équivalent.

Exemple

N.a.

- cible-choisissez Commande

Synthèse

- cible-choisissez les paramètres de type...

Reliez GDB à la cible à distance. Cette commande prend deux args:

`type'

Le type de cible, par exemple async de ` ' extérieur de ` 'etc...

`paramètres'

Noms de device, noms d'hôte et semblables. Voir les commandes de section pour des cibles de gestion , pour plus de détails.

la sortieest un avis de raccordement, suivi de l'adresse à laquelle le programme de cible est, sous la forme suivante:

^connected, addr="address", nom de func="function ", liste d'args=[arg ]

Commande de GDB

La commande correspondante de GDB est cible de ` '.

Exemple

(gdb) - cible-choisissez l'async/dev/ttya ^connected, addr="0xfe00a300", func="??", args=[ ] (gdb)

24,12 Le Fil de GDB/mi Commande

- fileter-information Commande

Synthèse

- fileter-information

Commande de GDB

Aucun équivalent.

Exemple

N.a.

- fileter-liste-tout-filète Commande

Synthèse

- fileter-liste-tout-filète

Commande de GDB

La commande équivalente de GDB est fils d'information de `.

Exemple

N.a.

- fileter-liste-identifications Commande

Synthèse

- fileter-liste-identifications

Produit une liste des identifications actuellement connues de fil de GDB. Ã€ la fin de la liste qu'elle imprime également tout le nombre de tels filète.

Commande de GDB

Une partie de fils d'information de ` fournit la même information.

Exemple

Fil ne présente pas, sans compter que le processus principal:

(gdb) - le ^done fileter-liste-identifications, filètent-ids={}, number-of-threads="0 " (gdb)

Plusieurs fils:

(gdb) - le ^done fileter-liste-identifications, filètent-ids={thread-id="3", filètent-id="2", thread-id="1 "}, number-of-threads="3" (gdb)

- fileter-choisissez Commande

Synthèse

- fileter-choisissez le threadnum

Faites threadnum le fil courant. Il imprime le nombre du nouveau fil courant, et l'armature le plus élevé pour ce fil.

Commande de GDB

La commande correspondante de GDB est fil de ` '.

Exemple

(gdb) - exec-prochain ^running (gdb) * arrêté, reason="end-en faisant un pas-range", filetez-id="2", line="187 ", file="../../../devo/gdb/testsuite/gdb.threads/linux-dp.c " (gdb) - fileter-liste-identifications

le ^done, filètent-ids={thread-id="3", filètent-id="2", thread-id="1 "}, number-of-threads="3" (gdb) - fileter-choisissent 3 le ^done, new-thread-id="3 ", frame={level="0", func="vprintf ", l'args=[{name="format", value="0x8048e9c \"%*s%c %d %c\\n \""}, { name="arg", value="0x2"}], file="vprintf.c", line="31 "} (gdb)

24,13 GDB/mi Tracepoint Commande

Les commandes de tracepoint ne sont pas encore mises en application.

24,14 La Variable de GDB/mi Objecte

Motivation pour les objets variables dans GDB/mi

Pour l'exécution d'une fenêtre variable de programme de mise au point (locals, expressions observées, etc.), nous proposons l'adaptation du code existant utilisé près Perspicacité.

Les deux raisons principales de celle sont:

On l'a prouvé dans la pratique (il est déjà sur sa deuxième génération).

Il raccourcira le temps d'élaboration (inutile de dire à quel point il important est maintenant).

L'interface originale a été conçue pour être employée par code de Tcl, ainsi elle a été légèrement changée ainsi elle pourrait être employée par GDB/mi. Cette section décrit les opérations de GDB/mi qui seront disponibles et donne quelques conseils au sujet de leur utilisation.

Note : En plus de l'ensemble d'opérations décrites ici, nous nous attendons à ce que l'exécution de GUI d'une fenêtre variable exige, au moins, les opérations suivantes:

- gdb-montrez rendement-base

- empiler-liste-arguments

- empiler-liste-locals

- empiler-choisir-armature

Introduction aux objets variables dans GDB/mi

L'idée fondamentale derrière les objets variables est la création d'un objet appelé pour représenter une variable, une expression, un endroit de mémoire ou même un registre d'unité centrale de traitement. Pour chaque objet créé, un ensemble d'opérations est disponible pour examiner ou changer ses propriétés.

En outre, les types de données complexes, tels que C structure, sont représentés dans un format d'arbre. Par exemple, struct la variable de type est la racine et les enfants représenteront les membres de struct. Si un enfant est lui-même d'un type complexe, il aura également des enfants de ses propres. Des différences appropriées de langue sont manipulées pour C, C ++ et Java.

En renvoyant les valeurs réelles des objets, ce service tient compte du choix individuel du format d'affichage utilisé dans la création de résultat. Il peut être choisi parmi: binaire, décimal, hexadécimal, octal et normal. Normal se rapporte à un format de défaut automatiquement choisi basé sur le type variable (comme la décimale pour internesortilège pour des indicateurs, etc.).

Ce qui suit est l'ensemble complet d'opérations de GDB/mi définies pour accéder à cette fonctionnalité:

Description D'Opération - variété-créez créez un objet variable - variété-supprimez supprimez l'objet variable et ses enfants - variété-placer-format placez le format d'affichage de cette variable - variété-montrer-format montrez le format d'affichage de cette variable - variété-information-numérique-enfants dit combien d'enfants cet objet a - variété-liste-enfants renvoyez une liste des enfants de l'objet - variété-information-type montrez le type de cet objet variable - variété-information-expression copie ce que représente cet objet variable - variété-montrer-attribue est-elle cette variable editable? existe-t-elle ici? - variété-évaluer-expression obtenez la valeur de cette variable - variété-assignez placez la valeur de cette variable - variété-mise à jour mettez à jour la variable et ses enfants

Dans la prochaine sous-section nous décrivons chaque opération en détail et suggérons comment elle peut être employée.

Description et utilisation des opérations sur les objets variables

- variété-créez Commande

Synthèse

Â

- variété-créez { nom|"-" } { armature-addr|"*" } expression

Cette opération crée un objet variable, qui permet la surveillance d'une variable, du résultat d'une expression, d'une cellule de mémoire ou d'un registre d'unité centrale de traitement.

nom le paramètre est la corde par laquelle l'objet peut être mis en référence. Il doit être unique. Si ` - ' est indiqué, le système de varobj produira d'une corde "varNNNNNN" automatiquement. Il sera unique à condition que on n'indique pas nom sur ce format. La commande échoue si un nom double est trouvé.

L'armature sous laquelle l'expression devrait être évaluée peut être indiquée près armature-addr. A ` * ' indique que l'armature courante devrait être employée.

expression est n'importe quelle expression valide sur la langue courante a placé (ne doit pas commencer par a ` * 'ou un de ce qui suit:

` *addr'où addr est l'adresse d'une cellule de mémoire

` *addr-addr' -- une plage d'adresses de mémoire (TBD)

` $regname' -- un nom de registre d'unité centrale de traitement

Résultat

Cette opération renvoie le nom, le nombre d'enfants et le type de l'objet créé. Le type est retourné comme une corde en tant que celle produite par le GDB CLI:

Â

name="name", numchild="N", type="type "

- variété-supprimez Commande

Synthèse

Â

- variété-supprimez le nom

Supprime un objet variable précédemment créé et tous ses enfants.

Renvoie une erreur si l'objet nom n'est pas trouvé.

- variété-placer-format Commande

Synthèse

Â

- format-Spéc. nommée de variété-placer-format

Place le format de rendement pour la valeur de l'objet nom pour être format-Spéc..

La syntaxe pour format-Spéc. est comme suit:

Â

==> format-Spéc. { binaire|décimal|hexadécimal|octal|normal }

- variété-montrer-format Commande

Synthèse

Â

- nom de variété-montrer-format

Renvoie le format employé pour montrer la valeur de l'objet nom.

Â

format-Spéc. de ==> de format

- variété-information-numérique-enfants Commande

Synthèse

Â

- nom d'variété-information-numérique-enfants

Renvoie le nombre d'enfants d'un objet variable nom

Â

numchild=n

- variété-liste-enfants Commande

Synthèse

Â

- nom d'variété-liste-enfants

Renvoie une liste des enfants de l'objet variable indiqué:

Â

numchild=n, children=[{name=name, numchild=n, type=type}, temps des (repeats N) ]

- variété-information-type Commande

Synthèse

Â

- nom de variété-information-type

Renvoie le type de la variable indiquée nom. Le type est retourné comme une corde dans le même format qu'il est produit par le GDB CLI:

Â

type=typename

- variété-information-expression Commande

Synthèse

Â

- nom d'variété-information-expression

Renvoie ce qui est représenté par l'objet variable nom

Â

lang=lang-Spéc., exp=expression

là où lang-Spéc. est { "C"|"C++"|"Java" }.

- variété-montrer-attribue Commande

Synthèse

Â

- variété-montrer-attribue le nom

Attributs de liste de l'objet variable indiqué nom

Â

status=attr [ (, attr) * ]

là où attr est { { editable|noneditable }|TBD }.

- variété-évaluer-expression Commande

Synthèse

Â

- nom d'variété-évaluer-expression

Evalue l'expression qui est représentée par l'objet variable indiqué et renvoie sa valeur comme corde dans le format courant indiqué pour l'objet:

Â

value=value

Notez qu'on doit appeler - variété-liste-enfants pour une variable avant la valeur de l'enfant une variable peut être évaluée.

- variété-assignez Commande

Synthèse

Â

- variété-assignez l'expression nommée

Assigne la valeur de expression à l'objet de variable indiqué près nom. L'objet doit être ` editable '. Si la valeur de la variable est changée par l'assigner, la variable apparaîtra dans suivant - variété-mise à jour liste.

Exemple

Â

(gdb) - variété-assignez var1 3 le ^done, value="3 " (gdb) - variété-mise à jour * ^done, changelist=[{name="var1", in_scope="true", type_changed="false" } ] (gdb)

- variété-mise à jour Commande

Synthèse

Â

- variété-mise à jour { nom|"*" }

Mettez à jour la valeur de l'objet variable nom en évaluant son expression après avoir cherché toutes les nouvelles valeurs à partir de mémoire ou des registres. A ` * ' cause tous les objets variables existants d'être mis à jour.

Veuillez envoyer le FSF et les enquêtes et les questions de GNU à gnu@gnu.org . Il y a également d'autres manières d'entrer en contact avec le FSF.

Ces pages sont maintenues par les lotisseurs de GDB .

Copyright Free Software Foundation, Inc., Endroit De 59 Temples - Suite 330, Boston, MA 02111, Etats-Unis.

In extenso copiant et distribution de cet article entier est autorisé dans n'importe quel milieu, si cette notification est préservée.

Ce document a été produit par l'administrateur de GDB octobre, 28 2003 texi2html employants

25. Annotations de GDB

Ce chapitre décrit des annotations en GDB. Annotations ont été conçus pour connecter GDB aux interfaces utilisateur graphiques ou à d'autres programmes semblables qui veulent agir l'un sur l'autre avec GDB à un niveau relativement élevé.

Le mécanisme d'annotation a en grande partie été superseeded par GDB/mi (voir la section 24. L'Interface de GDB/mi ).

25,1 Quelle est une annotation?

Les annotations commencent par un caractère de caractère NL, deux commande-z de ` ' caractères, et le nom de l'annotation. S'il n'y a aucune information additionnelle liée à cette annotation, le nom de l'annotation est suivi immédiatement d'un caractère NL. S'il y a de l'information additionnelle, le nom de l'annotation est suivi d'un espace, de l'information additionnelle, et d'un caractère NL. L'information additionnelle ne peut pas contenir des caractères de caractère NL.

Tout rendement ne commençant pas par un caractère NL et deux commande-z de ` ' les caractères dénote la sortielittéral de GDB. Currently là n'est aucun besoin de GDB de produire un caractère NL suivi de deux commande-z de ` ' des caractères, mais s'il y avait un tel besoin, les annotations pourraient être prolongés avec évasion de ` ' annotation qui signifie ces trois caractères comme rendement.

L'annotation niveauqui est employer indiqué ` -- annotez ' l'option de ligne de commande (voir les modes de choix de la section 2,1,2 ), commande combien l'information GDB imprime ainsi que son message de sollicitation, valeurs des expressions, lignes de source, et d'autres types de rendement. Le niveau 0 est pour aucuns anntations, le niveau 1 sert quand GDB est run comme sous-processus de GNU Emacs, le niveau 3 est l'annotation maximum appropriée aux programmes qui commandent GDB, et des 2 annotations de niveau ont été rendues désuètes (voir les limitations de ` de section de l'interface d'annotation 'dans les annotations désuètes de GDB ). Ce chapitre décrit de niveau 3 annotations.

Un exemple simple de commencer vers le haut de GDB avec des annotations est:

Â

$ de gdb -- base libre de logiciel de copyright 2003 du gdb 6,0 d'annotate=3 GNU, inc.. GDB est logiciel libre, couvert par le permis de grand public de GNU, et vous êtes bienvenu pour le changer et/ou pour distribuer des copies de lui dans certaines conditions. tapez l'"exposition copiant" pour voir les conditions. Il n'y a absolument aucune garantie pour GDB. tapez l'"garantie d'exposition" pour des détails. Ce GDB a été configuré en tant que "i386-pc-linux-gnu" ( de gdb) $ ^Z^Zpost-prompt stoppé par ^Z^Zprompt ^Z^Zpre-prompt

Ici ` stoppé ' est entré dans GDB; le repos est produit de GDB. Commencer de trois lignes `^z^z ' (où `^Z ' dénote a commande-z de ` ' le caractère) sont des annotations; le repos est produit de GDB.

25,2 Le Préfixe De Serveur

Pour publier une commande à GDB sans affecter certains aspects de l'état qui est vu par des utilisateurs, mettez- en têtel'avec serveur de ` '. Ceci signifie que cette commande n'affectera pas l'histoire de commande, ni elle affectera la notion de GDB dont commande de répéter si Retour est serré sur une ligne par lui-même.

Le préfixe de serveur n'affecte pas l'enregistrement des valeurs dans l'histoire de valeur; pour imprimer une valeur sans enregistrement il dans l'histoire de valeur, emploient rendement commande au lieu de copie commande.

25,3 Annotation pour l'entrée de GDB

Quand GDB incite pour l'entrée, il annote ce fait ainsi il est possible de savoir quand envoyer le rendement, quand la sortied'une instruction donnée plus de, etc...

Les différents genres d'entrée chacun ont un type différent d'entrée . Chaque type d'entrée a trois annotations: a pré annotation, qui dénote le commencement du message de sollicitation qui est produit, une annotation plate, qui dénote la fin du message de sollicitation, et puis a poteau annotation qui dénote la fin de n'importe quel écho qui peut (ou ne pouvez pas) être associée à l'entrée. Par exemple, message de sollicitation le type d'entrée comporte les annotations suivantes:

Â

^Z^Zprompt ^Z^Zpre-prompt ^Z^Zpost-prompt

Les types d'entrée sont

message de sollicitation

Quand GDB incite pour une commande (le message de sollicitation principal de GDB).

commandes

Quand GDB incite pour un ensemble de commandes, comme dans commandes commande. Les annotations sont répétées pour chaque commande qui est entrée.

surcharge-choix

Quand GDB veut que l'utilisateur choisisse entre de diverses fonctions surchargées.

question

Quand GDB veut que l'utilisateur confirme une opération potentiellement dangereuse.

prompt-pour-continuez

Quand GDB demande à l'utilisateur de serrer le retour pour continuer. Note: Ne vous attendez pas à ce que ceci travaille jaillissent; au lieu de cela employez placez la taille 0 pour neutraliser l'incitation. C'est parce que le compte des lignes est boguet en présence des annotations.

25,4 Erreurs

Â

^Z^Zquit

Cette annotation se produit bien avant que GDB réponde à une interruption.

Â

^Z^Zerror

Cette annotation se produit bien avant que GDB réponde à une erreur.

Les annotations stoppé et des erreurs indiquent que toutes les annotations qui GDB était au milieu de de pouvoir finir abruptement. Par exemple, si a valeur-histoire-commencez l'annotation est suivie de a erreuron ne peut pas compter recevoir l'assortiment valeur-histoire-extrémité. On ne peut pas compter ne pas la recevoir non plus, cependant; une annotation des erreurs ne signifie pas nécessairement que GDB renvoie immédiatement toute la manière au niveau supérieur.

Une annotation stoppé ou des erreurs peut être précédée près

Â

^Z^Zerror-commencez

N'importe quel rendement entre celui et l'annotation stoppé ou des erreurs est le message d'erreur.

Des messages d'avertissement ne sont pas encore annotés.

25,5 Notices D'Invalidation

Les annotations suivantes indiquent que certains morceaux d'état ont pu avoir changé.

^Z^Zframes-inadmissible

Les armatures (par exemple, rendement de backtrace la commande) a pu avoir changé.

^Z^Zbreakpoints-inadmissible

Les breaks ont pu avoir changé. Par exemple, l'utilisateur a juste ajouté ou a supprimé un break.

25,6 Exécuter le programme

Quand le programme commence l'exécution due à une commande de GDB comme step ou continuez

Â

^Z^Zstarting

est produit. Quand le programme s'arrête,

Â

^Z^Zstopped

est produit. Avant arrêté l'annotation, une variété d'annotations décrivent comment le programme s'est arrêté.

^Z^Zexited sortie-statut

Le programme a sorti, et sortie-statut est le statut de sortie (zéro pour la sortie réussie, autrement de non zéro).

^Z^Zsignalled

Le programme a sorti avec un signal. Après ^Z^Zsignalledl'annotation continue:

extrémité-texte d'^Z^Zsignal-corde-extrémité de corde de ^Z^Zsignal-corde de moyen-texte d'^Z^Zsignal-nom-extrémité de nom de ^Z^Zsignal-nom d'intro-texte

là où nom est le nom du signal, comme SIGILL ou SIGSEGVet corde est l'explication du signal, comme Instruction Illégale ou Défaut de segmentation. intro-texte moyen-texteet extrémité-texte soyez pour l'avantage de l'utilisateur et n'ayez aucun format particulier.

^Z^Zsignal

La syntaxe de cette annotation est juste comme signalémais GDB est énonciation juste que le programme a reçu le signal, non cette il a été terminé avec lui.

^Z^Zbreakpoint nombre

Le nombre de break de coup de programme nombre.

^Z^Zwatchpoint nombre

Le nombre de watchpoint de coup de programme nombre.

25,7 Montrer La Source

L'annotation suivante est employée au lieu de montrer le code source:

Â

^Z^Zsource filename:line:character:middle:addr

là où nom de fichier est un témoin absolu de nom de fichier quel fichier source, ligne est le nombre de ligne dans ce dossier (où 1 est la première ligne dans le dossier), caractère est la position d'impression dans le dossier (où 0 est le premier caractère dans le dossier) (pour les la plupart corrigez les formats que ceci se dirigera nécessairement au commencement d'une ligne), moyen est milieu de ` ' si addr est au milieu de la ligne, ou le ` prient ' si addr est au début de la ligne, et addr est l'adresse dans le programme de cible lié à la source qui est montrée. addr est sous la forme ` 0x' suivi d'un ou plusieurs chiffres minuscules de sortilège (note que ceci ne dépend pas de la langue).

26. Reportage des bogues dans GDB

Votre bogue rapporte à jeu un rôle essentiel en rendant GDB fiable.

Le reportage d'un bogue peut vous aider en apportant une solution à votre problème, ou il ne peut pas. Mais de toute façon la fonction principale d'un rapport de bogue est d'aider la communauté entière en rendant la prochaine version du travail de GDB meilleure. Les rapports de bogue sont votre contribution à l'entretien de GDB.

Afin un rapport de bogue pour atteindre son objectif, vous doive inclure l'information qui nous permet de fixer le bogue.

Défaites la dernière commande d'édition. Vous pouvez défaire toute la manière de nouveau à une ligne vide.

(selon votre configuration, Espacement arrière verouillez soit placé pour supprimer le caractère à la gauche du curseur et DEL verouillez l'ensemble pour supprimer le caractère sous le curseur, comme CDplutôt que le caractère à la gauche du curseur.)

27,2,2 Commandes De Mouvement De Readline

La table ci-dessus décrit les frappes les plus fondamentales dont vous avez besoin afin de faire l'édition de la ligne d'entrée. Pour votre convenance, beaucoup d'autres commandes ont été ajoutées en plus de Cb Cf CDet DEL. Voici quelques commandes pour se déplacer plus rapidement au sujet de la ligne.

CA

Déplacez-vous au début de la ligne.

Ce

Déplacez-vous à l'extrémité de la ligne.

M-f

Faites avancer un mot, d'où un mot se compose lettres et chiffres.

Mb

Déplacez vers l'arrière un mot.

Cl

Dégagez l'écran, réimprimant la ligne courante au dessus.

Notification comment Cf fait avancer un caractère, tandis que M-f fait avancer un mot. C'est une convention lÃ¢che qui commandent des frappes opèrent des caractères tandis que les frappes de méta opèrent des mots.

27,2,3 Commandes De Massacre De Readline

Le texte de massacre signifie pour supprimer le texte de la ligne, mais pour le sauver loin pour l'usage postérieur, habituellement en le tirant (réinsérer) d'un coup sec de nouveau dans la ligne. (le `Cut 'et la pÃ¢te de ` 'sont un jargon plus récent pour la mise à mort de ` 'et un coup sec de ` '.)

Si la description pour une commande indique qu'elle ` a tué le texte, alors vous pouvez être sûr que vous pouvez récupérer le texte dans (ou la même chose) un endroit différent plus tard.

Quand vous employez une commande de mise à mort, le texte est sauvé dans un tuer-anneau . Tout nombre de mises à mort consécutives sauvent tout le texte tué ensemble, de sorte que quand vous le tirez d'un coup sec en arrière, vous l'obteniez tout. L'anneau de mise à mort n'est pas détail de ligne; le texte que vous avez tué sur une ligne précédemment dactylographiée est disponible pour être tiré d'un coup sec en arrière plus tard, quand vous tapez une autre ligne.

Voici la liste de commandes pour le texte de massacre.

C-k

Tuez le texte de la position actuelle de curseur à l'extrémité de la ligne.

M-d

Mise à mort du curseur à la fin du mot courant, ou, si entre les mots, à la fin du prochain mot. Les frontières de mot sont identiques à celles utilisées près M-f.

M-$lDEL

Tuez du curseur le début du mot courant, ou, si entre les mots, au début du mot précédent. Les frontières de mot sont identiques à celles utilisées près Mb.

Dans le sens des aiguilles d'une montre

Mise à mort du curseur au whitespace précédent. C'est différent que M-$lDEL parce que les frontières de mot diffèrent.

Voici comment tirer le texte d'un coup sec de nouveau dans la ligne. Tirer signifie pour copier le texte plus-récent-tué de l'amortisseur de mise à mort.

C-y

Tirez le texte d'un coup sec le plus récemment tué de nouveau dans l'amortisseur au curseur.

Mon

Tournez l'tuer-anneau, et tirez le nouveau dessus d'un coup sec. Vous pouvez seulement faire ceci si la commande antérieure est C-y ou Mon.

27,2,4 Arguments De Readline

Vous pouvez passer des arguments numériques aux commandes de Readline. Parfois l'argument agit en tant que compte de répétition, d'autres fois que c'est le signe de l'argument qui est significatif. Si vous passez un argument négatif à une commande qui agit normalement dans une direction vers l'avant, cette commande agira dans une direction en arrière. Par exemple, pour tuer le texte de nouveau au début de la ligne, vous pourriez tapezr ` M -- C-k '.

La manière générale de passer des arguments numériques à une commande est de tapezr des chiffres de méta avant la commande. Si le premier chiffre de ` 'dactylographié est un signe moindre (` - 'alors le signe de l'argument sera négatif. Une fois que vous avez dactylographié un chiffre de méta pour mettre l'argument en route, vous pouvez tapezr le reste des chiffres, et puis la commande. Par exemple, pour donner CD commandez un argument de 10, vous pourrait tapezr Cd du ` M-1 0 'qui supprimera les dix prochains caractères sur la ligne d'entrée.

27,2,5 Recherche des commandes dans l'histoire

Readline fournit des commandes pour rechercher par l'histoire de commande des lignes contenant une corde indiquée. Il y a deux modes de recherche: par accroissement et non-incrémentiel .

Les recherches par accroissement commencent avant que l'utilisateur ait fini de tapezr la corde de recherche. Pendant que chaque caractère de la corde de recherche est dactylographié, Readline montre la prochaine entrée de l'histoire assortissant la corde dactylographiée jusqu'ici. Une recherche par accroissement exige seulement autant de caractères comme nécessaire pour trouver l'entrée désirée d'histoire. Pour rechercher vers l'arrière dans l'histoire une corde particulière, tapez Cr. tapez Cs recherches en avant par l'histoire. Les caractères présentent en valeur de isearch-terminateurs la variable sont employées pour terminer une recherche par accroissement. Si cette variable n'a pas été assignée une valeur, ESC et C-j les caractères termineront une recherche par accroissement. CG. avortera une recherche par accroissement et reconstituera la ligne originale. Quand la recherche est terminée, l'entrée d'histoire contenant la corde de recherche devient la ligne courante.

Pour trouver d'autres entrées assorties dans l'histoire énumèrent, tapeznt Cr ou Cs comme approprié. Ceci recherchera vers le début ou l'expédiera dans l'histoire pour la prochaine entrée assortissant la corde de recherche dactylographiée jusqu'ici. N'importe quelle autre limite d'ordre principal à une commande de Readline terminera la recherche et exécutera cette commande. Par exemple, a Retour terminera la recherche et acceptera la ligne, exécutant de ce fait la commande de la liste d'histoire. Une commande de mouvement terminera la recherche, fera la dernière ligne fonder la ligne courante, et commencera à éditer.

Readline se rappelle la dernière corde par accroissement de recherche. Si deux Crs ne sont dactylographiés sans aucun caractère intervenant définissant une nouvelle corde de recherche, n'importe quelle corde rappelée de recherche est employé.

Les recherches non-incrémentielles ont lu la corde entière de recherche avant de commencer à rechercher les lignes assorties d'histoire. La corde de recherche peut être dactylographiée par l'utilisateur ou faire partie du contenu de la ligne courante.

27,3 Dossier De Readline Init

Bien que la bibliothèque de Readline vienne avec un ensemble de Emacs-comme keybindings installé par défaut, il est possible d'employer un ensemble différent de keybindings. N'importe quel utilisateur peut adapter les programmes aux besoins du client qui emploient Readline en mettant des commandes dans un dossier d'inputrc, par convention dans son répertoire local. Le nom de ce dossier est pris de la valeur de la variable d'environnement INPUTRC. Si cette variable est supprimait, le défaut est `~/.inputrc '.

Quand un programme qui emploie la bibliothèque de Readline commence vers le haut, le dossier d'init est lu, et les attaches principales sont placées.

En outre, Cr De C-x la commande relit ce dossier d'init, de ce fait incorporant tous les changements que vous pourriez lui avoir faits.

27,3,1 Syntaxe de syntaxe de dossier de Readline Init pour les commandes dans le dossier d'inputrc.
27,3,2 Init conditionnel construit les attaches principales conditionnelles dans le dossier d'inputrc.
27,3,3 Dossier d'Init d'échantillon un dossier d'inputrc d'exemple.

27,3,1 Syntaxe De Dossier De Readline Init

Il y a seulement quelques constructions de base permises dans le dossier d'init de Readline. Des interlignes sont ignorés. Lignes commençant par a ` # ' sont les commentaires. Lignes commençant par a ` $ ' indiquez les constructions conditionnelles (voir les constructions d'Init de conditionnel de la section 27,3,2 ). D'autres lignes dénotent les arrangements variables et les attaches principales.

Arrangements Variables

Vous pouvez modifier le comportement d'exécution de Readline en changeant les valeurs des variables dans employer de Readline ensemble commande dans le dossier d'init. La syntaxe est simple:

valeur variable réglée

Ici, par exemple, est comment changer du défaut Emacs-comme l'attache de clef en l'utilisation vi ligne éditant des commandes:

placez le éditer-mode vi

Des noms et les valeurs variables, le cas échéant, sont identifiés sans souci du cas.

Beaucoup de comportement d'exécution est variable avec les variables suivantes.

cloche-modèle

Commandes ce qui se produit quand Readline veut sonner la cloche terminale. Si ensemble à ` aucun 'Readline ne sonne jamais la cloche. Si ensemble à ` évident 'Readline emploie une cloche évidente si on est disponible. Si ensemble à ` audible ' (le défaut), Readline essaye de sonner la cloche du terminal.

commenter-commencez

La corde à insérer au début de la ligne quand insérer-commentez la commande est exécutée. La valeur par défaut est "#".

accomplissement-ignorer-cas

Si ensemble à ` sur 'Readline exécute le nom de fichier s'assortissant et accomplissement d'une mode cas-peu sensible. La valeur par défaut est ` outre de '.

accomplissement-questionner-articles

Le nombre d'accomplissements possibles qui détermine quand l'utilisateur est demandé s'il veut voir la liste de possibilités. Si le nombre d'accomplissements possibles est plus grand que cette valeur, Readline demandera à l'utilisateur s'il souhaite les regarder; autrement, ils sont simplement énumérés. Cette variable doit être placée à une valeur de nombre entier supérieur ou égal à 0. La limite de défaut est 100.

convertir-méta

Si ensemble à ` sur 'Readline convertira des caractères avec le huitième peu réglé en ordre principal d'cAscii en dépouillant le huitième peu et mettre en tête ESC caractère, les convertissant en ordre principal méta-mis en tête. La valeur par défaut est ` sur '.

neutraliser-accomplissement

Si ensemble à ` sur 'Readline empêchera l'accomplissement de mot. Des caractères d'accomplissement seront insérés dans la ligne comme si ils avaient été tracés à individu-insérez. Le défaut est ` outre de '.

éditer-mode

éditer-mode des commandes variables qui se transfèrent ensemble d'attaches principales est employées. Par défaut, Readline commence vers le haut dans Emacs éditant le mode, où les frappes sont les plus semblables à Emacs. Cette variable peut être placée à l'un ou l'autre ` emacs ou vi'de `.

permettre-bloc de touches

Quand ensemble à ` sur 'Readline essayera de permettre le bloc de touches d'application quand il s'appelle. Quelques systèmes ont besoin de ceci pour permettre les touches de déplacement du curseur. Le défaut est ` outre de '.

augmentez-tilde

Si ensemble à ` sur 'l'expansion de tilde est

exécuté quand Readline essaye l'accomplissement de mot. Le défaut est ` outre de '.

Si ensemble à ` sur 'les tentatives de code d'histoire de placer le point au même endroit sur chaque ligne d'histoire retrived avec précédent-histoire ou prochain-histoire.

horizontal-rouleau-mode

Cette variable peut être placée à l'un ou l'autre ` sur ' ou ` outre de '. Réglage de lui à ` sur ' signifie que le texte des lignes étant éditées fera défiler horizontalement sur une ligne simple d'écran quand ils sont plus longs que la largeur de l'écran, au lieu de l'emballage sur une nouvelle ligne d'écran. Par défaut, cette variable est placée à ` outre de '.

entrée-méta

Si ensemble à ` sur 'Readline permettra l'entrée de huit bits (il pas clair le huitième peu en caractères qu'il lit), indépendamment de ce que les réclamations terminales il peuvent soutenir. La valeur par défaut est ` outre de '. Le nom méta-drapeau est un synonyme pour cette variable.

isearch-terminateurs

La corde des caractères qui devraient terminer une recherche par accroissement sans exécuter plus tard le caractère comme commande (voient la section 27,2,5 rechercher des commandes dans l'histoire ). Si cette variable n'a pas été donnée une valeur, les caractères ESC et C-j terminera une recherche par accroissement.

keymap

Place l'idée de Readline du keymap courant pour les commandes obligatoires principales. Acceptable keymap les noms sont emacs emacs-standard emacs-méta emacs-ctlx vi vi-déplacez-vous vi-commandeet vi-insérez. vi est équivalent à vi-commande emacs est équivalent à emacs-standard. La valeur par défaut est emacs. La valeur du éditer-mode la variable affecte également le keymap de défaut.

marque-annuaires

Si ensemble à ` sur 'les noms d'annuaire réalisés ont une estafilade apposée. Le défaut est ` sur '.

marque-modifier-lignes

Cette variable, quand ensemble à ` sur 'causes Readline pour montrer un astérisque (` * 'au début des lignes d'histoire qui ont été modifiées. Cette variable est ` outre de ' par défaut.

marque-symlinked-annuaires

Si ensemble à ` sur 'les noms réalisés qui sont des liens symboliques aux annuaires ont une estafilade apposée (sujet à la valeur de marque-annuairesLe défaut est ` outre de '.

allumette-cacher-dossiers

Cette variable, quand ensemble à ` sur 'causes Readline pour assortir les dossiers dont les noms commencent par a `.' (dossiers cachés) en exécutant l'accomplissement de nom de fichier, à moins que mener `.' est fourni par l'utilisateur dans le nom de fichier à accomplir. Cette variable est ` sur ' par défaut.

rendement-méta

Si ensemble à ` sur 'Readline montrera des caractères avec le huitième peu réglé directement plutôt que comme ordre d'évasion méta-mis en tête. Le défaut est ` outre de '.

page-accomplissements

Si ensemble à ` sur 'Readline emploie un interne plus- comme le pagineur pour montrer un écran complet des accomplissements possibles à la fois. Cette variable est ` sur ' par défaut.

imprimer-accomplissements-horizontal

Si ensemble à ` sur 'Readline montrera des accomplissements avec des allumettes assorties horizontalement dans l'ordre alphabétique, plutôt qu'en bas de l'écran. Le défaut est ` outre de '.

montrer-tout-si-ambigu

Ceci change le comportement de défaut des fonctions d'accomplissement. Si ensemble à ` sur 'mots qui ont plus d'une cause possible d'accomplissement les allumettes à énumérer immédiatement au lieu de sonner la cloche. La valeur par défaut est ` outre de '.

évident-stat

Si ensemble à ` sur 'un caractère dénotant le type d'un dossier est apposé au nom de fichier en énumérant des accomplissements possibles. Le défaut est ` outre de '.

Attaches Principales

La syntaxe pour des attaches de touche de commande dans le dossier d'init est simple. D'abord vous devez trouver le nom de la commande que vous voulez changer. Les sections suivantes contiennent des tables du nom de commande, du défaut keybinding, le cas échéant, et d'une description executee de ce que la commande .

Une fois que vous savez le nom de la commande, simplement endroit sur une ligne dans le dossier d'init le nom de la clef que vous souhaitez lier la commande à, des deux points, et puis du nom de la commande. Le nom de la clef peut être exprimé dans différentes manières, selon ce que vous trouvez plus confortable.

En plus des noms de commande, le readline permet à des clefs d'être liées à une corde qui est insérée quand la clef est serrée (a macro

keyname fonction-nom ou macro

keyname est le nom d'une clef définie en anglais. Par exemple:

Commande-u: Méta-Rubout d'universel-argument: Commande-o de vers l'arrière-tuer-mot: "> produit"

Dans l'exemple ci-dessus, Cu est lié à la fonction universel-argument M-del est lié à la fonction vers l'arrière-tuer-motet Co est lié pour démarrer le macro exprimé du côté droit (c'est-à-dire, pour insérer le texte ` > produit ' dans la ligne).

Un certain nombre de noms symboliques de caractère sont identifiés tout en traitant cette syntaxe obligatoire principale: DEL ESC EVASION LFD CARACTÃˆRE NL Retour RETOUR RUBOUT L'CEspace Spcet Tab.

"keyseq": fonction-nom ou macro

keyseq diffère de keyname au-dessus de dans celle ficelle dénoter un ordre principal entier peut être indiqué, en plaçant l'ordre principal dans de doubles quotes. Des évasions de clef de modèle d'un certain GNU Emacs peuvent être employées, comme dans l'exemple suivant, mais les noms de caractère spécial ne sont pas identifiés.

"\C-u": universel-argument "\C-x\C-r": re-lire-init-dossier "\e[11~": "Touche De Fonction 1"

Dans l'exemple ci-dessus, Cu est de nouveau lié à la fonction universel-argument (juste comme lui était dans le premier exemple), `C-x Cr' est lié à la fonction re-lire-init-dossieret `ESC [ 1 1 ~' est lié pour insérer le texte Touche De Fonction De ` 1'.

Les ordres d'évasion suivants de modèle de GNU Emacs sont disponibles en indiquant les ordres principaux:

\C-

commandez le préfixe

\M-

préfixe de méta

\e

un caractère d'évasion

\ \

antislash

\ "

"une double marque de citation

\ '

'une citation simple ou une apostrophe

En plus des ordres d'évasion de modèle de GNU Emacs, un deuxième ensemble d'évasions d'antislash est disponible:

\a

alerte (cloche)

\b

espacement arrière

\d

effacement

\f

avance d'état ordinateur

\n

caractère NL

\r

retour de chariot

\t

étiquette horizontale

\v

étiquette verticale

\nnn

le caractère de huit bits dont la valeur est la valeur octale nnn (un à trois chiffres)

\xHH

le caractère de huit bits dont la valeur est la valeur hexadécimale HH (un ou deux chiffres de sortilège)

En écrivant le texte d'un macro, des quotes simples ou doubles doivent être employées pour indiquer une macro définition. On assume que le texte non cité est un nom de fonction. Dans le macro corps, les évasions d'antislash décrites ci-dessus sont augmentées. L'antislash citera n'importe quel autre caractère dans le macro texte, incluant ` "' et ` ''. Par exemple, l'attache suivante fera `C-x \ ' insérez un simple ` \ ' dans la ligne:

"\ de \C-x \": "\ \"

27,3,2 Constructions Conditionnelles D'Init

Readline met en application un service semblable dans l'esprit aux devices conditionnels de compilation du préprocesseur de C qui permet les attaches principales et les arrangements variables à exécuter comme résultat des essais. Il y a quatre directives d'analyseur utilisées.

$$if

$$if la construction permet à des attaches d'être faites basé sur le mode d'édition, la borne étant employée, ou l'application en utilisant Readline. Le texte de l'essai se prolonge à l'extrémité de la ligne; aucun caractère n'est exigé pour l'isoler.

mode

mode = formez du $$if la directive est employée pour examiner si Readline est dedans emacs ou vi mode. Ceci peut être employé en même temps que keymap réglé de ` ' commandez, par exemple, de placer des attaches dans emacs-standard et emacs-ctlx keymaps seulement si Readline commence dehors dedans emacs mode.

limite

limite = la forme peut être employée pour inclure les attaches principales borne-spécifiques, peut-être pour lier les ordres principaux produits par les touches de la fonction du terminal. Le mot du bon côté du ` = ' est examiné contre le nom et prénoms du terminal et la partie du nom terminal avant le premier ` - '. Ceci laisse le soleil pour assortir tous les deux le soleil et le soleil-cmdpar exemple.

application

application la construction est employée pour inclure les arrangements spécifiques à l'application. Chaque programme employant la bibliothèque de Readline place nom d'applicationet vous pouvez

déterminez une valeur particulière. Ceci a pu être employé pour lier les ordres principaux aux fonctions utiles pour un programme spécifique. Par exemple, la commande suivante ajoute un ordre principal qui cite le mot courant ou précédent dans le coup:

$$if Coup # citation le mot courant ou précédent "\C-xq": "\eb\"\ef \" " $$endif

$$endif

Cette commande, comme vue dans l'exemple précédent, termine $$if commande.

$$else

Commandes dans cette branche de $$if la directive sont exécutées si l'essai échoue.

$$include

Cette directive prend un nom de fichier simple comme argument et lit des commandes et des attaches à partir de ce dossier. Par exemple, la directive suivante lit de `/etc/inputrc ':

$$include/etc/inputrc

27,3,3 Dossier D'Init D'Echantillon

Voici un exemple d' inputrc dossier. Ceci illustre l'attache principale, la tÃ¢che variable, et la syntaxe conditionnelle.

Â

# ce dossier commande le comportement de l'édition entrée par ligne pour # les programmes qui emploient la bibliothèque de GNU Readline. Existant # les programmes incluent le ftp, le coup, et le GDB. # # vous pouvez relire le dossier d'inputrc avec du Cr de C-x. # les lignes commençant par '# 'sont des commentaires. # # d'abord, incluez au niveau système les attaches et de de variable # de tÃ¢ches/etc/Inputrc $$include/etc/Inputrc # # placent de diverses attaches pour le mode d'emacs. placez la Méta-Commande-h de mode=emacs $$if d'emacs de éditer-mode: le texte de vers l'arrière-tuer-mot après le nom de fonction est ignoré # # des touches de déplacement du curseur en mode de bloc de touches # # "\m-OD": vers l'arrière-carbonisez # "\m-oc": vers l'avant-carbonisez # "\m-bureautique": précédent-histoire # "\m-ob": prochain-histoire # # touches de déplacement du curseur en mode de norme ANSI # "\m-[d": vers l'arrière-carbonisez "\m-[c": vers l'avant-carbonisez "\m-[a": précédent-histoire "\m-[b": prochain-histoire # # touches de déplacement du curseur en mode de bloc de touches de 8 bits # # "\m-\c-OD": vers l'arrière-carbonisez # "\m-\c-oc": vers l'avant-carbonisez # "\m-\c-bureautique": précédent-histoire # "\m-\c-ob": prochain-histoire # # touches de déplacement du curseur en mode de norme ANSI de 8 bits # # "\m-\c-[d": vers l'arrière-carbonisez # "\m-\c-[c": vers l'avant-carbonisez # "\m-\c-[a": précédent-histoire # "\m-\c-[b": QC d'prochain-histoire: citer-insérez $$endif # une attache de vieux-modèle. Ceci s'avère justement être le défaut. Tab: accomplissez # les macros qui sont commodes pour le coup d'interaction $$if de shell # éditent le chemin "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f" # préparent pour tapezr un mot cité -- # insertion ouverte et clôturent de doubles quotes # et se déplacent à juste aprés que \C-x de la citation ouverte "\" ": "\"\"\C-b" # insertion un antislash (l'antislash d'essai s'échappe # dans les ordres et les macros) "\ de \C-x \": "\ \" # citation le mot courant ou précédent "\C-xq": le "\eb\"\ef \" " # ajoutent une attache pour régénérer la ligne, qui est" \C-xr non lié ": la refaire-courant-ligne # éditent la variable sur la ligne courante. "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y =" $$endif # utilisation une cloche évidente si on est cloche-modèle disponible d'ensemble évident # ne dépouillent pas des caractères à 7 bits en lisant l'entrée-méta réglé sur # permettent aux caractères iso-latin1 d'être insérés plutôt # que convertis en convertir-méta réglé par ordres de préfixe-méta outre de # des caractères d'affichage avec le huitième peu réglé directement # plutôt que pendant que les caractères méta-mis en tête plaçaient le rendement-méta sur # s'il y a plus de 150 accomplissements possibles pour # un mot, demandent à l'utilisateur s'il veut voir que tous placent les accomplissement-questionner-articles 150 # Pour Ftp $$if " \C-xg" de Ftp: "obtenez le \M -?" " \C-xt ": "mettez le \M -?" " \M -.": tirer-dernier-arg $$endif

27,4 Commandes De Bindable Readline

27,4,1 Commandes pour se déplacer mobile au sujet de la ligne. 27,4,2 Commandes pour manoeuvrer l'histoire atteignant les lignes précédentes. 27,4,3 Commandes pour des commandes changeantes des textes pour le texte changeant. 27,4,4 Tuant et commandes tirantes pour le massacre et tirer. 27,4,5 Indication des arguments numériques indiquant des arguments numériques, comptes de répétition. 27,4,6 Laissant Readline tapezr pour vous obtenant Readline pour faire la tapez pour vous. 27,4,7 Macros de clavier sauvant et exécutant de nouveau les caractères dactylographiés 27,4,8 quelques commandes diverses d'autres commandes diverses.

Cette section décrit les commandes de Readline qui peuvent être liées aux ordres principaux. Les noms de commande sans ordre principal d'accompagnement sont non liés par défaut.

Dans les descriptions suivantes, le point se rapporte à la position actuelle de curseur, et la marque se rapporte à une position de curseur sauvée par placer-marque commande. Le texte entre le point et la marque désigné sous le nom de la région .

27,4,1 Commandes Pour Se déplacer

commencer-de-ligne (CA)

Déplacez-vous au début de la ligne courante.

end-of-line (ce)

Déplacez-vous à l'extrémité de la ligne.

vers l'avant-carbonisez (Cf)

Faites avancer un caractère.

vers l'arrière-carbonisez (Cb)

Ecartez un caractère.

vers l'avant-mot (M-f)

Avancez à la fin du prochain mot. Des mots se composent de lettres et de chiffres.

vers l'arrière-mot (mb)

Déplacez-vous de nouveau au début du mot courant ou précédent. Des mots se composent de lettres et de chiffres.

clair-écran (Cl)

Dégagez l'écran et refaites la ligne courante, laissant la ligne courante au dessus de l'écran.

refaire-courant-ligne ()

Régénérez la ligne courante. Par défaut, c'est non lié.

27,4,2 Commandes Pour Manoeuvrer L'Histoire

accepter-ligne (caractère NL ou retour)

Acceptez la ligne indépendamment d'où le curseur est. Si cette ligne est non vide, il peut s'ajouter à la liste d'histoire pour le futur rappel avec add_history(). Si cette ligne est une ligne modifiée d'histoire, la ligne d'histoire est reconstituée à son état original.

précédent-histoire (CP)

Déplacez le dos de ` 'par la liste d'histoire, cherchant la commande précédente.

prochain-histoire (C-n)

Faites avancer le ` 'par la liste d'histoire, cherchant la prochaine commande.

commencer-de-histoire (M-<)

Déplacez-vous à la première ligne dans l'histoire.

extrémité-de-histoire (M - >)

Déplacez-vous à la fin de l'histoire d'entrée, c.-à-d., la ligne actuellement étant entrée.

renversé-rechercher-histoire (Cr)

Au recherchez commencer vers le début la ligne courante et ` mobile vers le haut 'par l'histoire selon les besoins. C'est une recherche par accroissement.

vers l'avant-rechercher-histoire (Cs)

Au recherchez commencer en avant la ligne courante et ` mobile vers le bas 'par la l'histoire selon les besoins. C'est une recherche par accroissement.

non-par accroissement-renversé-rechercher-histoire (MP)

Au recherchez commencer vers le début la ligne courante et ` mobile vers le haut 'par l'histoire selon les besoins en utilisant une recherche non-incrémentielle pour une corde fournie par l'utilisateur.

non-par accroissement-vers l'avant-rechercher-histoire (manganèse)

Au recherchez commencer en avant la ligne courante et ` mobile vers le bas 'par la l'histoire selon les besoins en utilisant une recherche non-incrémentielle pour une corde fournie par l'utilisateur.

histoire-rechercher-vers l'avant ()

Recherchez en avant par l'histoire la corde des caractères entre le début la ligne du courante et le point. C'est une recherche non-incrémentielle. Par défaut, cette commande est non liée.

histoire-recherchez-vers l'arrière ()

Recherchez vers l'arrière par l'histoire la corde des caractères entre le début la ligne du courante et le point. C'est une recherche non-incrémentielle. Par défaut, cette commande est non liée.

tirer-nième-arg (M-C-y)

Insérez le premier argument à la commande précédente (habituellement le deuxième mot sur la ligne précédente) au point. Avec un argument ninsérez nmot de Th de la commande précédente (les mots dans la commande précédente commencent par le mot 0). Un argument négatif insère nmot de Th de la fin de la commande précédente.

tirer-dernier-arg (M -. ou M - _)

Insérez le dernier argument à la commande précédente (le dernier mot de l'entrée précédente d'histoire). Avec un argument, comportez-vous exactement comme tirer-nième-arg. Appels successifs à tirer-dernier-arg écartez-vous par la liste d'histoire, insérant le dernier argument de chaque ligne alternativement.

27,4,3 Commandes Pour Le Texte Changeant

supprimer-carbonisez (Cd)

Supprimez le caractère au point. Si le point est au début de la ligne, il n'y a aucun caractère dans la ligne, et le dernier caractère dactylographié n'a pas été lié à supprimer-carbonisezpuis EOF de retour.

vers l'arrière-supprimer-carbonisez (Rubout)

Supprimez le caractère derrière le curseur. Un argument numérique signifie pour tuer les caractères au lieu de les supprimer.

vers l'avant-vers l'arrière-supprimer-carbonisez ()

Supprimez le caractère sous le curseur, à moins que le curseur soit à l'extrémité de la ligne, dans ce cas le caractère derrière le curseur est supprimé. Par défaut, ceci n'est pas lié à une clef.

citer-insérez (QC ou cv)

Ajoutez le prochain caractère dactylographié à la ligne in extenso. C'est comment aux ordres principaux d'insertion comme QCpar exemple.

étiquette-insérez (Tabde M-$l

Insérez un caractère d'étiquette.

individu-insérez (a, b, A, 1,!, ... )

Insérez-vous.

transposer-se carbonise (C-t)

Traînez le caractère avant le curseur en avant au-dessus du caractère au curseur, faisant avancer le curseur aussi bien. Si le point d'insertion est à l'extrémité de la ligne, alors ceci transpose les deux derniers caractères de la ligne. Les arguments négatifs n'ont aucun effet.

transposer-mots (millitorr)

Traînez le mot avant point après le mot après le point, point mobile après ce mot aussi bien. Si le point d'insertion est à l'extrémité de la ligne, ceci transpose les deux derniers mots sur la ligne.

upcase-mot (M-u)

Majuscule (ou suivant) le mot courant. Avec un argument négatif, majuscule le mot précédent, mais ne déplacent pas le curseur.

downcase-mot (ml)

Lettre minuscule (ou suivant) le mot courant. Avec un argument négatif, la lettre minuscule le mot précédent, mais ne déplacent pas le curseur.

profiter-mot (Mc)

Profitez (ou suivant) le mot courant. Avec un argument négatif, profitez le mot précédent, mais ne déplacez pas le curseur.

recouvrir-mode ()

Le cabillot recouvrent le mode. Avec un argument numérique positif explicite, commutateurs pour recouvrir le mode. Avec un argument numérique non positif explicite, commutateurs au mode d'insertion. Cette commande affecte seulement emacs mode; vi le mode recouvre différemment. Chaque appel à readline() débuts en mode d'insertion.

Dans recouvrez le mode, caractères liés à individu-insérez remplacez le texte au point plutôt que d'à pousser le texte vers la droite. Caractères liés à vers l'arrière-supprimer-carbonisez remplacez le caractère avant point avec un espace.

Par défaut, cette commande est non liée.

27,4,4 Tuer Et Tirer

tuer-ligne (C-k)

Tuez le texte du point à l'extrémité de la ligne.

vers l'arrière-tuer-ligne (C-x Rubout)

Tuez vers l'arrière au commencement de la ligne.

unix-ligne-jetez (Cu)

Tuez vers l'arrière du curseur au commencement de la ligne courante.

tuer-entier-ligne ()

Tuez tous les caractères sur la ligne courante, n'importe où le point est. Par défaut, c'est non lié.

tuer-mot (M-d)

Mise à mort de point à la fin du mot courant, ou si entre les mots, à la fin du prochain mot. Les frontières de mot sont identiques As vers l'avant-mot.

vers l'arrière-tuer-mot (M-$lDEL

Tuez le mot derrière le point. Les frontières de mot sont identiques As vers l'arrière-mot.

unix-mot-rubout (dans le sens des aiguilles d'une montre)

Tuez le mot derrière le point, en utilisant l'espace blanc comme frontière de mot. Le texte tué est sauvé sur l'tuer-anneau.

l'supprimer-horizontal-espace ()

Supprimez les tous les espaces et étiquettes autour du point. Par défaut, c'est non lié.

tuer-région ()

Tuez le texte dans la région courante. Par défaut, cette commande est non liée.

copie-région-comme-tuez ()

Copiez le texte dans la région à l'amortisseur de mise à mort, ainsi il peut être tiré d'un coup sec tout de suite. Par défaut, cette commande est non liée.

copie-vers l'arrière-mot ()

Copiez le mot avant point à l'amortisseur de mise à mort. Les frontières de mot sont identiques As vers l'arrière-mot. Par défaut, cette commande est non liée.

copie-vers l'avant-mot ()

Copiez le point suivant de mot à l'amortisseur de mise à mort. Les frontières de mot sont identiques As vers l'avant-mot. Par défaut, cette commande est non liée.

coup sec (C-y)

Tirez le dessus d'un coup sec de l'anneau de mise à mort dans l'amortisseur au point.

tirer-sautez (mon)

Tournez l'tuer-anneau, et tirez le nouveau dessus d'un coup sec. Vous pouvez seulement faire ceci si la commande antérieure est coup sec ou tirer-sautez.

27,4,5 Indication Des Arguments Numériques

chiffre-argument (M-0 M-1... M --

Ajoutez ce chiffre à l'argument s'accumulant déjà, ou commencez un nouvel argument. M -- commence un argument négatif.

universel-argument ()

C'est une autre manière d'indiquer un argument. Si cette commande est suivie d'un ou plusieurs chiffres, sur option avec mener sans le signe, ces chiffres définissez l'argument. Si la commande est suivie des chiffres, exécution universel-argument finit encore l'argument numérique, mais est autrement ignoré. Comme point de droit spécial, si cette commande est immédiatement suivie d'un caractère qui est ni un chiffre ou signe moindre, le compte d'argument pour la prochaine commande est multiplié par quatre. Le compte d'argument est au commencement un, ainsi exécutant cette fonction réalise la première fois le comptage quatre, d'une deuxième marques d'argument fois le compte seize d'argument, et ainsi de suite. Par défaut, ceci n'est pas lié à une clef.

27,4,6 Laissant Readline tapezr Pour Vous

accomplissez (Tab

Essayez d'exécuter l'accomplissement sur le texte avant point. L'accomplissement réel exécuté est spécifique à l'application. Le défaut est accomplissement de nom de fichier.

possible-accomplissements (M -?)

Enumérez les accomplissements possibles du texte avant point.

insérer-accomplissements (M - *)

Insérez tous les accomplissements du texte avant que le point qui aurait été produit près possible-accomplissements.

menu-complet ()

Semblable à completmais remplace le mot à accomplir une allumette simple de la liste d'accomplissements possibles. Exécution répétée de menu-complet steps par la liste d'accomplissements possibles, insérant chaque allumette alternativement. Ã€ la fin de la liste d'accomplissements, la cloche est échelon (sujet à l'arrangement de cloche-modèleet le texte original est reconstitué. Un argument de n se déplace n place en avant dans la liste d'allumettes; un argument négatif peut être employé pour se déplacer vers l'arrière par la liste. Cette commande est prévue d'être lié à Tabmais est non lié par défaut.

supprimer-carboniser-ou-liste ()

Supprime le caractère sous le curseur à si pas le début ou fin de la ligne (comme supprimer-carbonisezSi à l'extrémité de la ligne, se comporte identiquement à possible-accomplissements. Cette commande est non liée par défaut.

27,4,7 Macros De Clavier

commencer-kbd-macro (C-x ()

Commencez à sauver les caractères dactylographiés dans le macro courant de clavier.

extrémité-kbd-macro (C-x))

Cessez de sauver les caractères dactylographiés dans le macro courant de clavier et sauvez la définition.

appeler-dernier-kbd-macro (C-x e)

Exécutez de nouveau le dernier macro de clavier défini, en faisant les caractères dans le macro apparaissent comme si dactylographié au clavier.

27,4,8 Quelques Commandes Diverses

re-lire-init-dossier (Cr de C-x)

Lisez dedans le contenu du inputrc classez, et incorporez toutes les attaches ou tÃ¢ches variables trouvées là.

arrêt (CG.)

Avortez la commande courante d'édition et sonnez la cloche du terminal (sujet à l'arrangement de cloche-modèle

-majuscule-version (mA, mb, M-$lX... )

Si metafied le caractère X est minuscule, execute la commande qui est liée au caractère majuscule correspondant.

préfixe-méta (ESC

Metafy que le prochain caractère a dactylographié. C'est pour des claviers sans clef de méta. tapez `ESC f ' est équivalent à la tapez M-f.

défaites (C - _ ou Cu de C-x)

Par accroissement défaites, séparément rappelé pour chaque ligne.

retourner-ligne (M.)

Défaites tous les changements faits à cette ligne. C'est comme l'exécution défaites commandez assez de temps d'obtenir de nouveau au commencement.

tilde-augmentez (M-~)

Exécutez l'expansion de tilde sur le mot courant.

placer-marque (C-@)

Placez la marque au point. Si un argument numérique est fourni, la marque est placée dans cette position.

échanger-point-et-marque (C-x C-x)

Permutez le point avec la marque. La position actuelle de curseur est placée dans la position sauvée, et la vieille position de curseur est sauvée comme marque.

caractère-recherchez (C - ])

Un caractère est lu et le point est déplacé à la prochaine occurrence de ce caractère. Recherches négatives d'un compte des occurrences précédentes.

caractère-recherchez-vers l'arrière (Mc - ])

Un caractère est lu et le point est déplacé à l'occurrence précédente de ce caractère. Recherches négatives d'un compte des occurrences suivantes.

insérer-commentez (M - #)

Sans argument numérique, la valeur du commenter-commencez la variable est insérée au début de la ligne courante. Si un argument numérique est fourni, des agir de cette commande comme un cabillot: si les caractères au début de la ligne n'assortissent pas la valeur de commenter-commencezla valeur est insérée, autrement les caractères dedans commenter-commencez sont supprimés du commencement de la ligne. Dans l'un ou l'autre cas, la ligne est acceptée comme si un caractère NL avait été dactylographié.

décharge-fonctions ()

Imprimez toutes les fonctions et leurs attaches principales au jet de rendement de Readline. Si un argument numérique est fourni, la sortieest composé de telle manière que ce puisse être fait à une partie d' inputrc dossier. Cette commande est non liée par défaut.

décharge-variables ()

Imprimez toutes les variables settable et leurs valeurs au jet de rendement de Readline. Si un argument numérique est fourni, la sortieest composé de telle manière que ce puisse être fait à une partie d' inputrc dossier. Cette commande est non liée par défaut.

décharge-macros ()

Imprimez tous les ordres principaux de Readline liés aux macros et aux cordes qu'ils produisent. Si un argument numérique est fourni, la sortieest composé de telle manière que ce puisse être fait à une partie d' inputrc dossier. Cette commande est non liée par défaut.

emacs-éditer-mode (ce)

Quand dedans vi le mode de commande, ceci cause un commutateur à emacs édition du mode.

vi-éditer-mode (M-C-j)

Quand dedans emacs éditant le mode, ceci cause un commutateur à vi édition du mode.

27,5 Mode de Readline vi

Tandis que la bibliothèque de Readline n'a pas un ensemble complet de vi des fonctions d'édition, elle contient assez pour permettre l'édition simple de la ligne. Le Readline vi le mode se comporte comme indiqué dans la norme de POSIX 1003,2.

Afin de commuter interactivement entre emacs et vi en éditant des modes, employez la commande M-C-j (bondissez au l'emacs-éditer-mode quand dedans vi mode et au vi-éditer-mode dedans emacs mode). Le défaut de Readline est emacs mode.

Quand vous écrivez une ligne dedans vi mode, vous êtes déjà placés mode dans de ` insertion ', comme si vous aviez dactylographié i'de `. Pression ESC commutateurs vous mode dans de ` commande ', où vous pouvez éditer le texte de la ligne avec la norme vi clefs de mouvement, mouvement aux lignes précédentes d'histoire avec ` k ' et lignes suivantes avec ` j 'et ainsi de suite.

A. Documentation De Formatage

Le dégagement de GDB 4 inclut une carte déjà-composée de référence, prêt pour imprimer avec le post-scriptum ou Ghostscript, sous-répertoire dans de ` gdb 'du répertoire source principal (8) . Si vous pouvez employer le post-scriptum ou le Ghostscript avec votre imprimeur, vous pouvez imprimer la carte de référence immédiatement avec le ` refcard.ps'.

Le dégagement inclut également la source pour la carte de référence. Vous pouvez le composer, en utilisant TeX, par la tapez:

Â

faites refcard.dvi

La carte de référence de GDB est conçue pour imprimer dans le mode de paysage sur le papier de taille d'"lettre" des USA; c'est-à-dire, sur une feuille 11 s'avance au loin par 8,5 pouces de haut. Vous devrez indiquer cette forme d'impression pendant qu'une option à votre DVI produisait le programme.

Toute la documentation pour GDB vient en tant qu'élément de la distribution compréhensible par une machine. La documentation est écrite dans le format de Texinfo, qui est un système de documentation qui emploie un fichier source simple pour produire l'information en ligne et un manuel imprimé. Vous pouvez employer un des commandes de formatage d'information de créer la version en ligne of la documentation et TeX (ou texi2roffpour composer la version imprimée.

GDB inclut une copie déjà composée de la version en ligne d'information de ce manuel sous-répertoire dans de ` gdb '. Le dossier principal d'information est le ` gdb-20031016/gdb/gdb.info ', et il se rapporte à l'assortiment subalterne de dossiers ` gdb.info * ' dans le même annuaire. Au besoin, vous pouvez imprimer hors de ces dossiers, ou les lire avec n'importe quel rédacteur; mais ils sont plus faciles de lire employer information sous-ensemble dans GNU Emacs ou l'autonome information programme, disponible en tant qu'élément de la distribution de GNU Texinfo.

Si vous voulez composer ces dossiers d'information vous-même, vous avez besoin d'un des programmes de formatage d'information, comme texinfo-format-amortisseur ou makeinfo.

Si vous avez makeinfo sont installés, et dans le répertoire source du niveau supérieur GDB ( le ` gdb-20031016 ', dans le cas de la version 20031016), vous pouvez faire le dossier d'information par la tapez:

Â

le gdb CD font gdb.info

Si vous voulez composer et imprimer des copies de ce manuel, vous avez besoin de TeX, un programme pour imprimer ses dossiers de rendement de DVI, et le ` texinfo.tex ', les définitions de Texinfo classent.

TeX est un programme de composition; il n'imprime pas des dossiers directement, mais produit des dossiers de rendement appelés les dossiers de DVI. Pour imprimer un document composé, vous avez besoin d'un programme pour imprimer des dossiers de DVI. Si votre système a TeX installé, les chances sont lui a un tel programme. La commande précise d'employer dépend de votre système; lpr - d est commun; un autre (pour des devices de post-scriptum) est dvips. Sans la commande print de DVI peut exiger un nom de fichier aucun prolongation ou a `.dvi ' prolongation.

TeX exige également un macro dossier de définitions appelé le ` texinfo.tex '. Ce dossier indique à TeX comment composer un document écrit dans le format de Texinfo. Seule, TeX ne peut pas lire ou composer un dossier de Texinfo. le ` texinfo.tex ' est distribué avec GDB et est situé dans le version-nombre du `gdb-de texinfo '.

Si vous faites installer TeX et un programme d'imprimeur de DVI, vous pouvez composer et imprimer ce manuel. Premier commutateur le de ` à gdb ' sous-répertoire du répertoire source principal (par exemple, à de ` gdb-20031016/gdb ') et de type:

Â

faites gdb.dvi

Donnez alors le ` gdb.dvi ' à votre programme d'impression de DVI.

Veuillez envoyer le FSF et les enquêtes et les questions de GNU à gnu@gnu.org . Il y a également d'autres manières d'entrer en contact avec le FSF.

Ces pages sont maintenues par les lotisseurs de GDB .

Copyright Free Software Foundation, Inc., Endroit De 59 Temples - Suite 330, Boston, MA 02111, Etats-Unis.

In extenso copiant et distribution de cet article entier est autorisé dans n'importe quel milieu, si cette notification est préservée.

Ce document a été produit par l'administrateur de GDB octobre, 16 2003 texi2html employants

B. Installation de GDB

GDB vient avec a configurez manuscrit qui automatise le processus de préparer GDB pour l'installation; vous pouvez alors employer faites pour construire gdb programme.

La distribution de GDB inclut tout le code source que vous avez besoin pour GDB dans un annuaire simple, au dont le nom se compose habituellement en apposant le nombre de version gdb de ` '.

Par exemple, la distribution de la version 20031122 de GDB est dans annuaire du ` le gdb-20031122 '. Cet annuaire contient:

gdb-20031122/configure (et dossiers de support)

manuscrit pour configurer GDB et toutes ses bibliothèques de support

gdb-20031122/gdb

le détail de source à GDB lui-même

gdb-20031122/bfd

source pour la bibliothèque binaire de descripteur de dossier

gdb-20031122/include

GNU incluent des dossiers

gdb-20031122/libiberty

source pour `-liberté ' bibliothèque libre de logiciel

gdb-20031122/opcodes

source pour la bibliothèque des tables et des démonteurs d'opcode

gdb-20031122/readline

source pour l'interface de commande-ligne de GNU

gdb-20031122/glob

source pour le sous-programme modèle-correspondant de nom de fichier de GNU

gdb-20031122/mmalloc

source pour le paquet de malloc mémoire-tracé par GNU

La manière la plus simple de configurer et la construction GDB est de démarrer configurez du version-nombre du `gdb-' répertoire source, qui dans cet exemple est annuaire du ` le gdb-20031122 '.

Premier commutateur au version-nombre du `gdb-' répertoire source si vous n'êtes pas déjà dans lui; puis course configurez. Passez la marque pour la plateforme sur laquelle GDB fonctionnera comme argument.

Par exemple:

Â

le centre serveur CD du /configure gdb-20031122 font

là où centre serveur est une marque comme ` sun4 ' ou decstation de ` 'cela identifie la plateforme où GDB fonctionnera. (vous pouvez souvent cesser centre serveur configurez essaye de deviner la valeur correcte en examinant votre système.)

démarrer le ` configurent centre serveur' et alors courant faites construit les bibliothèques de libiberty de ` de mmalloc de ` de bfd de ` ', readline de ` ', ', et ', puis gdb soi-même. Les fichiers source configurés, et les binaries, sont laissés dans les répertoires source correspondants.

configurez est une Bourne-shell (/bin/shmanuscrit; si votre système n'identifie pas ceci automatiquement quand vous executez une shell différente, vous pouvez devoir démarrer SH là-dessus explicitement:

Â

SH configurez le centre serveur

Si vous executez configurez à partir d'un annuaire qui contient des répertoires source pour les bibliothèques multiples ou les programmes, tels que répertoire source du ` le gdb-20031122 'pour la version 20031122, configurez crée des dossiers de configuration pour chaque niveau d'annuaire dessous (à moins que vous le dites pas à, avec ` -- norecursion ' option).

Vous devriez démarrer configurez manuscrit à partir de l'annuaire supérieur dans l'arbre de source, le version-nombre du `gdb-' annuaire. Si vous executez configurez d'un des sous-répertoires, vous configurerez seulement ce sous-répertoire. N'est habituellement pas ce ce que vous voulez. En particulier, si vous executez le premier configurez sous-répertoire de ` de gdb ' du version-nombre du `gdb-' annuaire, vous omettrez la configuration du bfd de ` ', le readline de ` ', et d'autres annuaires d'enfant de mêmes parents sous-répertoire de ` de gdb '. Ceci mène à établir des erreurs au sujet de manquer incluent des dossiers tels que le ` bfd/bfd.h '.

Vous pouvez installer gdb n'importe où; il n'a aucun chemin cÃ¢blé. Cependant, vous devriez vous assurer que la shell sur votre chemin (appelé par shell de ` ' la variable d'environnement) est publiquement lisible. Rappelez-vous que GDB emploie la shell pour commencer votre programme -- quelques systèmes refusent laissent GDB corriger les processus d'enfant dont les programmes ne sont pas lisibles.

B.1 compilant GDB dans un autre annuaire B.2 indiquant des noms pour les centres serveurs et les cibles B.3 configurez le sommaire d'options des options pour configurent

B.1 compilant GDB dans un autre annuaire

Si vous voulez démarrer des versions de GDB pour plusieurs accueillez ou les machines cibles, vous avez besoin d'un différent gdb compilé pour chaque combinaison de centre serveur et de cible. configurez est conçu pour rendre ceci facile en vous permettant de produire de chaque configuration dans un sous-répertoire séparé, plutôt que dans le répertoire source. Si votre faites le programme manipule ` VPATH ' device (GNU faites ), courant faites dans chacun de ces annuaires construit gdb le programme a indiqué là.

Pour construire gdb dans un annuaire séparé, course configurez avec ` -- srcdir ' option pour indiquer où trouver la source. (vous devez également indiquer un chemin pour trouver configurez soi-même à partir de votre annuaire de fonctionnement. Si

le chemin à configurez soyez les mêmes que l'argument à ` -- srcdir 'vous pouvez omettre ` -- srcdir ' option; on le suppose.)

Par exemple, avec la version 20031122, vous pouvez construire GDB dans un annuaire séparé pour un soleil 4 comme ceci:

Â

gdb-20031122 le mkdir CD../gdb-sun4 ../gdb-sun4 CD ../gdb-20031122/configure sun4 font

Quand configurez avec établit une configuration en utilisant un répertoire source à distance, il crée un arbre pour les binaries la même structure (et employer les mêmes noms) que l'arbre sous le répertoire source. Dans l'exemple, vous trouveriez le ` libiberty.a de bibliothèque du soleil 4 ' dans le ` gdb-sun4/libiberty d'annuaire ', et GDB lui-même dans le ` gdb-sun4/gdb '.

Assurez-vous que votre chemin au ` configurent le ' manuscrit a juste un exemple de gdb de ` ' dans lui. Si votre chemin au ` configurent des ' ressembler à `../gdb-20031122/gdb/configure ', vous configurez seulement un sous-répertoire de GDB, pas le paquet entier. Ceci mène à établir des erreurs au sujet de manquer incluent des dossiers tels que le ` bfd/bfd.h '.

Une raison populaire d'établir plusieurs configurations de GDB dans les annuaires séparés doit configurer GDB pour croix-compiler (où GDB fonctionne sur une machine -- le centre serveur tandis que mettant les programmes au point qui courent sur une autre machine -- la cible ). Vous indiquez une cible de croix-correction en donnant ` -- cible =cible' option à configurez.

Quand vous executez faites pour construire un programme ou une bibliothèque, vous devez la démarrer dans un annuaire configuré -- quelqu'annuaire vous ayez été dedans quand vous avez appelé configurez (ou un de ses sous-répertoires).

Fichier makefile cela configurez se produit dans chaque répertoire source execute également périodiquement. Si vous tapez faites dans un répertoire source tel que le ` gdb-20031122 ' (ou dans un annuaire configuré séparé configuré avec ` -- srcdir =dirname'vous construirez toutes les bibliothèques priées, et puis construisez GDB.

Quand vous faites configurer les centres serveurs multiples ou les cibles dans les annuaires séparés, vous pouvez démarrer faites sur eux en parallèle (par exemple, s'ils NFS-sont montés sur chacun des centres serveurs); ils n'interféreront pas l'un l'autre.

B.2 indiquant des noms pour des centres serveurs et des cibles

Les caractéristiques utilisées pour des centres serveurs et des cibles dans configurez le manuscrit sont basés sur un arrangement d'appellation en trois parties, mais quelques noms d'emprunt prédéfinis executes sont également soutenus. Le plein arrangement d'appellation code trois informations dans le modèle suivant:

Â

architecture-fournisseur-OS

Par exemple, vous pouvez employer dit sun4 comme a centre serveur argument, ou comme valeur pour cible dans a -- cible =cible option. Le nom et prénoms équivalent est ` sparc-sun-sunos4 '.

configurez le manuscrit accompagnant GDB ne fournit aucun service de question pour énumérer tous les centre serveur et noms ou noms d'emprunt soutenus de cible. configurez appelle le manuscrit de shell Bourne config.sub aux abréviations de carte aux noms et prénoms; vous pouvez lire le manuscrit, si vous souhaitez, ou vous pouvez l'employer pour examiner vos conjectures sur des abréviations -- par exemple:

Â

% de config.sub i386-linux i386-pc-linux-gnu de % SH config.sub de l'alpha-linux SH de % alpha-inconnus-linux-gnu config.sub hp9k700 hppa1.1-hp-hpux de % SH config.sub sun4 sparc-sun-sunos4.1.1 de % SH config.sub sun3 m68k-sun-sunos4.1.1 de % SH config.sub i986v du ` inadmissible SH i986v'de configuration: ` i986v'de machine non identifié

config.sub est également distribué dans le répertoire source de GDB ( ` gdb-20031122 ', pour version 20031122).

B.3 configurez options

Voici un sommaire de configurez options et arguments qui sont le plus souvent utiles pour le bÃ¢timent GDB. configurez fait également ne pas énumérer plusieurs autres options ici. Voir le ` configure.info de dossier d'information ', ` de noeud de ce que configurez ', pour une pleine explication configurez.

Â

configurez [ - - aide ] [ - - prefix=dir ] [ - - exec-prefix=dir ] [ - - srcdir=dirname ] [ - - norecursion ] [ - - rm ] [ - - target=target ] centre serveur

Vous pouvez présenter des options avec un simple ` - ' plutôt que ` - - ' si vous préférez; mais vous pouvez abréger des noms d'option si vous employez ` - - '.

-- aide

Montrez un sommaire rapide de la façon appeler configurez.

-- préfixe =dir

Configurez la source pour installer des programmes et des dossiers sous le ` d'annuairedir'.

-- exec-préfixe =dir

Configurez la source pour installer des programmes sous le ` d'annuairedir'.

-- srcdir =dirname

Avertissement: employer cette option exige GNU faitesou des autres faites cela met en application VPATH device.
Employez cette option pour faire des configurations dans les annuaires séparé des répertoires source de GDB. Entre autres, vous pouvez employer ceci pour établir (ou maintenir) plusieurs configurations simultanément, dans les annuaires séparés. configurez écrit à configuration les dossiers spécifiques dans l'annuaire courant, mais assure eux pour employer la source dans l'annuaire dirname. configurez crée des annuaires sous l'annuaire de fonctionnement en parallèle aux répertoires source ci-dessous dirname.

-- norecursion

Configurez seulement le niveau d'annuaire où configurez est exécuté; ne propagez pas la configuration aux sous-répertoires.

-- cible =cible

Configurez GDB pour des programmes de croix-correction fonctionnant sur indiqué cible. Sans cette option, GDB est configuré pour mettre les programmes au point qui fonctionnent sur la même machine (centre serveurcomme GDB lui-même.

Il n'y a aucune manière commode de produire d'une liste de toutes les cibles disponibles.

centre serveur ...

Configurez GDB pour démarrer sur indiqué centre serveur.

Il n'y a aucune manière commode de produire d'une liste de tous les centres serveurs disponibles.

Il y a beaucoup d'autres options disponibles aussi bien, mais ils sont généralement nécessaires pour des buts spéciaux seulement.

C. Commandes D'Entretien

En plus des commandes destinées aux utilisateurs de GDB, GDB inclut un certain nombre de commandes destinées aux réalisateurs de GDB. Ces commandes sont données ici pour la référence.

breaks d'information de maint

En utilisant le même format As breaks d'information de `montrez les les deux les breaks que vous avez placés explicitement, et ces GDB emploie pour des buts internes. Des breaks internes sont montrés avec des nombres négatifs de break. La colonne de type identifie quel genre de break est montré:

break

La normale, a explicitement placé le break.

watchpoint

La normale, a explicitement placé le watchpoint.

longjmp

break interne, employé pour manipuler correctement l'progression à travers longjmp appels.

résumé de longjmp

break interne à la cible de a longjmp.

jusque à

break interne provisoire employé par le GDB jusque à commande.

finition

break interne provisoire employé par le GDB finition commande.

événements de shlib

Evénements de bibliothèque partagée.

interne-erreur de maint

interne-avertissement de maint

Cause GDB pour appeler la fonction interne internal_error ou internal_warning et par conséquent comportez-vous comme s'une erreur interne ou un avertissement interne a été détectée. En plus de signaler le problème interne, ces fonctions donnent à l'utilisateur l'occasion à GDB stoppé ou créent un core file de la session courante de GDB.

interne-erreur de maint (de gdb) examinant, 1, 2 ... /maint.c:121: interne-erreur: examinant, 1, problème de 2 A interne à GDB a été détecté. Davantage de correction peut prouver incertain. Stoppez cette session de correction? (y ou n) n créent un core file? (y ou n) n (gdb)

Prend un paramètre facultatif qui est employé comme texte de l'erreur ou du message d'avertissement.

factice-armatures d'impression de maint

Imprime le contenu de la pile interne de l'factice-armature de GDB.

(gdb) b ajoutent ... le break 2 de l'impression (de gdb ) add(2,3), s'ajoutent (a=2, b=3)... à 58 retours (a + b); Le programme étant corrigé arrêté tandis que dans une fonction a appelé de GDB. ... factice-armatures 0x1a57c80 d'impression de maint (de gdb ): pc=0x01014068 fp=0x0200bddc sp=0x0200bdd6 top=0x0200bdd4 id={stack=0x200bddc, code=0x101405c } call_lo=0x01014000 call_hi=0x01014001 (gdb)

Prend un paramètre de dossier facultatif.

registres d'impression de maint

la copie de maint cru-s'enregistre

la copie de maint faire cuire-s'enregistre

enregistrer-groupes d'impression de maint

Structures de données internes du registre de GDB d'impression.

La commande la copie de maint cru-s'enregistre inclut le contenu de la cachette crue de registre; la commande la copie de maint faire cuire-s'enregistre inclut la valeur (cuite) de tous les registres; et la commande enregistrer-groupes d'impression de maint inclut les groupes que chaque registre est un membre de. Voir les registres de ` de section dans GDB Internals .

Prend un paramètre de dossier facultatif.

reggroups d'impression de maint

Structures de données internes de groupe du registre de GDB d'impression.

Prend un paramètre de dossier facultatif.

utilisateur général de flotteur d'utilisateur de type de groupe de reggroups d'impression de maint (de gdb) tout l'utilisateur de système d'utilisateur de vecteur d'utilisateur économiser la restauration interne interne

profil réglé de maint

profil d'exposition de maint

Commandez le profilage de GDB.

Le profilage sera handicapé jusqu'à ce que vous employiez profil réglé de maint de ` ' commande de la permettre. Quand vous permettez le profilage, le système commencera à rassembler la synchronisation et les données de compte d'exécution; quand vous neutralisez le profilage ou sortez GDB, les résultats seront écrits à un dossier de notation. Rappelez-vous que si vous employez le profilage, GDB recouvrira le dossier de notation de profilage (souvent appelé le ` gmon.out '). Si vous avez un disque des données de profilage importantes dans un ` gmon.out ' classez, soyez sûr de le déplacer à un endroit sûr.

Configuration avec ` -- permettre-profilant ' assure GDB à compiler avec `-page ' option de compilateur.

Protocole De Publication périodique De D. GDB Remote

vue d'ensemble de 1

Il peut y avoir des occasions quand vous devez savoir quelque chose au sujet du protocole -- par exemple, s'il y a seulement une porte série à votre machine cible, vous pourriez vouloir que votre programme fasse quelque chose de spécial s'il identifie un paquet signifié pour GDB.

Dans les exemples ci-dessous, ` - > ' et ` < - ' sont employés pour indiquer des données avec respect transmises et reçues.

Toutes les commandes et réponses de GDB (autre que des reconnaissances) sont envoyées comme a paquet. A paquet est présenté avec le caractère ` $ 'le réel paquet-donnéeset le caractère de terminaison ` # ' suivi d'un deux-chiffre somme

Â

$$packet-data#checksum

Le deux-chiffre somme est calculé comme le modulo 256 sommes de tous les caractères entre mener ` $ ' et le remorquage ` # ' (une somme non signée de huit bits).

Implementors devrait noter qu'avant GDB 5,0 les spécifications de protocole ont également inclus un deux-chiffre facultatif ordre-identification

Â

$$sequence-id:packet-data#checksum

Cela ordre-identification a été apposé à la reconnaissance. GDB n'a jamais produit ordre-identifications. Les moignons qui manipulent des paquets se sont ajoutés puisque GDB 5,0 ne doit pas accepter ordre-identification.

Quand le centre serveur ou la machine cible reçoit un paquet, la première réponse prévue est une reconnaissance: l'un ou l'autre ` + ' (indiquer le paquet a été reçu correctement) ou ` - ' (pour demander le retransmission):

Â

- > $$packet-data#checksum < - +

Le centre serveur (GDB) envoie commandes, et la cible (le moignon de correction incorporé dans votre programme) envoie a réponse. Dans le cas de l'step et continuez commandes, la réponse est seulement envoyé quand l'opération a accompli (la cible s'est encore arrêtée).

paquet-données se compose d'un ordre des caractères excepté ` # ' et ` $ ' (voyez ` X' paquet pour des exceptions additionnelles).

Les champs dans le paquet devraient être employer séparé `, ' `;' ou `: '. Ã€ moins qu'où autrement remarquable tous les nombres soient représentés dans le SORTILÃˆGE avec de principaux zéros supprimés.

Implementors devrait noter qu'avant GDB 5,0, le caractère `: ' ne pourrait pas apparaître comme troisième caractère dans un paquet (car il serait en conflit potentiellement avec ordre-identification

Réponse données peut être la démarrer-longueur codée pour ménager de l'espace. A ` * ' signifie que le prochain caractère est une ASCII codant donnant un compte de répétition qui représente celle beaucoup de répétitions de précéder de caractère ` * '. Le codage est n+29rapportant un caractère imprimable où n > = 3 (qui est où le rle commence à gagner). Les caractères imprimables ` $ ' ` # ' ` + ' et ` - ' ou avec une valeur numérique 126 plus grands que ne devraient pas être employés.

Quelques systèmes à distance ont employé un mécanisme de codage de démarrer-longueur différente refered lÃ¢chement à comme codage de Cisco. Après ` * ' le caractère sont deux chiffres de sortilège qui indiquent la taille du paquet.

Ainsi:

"0* "

signifie les mêmes que "0000".

La réponse d'erreur est retournée pour quelques paquets inclut un nombre d'erreur de deux caractères. Que le nombre n'est pas bon défini.

Pour quels commande non soutenu par le moignon, une réponse vide (`$#00 'devrait être retourné. De cette façon il est possible de prolonger le protocole. Un plus nouveau GDB peut indiquer si un paquet est soutenu basait sur cette réponse.

Un moignon est exigé pour soutenir ` g ' ` G ' ` m ' ` M ' ` c 'et s de ` commandes. Tout l'autre commandes sont facultatif.

Paquets D.2

La table suivante fournit une liste complète de tous actuellement définis commandes et leur réponse correspondante données.

! -- mode prolongé

Permettez le mode prolongé. En mode prolongé, le serveur à distance est rendu persistant. ` R ' le paquet est employé pour remettre en marche le programme étant corrigé.

Réponse:

OK de ` '

Les appuis à distance de cible et a permis le mode prolongé.

? -- dernier signal

Indiquez que la raison que la cible a stoppée. La réponse est la même que pour l'step et continue.

Réponse: Voir l'arrêt de la section D.3 répondre des paquets , pour les caractéristiques de réponse.

a -- réservé

Réservé pour le futur usage.

Aarglen,argnum,arg, ... -- arguments réglés de programme (réservés)

Initialisé argv[ de ` ] ' la rangée a passé dans le programme. arglen indique le nombre de bytes dans le jet de byte codé par sortilège arg. Voyez gdbserver pour plus de détails.

Réponse:

OK de ` '

` ENN'

bbaud -- baud réglé (désapprouvé)

Changez la vitesse de ligne périodique en baud.

JTC: Quand l'état de couche transport change-t-il? Quand il est reçu, ou après le ACK est transmis. Dans l'un ou l'autre cas, il y a des problèmes si la commande ou le paquet de reconnaissance est abandonnée.

Stan: Si les gens voulaient vraiment ajouter quelque chose comme ceci, et l'obtiennent fonctionnant pour la première fois, ils doivent modifier ser-unix.c pour envoyer un certain genre de message hors bande à un moignon d'spécial-installation et faire se produire le commutateur "entre" des paquets, de sorte que du point de vue du protocole à distance, rien ne se soit produit réellement.

Baddrmode -- break réglé (désapprouvé)

Placez (mode est s de `ou clair (mode est ` C 'un break à addr.

Ce paquet a été remplacé par ` Z ' et ` z ' paquets (voir le paquet de break ou de watchpoint d'insertion ).

caddr -- continuez

addr est l'adresse à reprendre. Si addr est omis, résumé à l'adresse courante.

Réponse: Voir l'arrêt de la section D.3 répondre des paquets , pour les caractéristiques de réponse.

Csig;addr -- continuez le signal

Continuez le signal sig (nombre de signal de sortilège). Si ;addr est omis, résumé à la même adresse.

Réponse: Voir l'arrêt de la section D.3 répondre des paquets , pour les caractéristiques de réponse.

d -- le cabillot corrigent (désapprouvé)

Le cabillot corrigent le drapeau.

D -- détachez

Détachez GDB du système à distance. Envoyé à la cible à distance avant GDB débranche par l'intermédiaire du détachez commande.

Réponse:

` aucune réponse '

GDB ne vérifie aucune réponse après envoi de ce paquet.

e -- réservé

Réservé pour le futur usage.

E -- réservé

Réservé pour le futur usage.

f -- réservé

Réservé pour le futur usage.

FRC,EE,CF;XX -- réponse au paquet du F de la cible.

Ce paquet est envoient par GDB en tant que réponse à a F paquet de demande envoyé par la cible. Ce fait partie de la prolongation de protocole de File-I/O. Voir la prolongation à distance de protocole de la section D.7 File-I/O , pour les spécifications.

g -- lisez les registres

Lisez les registres généraux.

Réponse:

`XX ... '

Chaque byte des données de registre est décrit par deux chiffres de sortilège. Les bytes avec le registre sont transmis dans l'ordre de byte de cible. La taille de chaque registre et de leur position dans ` g ' paquet sont déterminés par les macros internes de GDB DEPRECATED_register_raw_size et REGISTER_name macros. Les spécifications des plusieurs norme g des paquets est indiqués ci-dessous.

` ENN'

pour une erreur.

GXX ... -- écrivez les regs

Voir le paquet lu de registres , pour une description de XX ... données.

Réponse:

OK de ` '

pour le succès

` ENN'

pour une erreur

h -- réservé

Réservé pour le futur usage.

Hct ... --

fil réglé

Fil réglé pour des opérations suivantes (` m ' ` M ' ` g ' ` G 'et autres). c dépend de l'opération à exécuter: elle devrait être ` c ' pour l'step et continuez les opérations, ` g ' pour d'autres opérations. L'indicateur de fil t ... peut être -1, signifiant tous les fils, un nombre de fil, ou zéro qui signifie la sélection n'importe quel fil.

Réponse:

OK de ` '

pour le succès

` ENN'

pour une erreur

iaddr,nnn -- step de cycle (ébauche)

Font un pas la cible à distance par un rhythme simple. Si ,nnn est présente, l'step de cycle nnn cycles. Si addr est présente, l'step de cycle commençant à cette adresse.

I -- le signal font un cycle alors l'step (réservée)

Voir l'step avec le paquet de signal . Voir le paquet d'step de cycle .

j -- réservé

Réservé pour le futur usage.

J -- réservé

Réservé pour le futur usage.

k -- demande de mise à mort

FIXME: Il n'y a aucune description de la façon fonctionner quand un contexte spécifique de fil a été choisi (c.-à-d. la mise à mort de 'k 'seulement qui filètent?) .

K -- réservé

Réservé pour le futur usage.

l -- réservé

Réservé pour le futur usage.

L -- réservé

Réservé pour le futur usage.

maddr,longueur -- mémoire lue

Lu longueur bytes de mémoire commençant à l'adresse addr. Ni GDB ni le moignon ne supposent que des transferts classés de mémoire sont assumés en utilisant des accès alignés par mot. FIXME: Un mot a aligné le mécanisme de transfert de mémoire est nécessaire.

Réponse:

`XX ... '

XX ... est le contenu de mem. Peuvent être moins de bytes que demandés si capable lire seulement une partie des données. Ni GDB ni le moignon ne supposent que des transferts classés de mémoire sont assumés en utilisant des accès alignés par mot. FIXME: Un mot a aligné le mécanisme de transfert de mémoire est nécessaire.

` ENN'

NN est l'errno

Maddrlongueur:XX ... -- écrivez le mem

Ecrivez longueur bytes de mémoire commençant à l'adresse addr. XX ... sont les données.

Réponse:

OK de ` '

pour le succès

` ENN'

pour une erreur (ceci inclut le cas où seulement une partie des données a été écrite).

n -- réservé

Réservé pour le futur usage.

N -- réservé

Réservé pour le futur usage.

o -- réservé

Réservé pour le futur usage.

O -- réservé

Réservé pour le futur usage.

pn ... -- repérage lu (réservé)

Voyez pour écrire le paquet de registre .

Réponse:

`r ... .'

La valeur codée par sortilège du registre dans l'ordre de byte de cible.

Pn ... =r ... -- écrivez le registre

Ecrivez le registre n ... avec la valeur r ... qui contient deux chiffres de sortilège pour chaque byte dans le registre (ordre de byte de cible).

Réponse:

OK de ` '

pour le succès

` ENN'

pour une erreur

qquestion -- question générale

Information de demande environ question. En général GDB les questions ont une principale lettre majuscule. Les questions faites sur commande de fournisseur devraient employer un préfixe de compagnie (en minuscules) ex: ` qfsf.var '. question peut sur option être suivi de a `, ' ou `;' liste séparée. Les moignons doivent s'assurer qu'ils assortissent le plein question nom.

Réponse:

`XX ... '

Données codées par sortilège de question. La réponse ne peut pas être vide.

` ENN'

réponse d'erreur

` '

Témoin d'un non reconnu question.

Qvariété=val -- ensemble de général

Placez la valeur de variété à val.

Voir le paquet général de question , pour une discussion d'appeler des conventions.

r -- remettez à zéro (désapprouvé)

Remettez à zéro le système entier.

RXX -- relancement à distance

Remettez en marche le programme étant corrigé. XXtandis que nécessaire, est ignoré. Ce paquet est seulement disponible dans le mode prolongé.

Réponse:

` aucune réponse '

` R ' le paquet n'a aucune réponse.

saddr -- step

addr est adresse à reprendre. Si addr est omis, résumé à la même adresse.

Réponse: Voient l'arrêt de la section D.3 répondre des paquets , pour les caractéristiques de réponse.

Ssig;addr -- step avec le signal

Comme ` C ' mais step ne pas continuer.

Réponse: Voient l'arrêt de la section D.3 répondre des paquets , pour les caractéristiques de réponse.

taddr:Pp,Millimètre -- recherche

Rechercher commençant vers le début à l'adresse addr pour une allumette avec le modèle Pp et masque Millimètre. Pp et Millimètre sont 4 bytes. addr doit être au moins 3 chiffres.

TXX -- fil vivant

Découvrent si le fil XX est vivant.

Réponse:

OK de ` '

le fil est encore vivant

` ENN'

le fil est mort

u -- réservé

Réservé pour le futur usage.

U -- réservé

Réservé pour le futur usage.

v -- préfixe bavard de paquet

Paquets commençant par v sont identifiés par un nom de multi-lettre, jusqu'au premier ; ou ? (ou l'extrémité du paquet).

vCont[;action[:tid]]... -- résumé prolongé

Reprennent l'inférieur. Différentes actions peuvent être indiquées pour chaque fil. Si une action est indiquée sans tidalors il est appliqué à tous les fils qui n'ont pas une action spécifique indiquée; si aucune action de défaut n'est indiquée alors d'autres fils devraient rester arrêtés. Indique des actions multiples de défaut une erreur; n'indique aucune action également une erreur. Des identifications de fil sont indiquées dans l'hexadécimal. Les actions actuellement soutenues sont:

c

Continuent.

Csig

Continuent le signal sig. sig si soyez deux chiffres de sortilège.

s

Etape.

Ssig

Etape avec le signal sig. sig si soyez deux chiffres de sortilège.

Le facultatif addr l'argument s'est normalement associé à ces paquets n'est pas soutenu dedans vCont.

Réponse: Voient l'arrêt de la section D.3 répondre des paquets , pour les caractéristiques de réponse.

vCont? -- question prolongée de résumé

Soutien de question de vCont paquet.

Réponse:

`vCont[;action]... '

vCont le paquet est soutenu. Chacun action est une commande soutenue dans vCont paquet.

` '

vCont le paquet n'est pas soutenu.

V -- réservé

Réservé pour le futur usage.

W -- réservé

Réservé pour le futur usage.

W -- réservé

Réservé pour le futur usage.

X -- réservé

Réservé pour le futur usage.

Xaddr,length:XX ... -- écrivez le mem (binaire)

addr est l'adresse, longueur est le nombre de bytes, XX ... sont les données binaires. Les caractères $ #et 0x7d sont employer échappé 0x7d.

Réponse:

OK de ` '

pour le succès

` ENN'

pour une erreur

y -- réservé

Réservé pour le futur usage.

Y réservé

Réservé pour le futur usage.

ztype,addr,longueur -- enlevez le break ou le watchpoint (ébauche)

Ztapez,addr,longueur -- insérez le break ou le watchpoint (ébauche)

Insérez (Zou enlevez (za type break ou watchpoint commençant à l'adresse adresse et bÃ¢che le prochain longueur bytes.

Chaque paquet de break et de watchpoint type est documenté séparément.

Notes d'exécution: Une cible à distance renverra une corde vide pour un paquet non reconnu de break ou de watchpoint type. Une cible à distance ne soutiendra tous les deux ou ni l'un ni l'autre donné Ztype... et ztype... paire de paquet. Pour éviter des problèmes potentiels avec les paquets doubles, les opérations devraient être mises en application d'une manière de quantité.

z0,addr,longueur -- enlevez le break de mémoire (ébauche)

Z0,addr,longueur -- insérez le break de mémoire (ébauche)

Insérez (Z0ou enlevez (z0un break de mémoire à l'adresse addr de la taille longueur.

Un break de mémoire est mis en application en remplaçant l'instruction à addr avec un break de logiciel ou une instruction de piège. longueur est employé par des cibles qui indique la taille du break (dans les bytes) qui devrait être inséré (par exemple, le BRAS et les MIPS peuvent insérer un break de 2 ou 4 bytes).

Note d'exécution: Il est possible que une cible de copier ou déplacer le code qui contient des breaks de mémoire (par exemple, en mettant en application des recouvrements). Le comportement de ce paquet, en présence d'une telle cible, n'est pas défini.

Réponse:

OK de ` '

succès

` '

non soutenu

` ENN'

pour une erreur

z1,addr,longueur -- enlevez le break de matériel (ébauche)

Z1,addr,longueur -- insérez le break de matériel (ébauche)

Insérez (Z1ou enlevez (z1un break de matériel à l'adresse addr de la taille longueur.

Un break de matériel est mis en application en utilisant un mécanisme qui ne dépend pas de pouvoir modifier la mémoire de la cible.

Note d'exécution: Un break de matériel n'est pas affecté par le mouvement de code.

Réponse:

OK de ` '

succès

` '

non soutenu

` ENN'

pour une erreur

z2,addr,longueur -- enlevez écrivent le watchpoint (ébauche)

Z2,addr,longueur -- insérez écrivent le watchpoint (ébauche)

Insérez (Z2ou enlevez (z2un watchpoint d'inscription.

Réponse:

OK de ` '

succès

` '

non soutenu

` ENN'

pour une erreur

z3,addr,longueur -- enlevez le watchpoint lu (ébauche)

Z3,addr,longueur -- insérez le watchpoint lu (ébauche)

Insérez (Z3ou enlevez (z3un watchpoint lu.

Réponse:

OK de ` '

succès

` '

non soutenu

` ENN'

pour une erreur

z4,addr,longueur -- enlevez le watchpoint d'accès (ébauche)

Z4,addr,longueur -- insérez le watchpoint d'accès (ébauche)

Insérez (Z4ou enlevez (z4un watchpoint d'accès.

Réponse:

OK de ` '

succès

` '

non soutenu

` ENN'

pour une erreur

Paquets De Réponse De l'Arrêt D.3

` C ' ` c ' s de ` s de ` et `?' les paquets peuvent recevoir n'importe lequel de ci-dessous comme réponse. Dans le cas du ` C ' ` c ' s de ` et s de ` des paquets, cette réponse est seulement retournés quand la cible stoppe. Dans ci-dessous la signification exacte de nombre de signal de ` ' est mal défini. En général un des conventions de numérotation de signal d'cUnix est employé.

` SAa'

Aa est le nombre de signal

`TAAn...:r...;n...:r...;n...:r...;'

Aa de = nombre de signal de chiffre deux sortilèges; n... = nombre de registre (sortilège), r... = le byte de cible a commandé le contenu de registre, taille définie près DEPRECATED_register_raw_size n... = fil de ` ' r... = l'identification de processus de fil, ceci est un nombre entier de sortilège; n... = (montre de ` ' | rwatch de ` ' | awatch de ` ' r... = l'adresse de données, ceci est un nombre entier de sortilège; n... = l'autre corde pas commençant par le chiffre valide de sortilège. GDB devrait ignorer ceci n... r... appareillez et continuez au prochain. De cette façon nous pouvons prolonger le protocole.

` WAa'

Le processus a sorti, et Aa est le statut de sortie. C'est seulement applicable à certaines cibles.

` XAa'

Le processus s'est terminé avec le signal Aa.

` NAat ... d ... b ... (désuet) '

Aa = nombre de signal; t ... = adresse de symbole _ début d ... = base de section de données; b ... = base de section de bss. Note: seulement utilisé par des cibles de Cisco Systems. La différence entre cette réponse et qOffsets de ` la question est que ` N ' le paquet peut arriver spontanément tandis que qOffsets de ` est une question lancée par le programme de mise au point de centre serveur.

` OXX ... '

XX ... est le codage de sortilège des données d'cAscii. Ceci peut se produire à tout moment tandis que le programme fonctionne et le programme de mise au point devrait continuer à attendre ` W ' ` T 'etc...

` Fappeler-identification,paramètre ... '

appeler-identification est la marque qui indique quel appel de système hôte devrait s'appeler. C'est juste le nom de la fonction. La traduction dans l'appel correct de système est seulement applicable car elle est définie dans GDB. Voir la prolongation à distance de protocole de la section D.7 File-I/O , parce que la liste d'appels mis en application de système.

paramètre ... est une liste de paramètres comme définie pour cet appel même de système.

La cible répond avec ce paquet quand elle prévoit que GDB pour appeler un système hôte invitent le nom de la cible. GDB répondent avec un approprié F le paquet et continue attendant le prochain paquet de réponse de la cible. Le plus en retard ` C ' ` c ' s de ` ou s de ` on s'attend à ce que l'action soit continuée. Voir la prolongation à distance de protocole de la section D.7 File-I/O , pour plus de détails.

Paquets Généraux De la Question D.4

Les paquets suivants d'ensemble et de question ont été déjà définis.

qC -- fil courant

Renvoyez l'identification courante de fil.

Réponse:

`QCpid'

Là où pid est un SORTILÃˆGE a codé l'identification de processus de 16 bits.

` * '

N'importe quelle autre réponse implique le vieux pid.

qfThreadInfo -- tous identifications de fil

qsThreadInfo

Obtenez une liste d'identifications actives de fil de la cible (OS). Puisqu'il peut y avoir trop de fils actifs à adapter dans un paquet de réponse, des travaux de cette question itérativement: il peut exiger de plus d'un ordre de query/reply d'obtenir la liste entière de fils. La première question de l'ordre sera qfThreadInfo question; les questions suivantes dans l'ordre seront qsThreadInfo question.

NOTE: remplace qL question (voir ci-dessous).

Réponse:

`midentification'

Une identification simple de fil

`midentificationidentification... '

une liste virgule-séparée d'identifications de fil

`l'

('EL 'minuscule) dénote la fin de la liste.

En réponse à chaque question, la cible répondra avec une liste d'une ou plusieurs identifications de fil, dans le grand-endian sortilège, séparé par des virgules. GDB répondra à chaque réponse avec une demande de plus d'identifications de fil (employer qs formez de la question), jusqu'à ce que la cible réponde avec l (EL minuscule, pour 'dernier '

qThreadExtraInfo,identification -- information supplémentaire de fil

Là où identification est une fileter-identification dans le grand-endian sortilège. Obtenez une description imprimable de corde des attributs d'un fil de l'cOs de cible. Cette corde peut contenir tout ce que l'cOs de cible pense est intéressant pour que GDB dise l'utilisateur au sujet du fil. La corde est montrée dans GDB fils d'information de ` affichage. Quelques exemples des cordes supplémentaires d'information de fil possible sont "praticables", ou "bloqué sur Mutex".

Réponse:

`XX ... '

Là où XX ... est un codage de sortilège des données d'cAscii, comportant la corde imprimable contenant les informations supplémentaires sur les attributs du fil.

qLstartflagthreadcountnextthread -- question LISTE ou threadLIST (désapprouvé)

Obtenez l'information de fil de RTOS. Là où: startflag (un chiffre de sortilège) est on pour indiquer la première question et zéro pour indiquer une question suivante; threadcount (deux chiffres de sortilège) est le nombre maximum des fils que le paquet de réponse peut contenir; et nextthread (huit chiffres de sortilège), pour des questions suivantes (startflag est zéro), est retourné dans la réponse As argthread.

NOTE: cette question est remplacée par qfThreadInfo question (voir ci-dessus).

Réponse:

`qMcountdoneargthreadthread ... '

Là où: compte (deux chiffres de sortilège) est le nombre de fils étant retournés; fait (un chiffre de sortilège) est zéro pour indiquer que des plus fils et n'indiquent aucun autre fil; argthreadid (huit chiffres de sortilège) est nextthread du paquet de demande; fil ... est un ordre des identifications de fil de la cible. threadid (huit chiffres de sortilège). Voyez remote.c:parse_threadlist_response().

qCRC:addr,longueur -- calcul CRC de bloc de mémoire

Réponse:

`ENN'

Une erreur (telle que le défaut de mémoire)

`CCRC32'

Un contrôle par redondance cyclique de 32 bits de la région de mémoire indiquée.

qOffsets -- offs de section de question

Obtenez les excentrages de section que la cible a employés en replaçant l'image téléchargée. Note: tandis qu'a Bss excentrez est inclus dans la réponse, GDB ignore ceci et applique à la place Données excentrage au Bss section.

Réponse:

`Texte =xxx;Data =yyy;Bss =zzz'

qPmodethreadid -- demande d'information de fil

Renvoie l'information dessus threadid. Là où: mode est un sortilège a codé le mode de 32 bits; threadid est un sortilège a codé l'identification de fil de 64 bits.

Réponse:

` * '

Voyez remote.c:remote_unpack_thread_info_response().

qRcmd,commande -- commande à distance

commande (sortilège codé) est passé à l'interprète local pour l'exécution. Des commandes inadmissibles devraient être rapportées en utilisant la corde de rendement. Avant le paquet final de résultat, la cible peut également répondre avec un certain nombre d'intermédiaire Orendement paquets de rendement de console. Implementors devrait noter cela qui permet d'accéder à un interprète des moignons peut avoir des implications de sécurité .

Réponse:

OK de ` '

Une réponse de commande sans le rendement.

`RENDEMENT'

Une réponse de commande avec de la corde de rendement codée par sortilège RENDEMENT.

`ENN'

Indiquez une demande mal formée.

`` ''

Quand q'`Rcmd de ` ' n'est pas reconnu.

qSymbol:: -- consultation de symbole

Informez la cible que GDB est préparé pour servir des demandes de consultation de symbole. Acceptez les demandes de la cible pour les valeurs des symboles.

Réponse:

`OK'

La cible n'a pas besoin de ne rechercher aucun (plus) de symbole.

`qSymbol:sym_name'

La cible demande la valeur du symbole sym_name (sortilège codé). GDB peut fournir la valeur en employant qSymbol:sym_valuesym_name message, décrit ci-dessous.

qSymbol:sym_valuesym_name -- valeur de symbole

Placez la valeur de sym_name à sym_value.

sym_name (sortilège codé) est le nom d'un symbole dont la valeur la cible a précédemment demandée.

sym_value (sortilège) est la valeur pour le symbole sym_name. Si GDB ne peut pas assurer une valeur pour sym_namealors ce champ sera vide.

Réponse:

`OK'

La cible n'a pas besoin de ne rechercher aucun (plus) de symbole.

`qSymbol:sym_name'

La cible demande la valeur d'un nouveau symbole sym_name (sortilège codé). GDB continuera à assurer les valeurs des symboles (si disponible), jusqu'à ce que la cible cesse de les demander.

Format De Paquet Du Registre D.5

Le suivant ` g '` G ' des paquets ont été précédemment définis. Dans ci-dessous, quelques registres de peu de thirty-two sont transférés comme peu de sixty-four. Ces registres devraient être zero/sign prolongés (qui?) remplir espace a assigné. Des bytes de registre sont transférés dans l'ordre de byte de cible. Les deux grignotements dans un byte de registre sont plus significatifs transféré - moins significatif.

MIPS32

Tous les registres sont transférés en tant que quantités de peu de thirty-two dans l'ordre: 32 d'usage universel; Sr; bas; bonjour; mauvais; cause; PC; 32 registres à point mobile; fsr; sapin; point de gel.

MIPS64

Tous les registres sont transférés en tant que quantités de peu de sixty-four (registres y compris de peu de thirty-two comme SrLa commande est identique As MIPS32.

Exemples D.6

Ordre d'exemple d'une cible étant remise en marche. Notification comment le relancement n'en obtient pas la sortiedirect:

Â

- > R00 < - + relancements de cible - >? < - + < - T001:1234123412341234 - > +

Ordre d'exemple d'une cible fait un pas par une instruction simple:

Â

- > G1445... < - + - > s

< - + le temps passe < - T001:1234123412341234 - > + - > g < - + < - 1455... - > +

Prolongation à distance de protocole de D.7 File-I/O

Vue d'ensemble De D.7.1 File-I/O

La prolongation à distance de protocole du dossier I/o (executee: File-I/O) permet à la cible d'utiliser le système de fichiers de centres serveurs et la console I/o en appelant le divers système appelle. Le système invite le système de cible sont traduits en paquet à distance de protocole au système hôte qui alors effectue les actions nécessaires et revient avec à paquet proportionné de réponse au système de cible. Ceci simule des opérations de système de fichiers même sur les cibles qui manquent des systèmes de fichiers.

Le protocole est centre serveur défini et cible-système indépendant. Il l'emploie doit posséder la représentation indépendante des datatypes et des valeurs. Tous les deux, GDB et le moignon du GDB de la cible sont responsables de traduire les valeurs dépendantes de système dans les valeurs unifiées de protocole quand des données sont transmises.

La communication est synchrone. Un appel de système est possible seulement quand GDB est attente ` C ' ` c ' s de ` ou s de ` paquets. Tandis que GDB manipule la demande d'un appel de système, la cible est cessée pour permettre l'accès déterministe à la mémoire de la cible. Par conséquent File-I/O n'est pas interuptible par des signaux de cible. Il est possible d'interrompre File-I/O par une interruption d'utilisateur (Ctrl-C), cependant.

La demande de la cible d'exécuter un appel de système hôte ne finit pas le plus en retard ` C ' ` c ' s de ` ou s de ` action. Cela signifie, après avoir fini l'appel de système, les retours de cible à continuer l'activité précédente (continuez, step). Aucun additionnel ne continue ou la demande d'step de GDB est exigée.

Â

(gdb) continuez < - la cible d'appel le 'système X 'de demandes de cible est arrêtée, GDB exécute l'appel de système - > les retours de GDB résultent... cible continue, GDB revient à l'attente la cible < - break de coups de cible et envoie un paquet de Txx

Le protocole est seulement employé pour des dossiers sur le système de fichiers de centre serveur et pour I/o sur la console. Des devices spéciaux de caractère ou de bloc, pipes, appelées des pipes ou des douilles ou aucune autre méthode de communication sur le système hôte ne sont pas soutenus par ce protocole.

Fondations du protocole D.7.2

Le protocole de File-I/O emploie F paquet, en tant que demande comme comme paquet de réponse. Puisqu'un appel de système de File-I/O peut seulement se produire quand GDB attend la cible de continuer ou faire un pas, la demande de File-I/O est une réponse que GDB doit prévoir en raison d'un ancien ` C ' ` c ' s de ` ou s de ` paquet. Ceci F le paquet contient toute l'information requise pour permettre à GDB d'appeler l'appel approprié de système hôte:

Une marque unique pour l'appel demandé de système.

Tous les paramètres à l'appel de système. Des indicateurs sont donnés en tant qu'adresses dans l'espace adresse de mémoire de cible. Des indicateurs aux cordes sont donnés comme paire de pointer/length. Des valeurs numériques sont indiquées pendant qu'elles sont. Des valeurs de commande numérique sont indiquées dans une représentation de détail de protocole.

Ã€ ce point GDB doit effectuer les actions suivantes.

Si des valeurs d'indicateur de paramètre sont indiquées, qui se dirigent aux données requises comme entrée à un appel de système, GDB demande ces données de la cible avec une norme m demande de paquet. Cette communication additionnelle doit être prévue par l'exécution de cible et est manipulée en tant que tout autre m paquet.

GDB traduit toute la valeur de représentation de protocole pour accueillir la représentation comme nécessaire. Datatypes sont contraints dans les types de centre serveur.

GDB appelle l'appel de système

Il contraint alors des datatypes de nouveau à la représentation de protocole.

Si les paramètres d'indicateur dans le paquet de demande se dirigent à l'espace d'amortisseur dans au lequel on s'attend à ce qu'un appel de système copie des données, les données sont transmises à la cible en utilisant a M ou X paquet. Ce paquet doit être prévu par l'exécution de cible et est manipulé en tant que tout autre M ou X paquet.

Par la suite GDB répondent avec des autres F paquet qui contient toute l'information nécessaire pour que la cible continue. Ceci contient au moins

Valeur de retour.

errnosi a été changé par l'appel de système.

drapeau d'"Ctrl-C".

Ensuite après avoir fait la coercition nécessaire de type et de valeur, la cible continue le plus en retard continuent ou font un pas action.

D.7.3 F paquet de demande

F le paquet de demande a le format suivant:

Â

Fcall-identification, paramètre...

appeler-identification est la marque pour indiquer l'appel de système hôte à s'appeler. C'est juste le nom de la fonction. paramètre ... sont les paramètres à l'appel de système.

Les paramètres sont des valeurs hexadécimales de nombre entier, les valeurs réelles en cas de datatypes scalaires, car les indicateurs pour viser l'espace d'amortisseur en cas de datatypes composés et zones de mémoire non spécifiées ou comme pointer/length appareille en cas de paramètres de corde. Ceux-ci sont apposés à l'appeler-identification, chacune séparée de son prédécesseur par une virgule. Toutes les valeurs sont transmises dans la représentation de corde d'cAscii, paires de pointer/length séparées par une estafilade.

D.7.4 F paquet de réponse

F le paquet de réponse a le format suivant:

Â

Fretcode, errno, attachement de détail de flag;call de Ctrl-C

retcode est le code retour de l'appel de système en tant que valeur hexadécimale. errno est l'ensemble d'errno par l'appel, dans la représentation de détail de protocole. Ce paramètre peut être omis si l'appel était réussi. Drapeau de Ctrl-C est envoient seulement si l'utilisateur demandait une coupure. Dans ce cas-ci, errno doit être envoient aussi bien, même si l'appel était réussi. Drapeau de Ctrl-C soi-même comprend le caractère 'C ':

F0,0,c

ou, si l'appel était interupted avant que l'appel d'hôte ait été exécuté:

F-1,4,c

assumer 4 est la représentation spécifique de protocole de EINTR.

Transfert de la mémoire D.7.5

Les données structurées qui sont transférées en utilisant une mémoire lisent ou écrivent en tant que par exemple a statut de struct est prévu pour être dans un format spécifique de protocole avec tous les datatypes scalaires de multibyte étant grand endian. Ceci devrait être fait par la cible avant F le paquet est envoyé à resp. par GDB avant lui transfère la mémoire à la cible. Les indicateurs transférés aux données structurées devraient se diriger aux données à tout moment déjà contraintes.

D.7.6 le message de Ctrl-C

Un cas spécial est, si Drapeau de Ctrl-C est placé dans le paquet de réponse de GDB. Dans ce cas-ci la cible devrait se comporter, comme si elle avait reçu un message de coupure. La signification pour la cible est "appel de système interupted près SIGINT". Consequentially, la cible devrait réellement s'arrêter (comme avec un message de coupure) et retourner à GDB avec a T02 paquet. Dans ce cas-ci, il est important que la cible sache, dans laquelle l'état l'appel de système a été interrompu. Puisque cette action est par conception pas une opération atomique, nous devons différer entre deux cas:

L'appel de système n'a pas été exécuté sur le centre serveur encore.

Le système invitent le centre serveur a été fini.

Ces deux états peuvent être distingués par la cible par la valeur du retourné errno. Si c'est la représentation de protocole de EINTRl'appel de système n'a pas été exécuté. C'est équivalent au EINTR manipulation sur des systèmes de POSIX. Dans n'importe quel autre cas, la cible peut présumer que l'appel de système a été fini -- réussi ou pas -- et devrait se comporter comme si le message de coupure est arrivé bien après que l'appel de système.

GDB doit se comporter fiable. Si l'appel de système ne s'est pas appelé encore, GDB peut envoyer F réponse immédiatement, plaçant EINTR As errno dans le paquet. Si le système invitent le centre serveur a été fini avant que les demandes d'utilisateur une coupure, la pleine action doivent être finshed par GDB. Ceci exige l'envoi M ou X paquets comme ils se sont adaptés. F le paquet peut seulement être envoient quand ou rien ne s'est produit ou la pleine action a été accomplie.

D.7.7 Console I/o

Par défaut et si pas explicitely fermé par le système de cible, les descripteurs de dossier 0, 1 et 2 sont reliés à la console de GDB. la sortiesur la console de GDB est manipulé comme n'importe quelle autre opération de rendement de dossier (write(1, ... ) ou write(2, ... )L'entrée de console est manipulée par GDB de sorte qu'après que la demande lue par cible de la tapez tout suivante du descripteur de dossier 0 soit protégée jusqu'à ce que l'un ou l'autre un des conditions suivantes soit rencontré:

Les pressions d'utilisateur Ctrl-C. Le comportement est comme expliqué ci-dessus, lu l'appel de système est traité comme fini.

Les pressions d'utilisateur Entrez. Ceci est traité comme extrémité d'entrée avec retour à la ligne de remorquage.

Les pressions d'utilisateur Ctrl-D. Ceci est traité comme extrémité d'entrée. Aucun caractère de remorquage, particulièrement aucun Ctrl-D n'est apposé à l'entrée.

Si l'utilisateur a dactylographié plus de caractères comme s'adaptent dans l'amortisseur donné à l'appel lu, les caractères de remorquage sont protégés dans GDB jusqu'à l'un ou l'autre des autres read(0, ... ) est demandé par la cible ou la correction est arrêtée sur la demande d'utilisateurs.

D.7.8 isatty(3) l'appel

Un cas spécial dans ce protocole est l'appel de bibliothèque isatty ce qui est mis en application car c'est propre appel à l'intérieur de de ce protocole. Il renvoie 1 à la cible si le descripteur de dossier donné comme paramètre est fixé à la console de GDB, 0 autrement. Mettre en application par des appels de système exigerait mettre en application ioctl et soyez plus complexe que nécessaire.

D.7.9 system(3) l'appel

L'autre cas spécial dans ce protocole est système appel qui est mis en application car c'est propre appel, aussi. GDB assure la pleine tÃ¢che d'appeler les appels nécessaires d'hôte pour exécuter système appel. La valeur de retour de système est simplifié avant qu'il soit retourné à la cible. Fondamentalement, le seul signal transmis en arrière est EINTR au cas où l'utilisateur serrait Ctrl-C. Autrement la valeur de retour consiste entièrement en statut de sortie de la commande appelée.

En raison des soucis de sécurité, système l'appel est refusé pour s'appeler par GDB par défaut. L'utilisateur doit permettre cet appel explicitement en entrant

`l'extérieur réglé système-appeler-a permis 1'

Neutralisation système l'appel est fait près

`l'extérieur réglé système-appeler-a permis 0'

L'arrangement de courant est montré par la tapez

`montrez l'extérieur système-appeler-permis'

Liste D.7.10 d'appels soutenus

la fin ouverte lue écrivent le lseek retitrent détachent stat/fstat système isatty gettimeofday

ouvert

Â

Synthèse: char interne d'open(const * nom, drapeaux internes); char interne d'open(const * nom, drapeaux internes, mode de mode_t); Demande: Fopen, pathptr/len, drapeaux, mode

drapeaux est au niveau du bit ou des valeurs suivantes:

O_creat

Si le dossier n'existe pas il sera créé. Les règles de centre serveur s'appliquent en ce qui concerne des timbres de propriété et de temps de dossier.

O_excl

Une fois utilisé avec O_creat, si le dossier existe déjà c'est une erreur et l'open() échoue.

O_trunc

Si le dossier existe déjà et le mode ouvert laisse l'écrire (O_rdwr ou O_wronly est donné) sera tronqué à la longueur 0.

O_append

Le dossier est ouvert dedans apposent le mode.

O_rdonly

Le dossier est ouvert pour lire seulement.

O_wronly

Le dossier est ouvert pour écrire seulement.

O_rdwr

Le dossier est ouvert pour la lecture et l'écriture.

Peu est silencieusement ignoré.

mode est au niveau du bit ou des valeurs suivantes:

S_irusr

L'utilisateur a lu la permission.

S_iwusr

L'utilisateur a pour écrire la permission.

S_irgrp

Le groupe a lu la permission.

S_iwgrp

Le groupe a pour écrire la permission.

S_iroth

D'autres ont lu la permission.

S_iwoth

D'autres ont pour écrire la permission.

Peu est silencieusement ignoré.

Â

Valeur de retour: ouvrez les retours le nouveau descripteur de dossier ou -1 si une erreur se produisait. Erreurs:

EEXIST

le nom existe déjà et O_creat et O_excl ont été employés.

EISDIR

le nom se rapporte à un annuaire.

EACCES

On ne permet pas l'accès demandé.

ENAMETOOLONG

le nom était trop long.

ENOENT

Un composant d'annuaire dans le nom n'existe pas.

ENODEV

le nom se rapporte à un device, pipe, appelée pipe ou douille.

EROFS

le nom se rapporte à un dossier sur un filesystem inaltérable et écrit l'accès a été demandé.

EFAULT

le nom est une valeur d'indicateur inadmissible.

ENOSPC

Aucun espace sur le device pour créer le dossier.

EMFILE

Le processus a déjà le nombre maximum des dossiers ouverts.

ENFILE

La limite sur tout le nombre de dossiers ouverts sur le système a été atteinte.

EINTR

L'appel a été interrompu par l'utilisateur.

fin

Â

Synthèse: close(int interne FD); Demande: Fclose, valeur de retour de FD: la fin renvoie zéro sur le succès, ou -1 si une erreur se produisait. Erreurs:

EBADF

FD n'est pas un descripteur de dossier ouvert valide.

EINTR

L'appel a été interrompu par l'utilisateur.

lu

Â

Synthèse: read(int interne FD, vide * buf, compte interne non signé); Demande: Fread, FD, bufptr, valeur de retour de compte: Sur le succès, le nombre de bytes lus est retourné. Zéro indique l'extrémité du dossier. Si le compte est zéro, lisez les retours zéro aussi bien. Sur l'erreur, -1 est retourné. Erreurs:

EBADF

FD n'est pas un descripteur de dossier valide ou n'est pas ouvert pour la lecture.

EFAULT

le buf est une valeur d'indicateur inadmissible.

EINTR

L'appel a été interrompu par l'utilisateur.

écrivez

Â

Synthèse: write(int interne FD, const vide * buf, compte interne non signé); Demande: Fwrite, FD, bufptr, valeur de retour de compte: Sur le succès, le nombre de bytes écrits sont retournés. Zéro indique que rien n'a été écrit. Sur l'erreur, -1 est retourné. Erreurs:

EBADF

FD n'est pas un descripteur de dossier valide ou n'est pas ouvert pour l'écriture.

EFAULT

le buf est une valeur d'indicateur inadmissible.

EFBIG

Une tentative a été faite d'écrire un dossier qui excède le volume de fichier maximum spécifique de centre serveur permis.

ENOSPC

Aucun espace sur le device pour écrire les données.

EINTR

L'appel a été interrompu par l'utilisateur.

lseek

Â

Synthèse: long lseek (FD interne, a longtemps excentré, drapeau interne); Demande: Flseek, FD, excentrage, drapeau

drapeau est un de:

SEEK_set

L'excentrage est placé pour excentrer des bytes.

SEEK_cur

L'excentrage est placé à son endroit courant plus des bytes excentrés.

SEEK_end

L'excentrage est placé à la taille du dossier plus des bytes excentrés.

Â

Valeur de retour: Sur le succès, l'excentrage non signé résultant dans les bytes du commencement du dossier est retourné. Autrement, une valeur de -1 est retournée. Erreurs:

EBADF

FD n'est pas un descripteur de dossier ouvert valide.

ESPIPE

FD est associé à la console de GDB.

EINVAL

le drapeau n'est pas une valeur appropriée.

EINTR

L'appel a été interrompu par l'utilisateur.

retitrez

Â

Synthèse: char interne de rename(const * oldpath, char de const * newpath); Demande: Frename, oldpathptr/len, valeur de retour de newpathptr/len:

Sur le succès, zéro est retourné. Sur l'erreur, -1 est retourné. Erreurs:

EISDIR

le newpath est un annuaire existant, mais l'oldpath n'est pas un annuaire.

EEXIST

le newpath est un annuaire non vide.

EBUSY

l'oldpath ou le newpath est un annuaire qui est en service par un certain processus.

EINVAL

Une tentative a été faite de faire à un annuaire un sous-répertoire de elle-même.

ENOTDIR

Un composant utilisé comme annuaire dans l'oldpath ou le nouveau chemin n'est pas un annuaire. Ou l'oldpath est un annuaire et le newpath existe mais n'est pas un annuaire.

EFAULT

l'oldpathptr ou le newpathptr sont des valeurs d'indicateur inadmissibles.

EACCES

Aucun accès au dossier ou au chemin du dossier.

ENAMETOOLONG

l'oldpath ou le newpath était trop long.

ENOENT

Un composant d'annuaire dans l'oldpath ou le newpath n'existe pas.

EROFS

Le dossier est sur un filesystem inaltérable.

ENOSPC

Le device contenant le dossier n'a aucune pièce pour la nouvelle entrée de répertoire.

EINTR

L'appel a été interrompu par l'utilisateur.

détachez

Â

Synthèse: char interne d'unlink(const * nom); Demande: Funlink, valeur de retour de pathnameptr/len: Sur le succès, zéro est retourné. Sur l'erreur, -1 est retourné. Erreurs:

EACCES

Aucun accès au dossier ou au chemin du dossier.

EPERM

Le système ne permet pas le détachement des annuaires.

EBUSY

Le nom de dossier ne peut pas être détaché parce qu'il est employé par un autre processus.

EFAULT

le pathnameptr est une valeur d'indicateur inadmissible.

ENAMETOOLONG

le nom était trop long.

ENOENT

Un composant d'annuaire dans le nom n'existe pas.

ENOTDIR

Un composant du chemin n'est pas un annuaire.

EROFS

Le dossier est sur un filesystem inaltérable.

EINTR

L'appel a été interrompu par l'utilisateur.

stat/fstat

Â

Synthèse: char interne de stat(const * nom, statut de struct * buf); fstat(int interne FD, statut de struct * buf); Demande: Fstat, pathnameptr/len, bufptr Ffstat, FD, valeur de retour de bufptr: Sur le succès, zéro est retourné. Sur l'erreur, -1 est retourné. Erreurs:

EBADF

FD n'est pas un dossier ouvert valide.

ENOENT

Un composant d'annuaire dans le nom n'existe pas ou le chemin est une corde vide.

ENOTDIR

Un composant du chemin n'est pas un annuaire.

EFAULT

le pathnameptr est une valeur d'indicateur inadmissible.

EACCES

Aucun accès au dossier ou au chemin du dossier.

ENAMETOOLONG

le nom était trop long.

EINTR

L'appel a été interrompu par l'utilisateur.

gettimeofday

Â

Synthèse: tz timeval de gettimeofday(struct interne * TV, vide *); Demande: Fgettimeofday, tvptr, valeur de retour de tzptr: Sur le succès, 0 est retourné, -1 autrement. Erreurs:

EINVAL

le tz est un indicateur non nul.

EFAULT

le tvptr et/ou le tzptr est une valeur d'indicateur inadmissible.

isatty

Â

Synthèse: isatty(int interne FD); Demande: Fisatty, valeur de retour de FD: Renvoie 1 si FD se rapporte à la console de GDB, 0 autrement. Erreurs:

EINTR

L'appel a été interrompu par l'utilisateur.

système

Â

Synthèse: char interne de system(const * commande); Demande: Fsystem, valeur de retour de commandptr/len: La valeur retournée est -1 sur l'erreur et le statut de retour de la commande autrement. Seulement le statut de sortie de la commande est retourné, qui est extraite à partir de la valeur de retour de système hôte en appelant WEXITSTATUS(retval). Au cas où/bin/sh ne pourrait pas être exécuté, 127 est retournés. Erreurs:

EINTR

L'appel a été interrompu par l'utilisateur.

Représentation spécifique du protocole D.7.11 des datatypes

Struct intégral de statut de struct de valeurs d'indicateur de datatypes timeval

Datatypes intégraux

Les datatypes intégraux utilisés dans les appels de système sont

Â

long interne, long, non signé interne et non signé, mode_t et time_t

Interne interne non signé mode_t et time_t sont mis en application en tant que 32 valeurs de bit dans ce protocole.

Longtemps et long non signé sont mis en application en tant que 64 types de bit. Voir les limites de section , pour la correspondance MINIMUM et les valeurs MAXIMUM (semblables à ceux dans ` limits.h ') pour permettre la gamme vérifiant le centre serveur et la cible.

time_t des datatypes sont définis comme secondes depuis l'époque.

Tous les datatypes intégraux transférés en tant qu'élément d'une mémoire lisent ou écrivent d'un datatype structuré par exemple a statut de struct doivent être donnés dans le grand ordre endian de byte.

Valeurs d'indicateur

Des indicateurs pour viser des données sont transmis pendant qu'ils sont. Une exception est faite pour des indicateurs aux amortisseurs pour lesquels la longueur n'est pas transmise en tant qu'élément de l'appel de fonction, à savoir des cordes. Des cordes sont transmises comme une paire de pointer/length, toutes les deux comme valeurs de sortilège, par exemple.

Â

1aaf/12

ce qui est un indicateur aux données des bytes de la longueur 18 à la position 0x1aaf. La longueur est définie comme pleine longueur de corde dans les bytes, y compris le byte nul de remorquage. Exemple:

Â

`` bonjour, ''du monde à l'adresse 0x123456

est transmis As

Â

123456/d

statut de struct

L'amortisseur du statut de struct de type employé par la cible et le GDB est défini comme suit:

Â

statut de struct { st_dev interne non signé; device */st_ino interne non signé; noeud d'index */st_mode de mode_t; protection */st_nlink interne non signé; nombre de liens durs */st_uid interne non signé; identification de l'utilisateur de propriétaire */st_gid interne non signé; qualificateur de fichier de propriétaire */st_rdev interne non signé; type de device (si device de noeud d'index) */long non signé st_size; montez-vous à la taille, dans les bytes */long non signé st_blksize; blocksize pour le filesystem I/o */longs st_blocks non signés; le nombre de blocs a assigné */

st_atime de time_t; période du dernier accès */st_mtime de time_t; période de dernière modification */st_ctime de time_t; période de dernier * de changement/ };

Les datatypes intégraux sont conformément aux définitions données dans la section d'approriate (voient les datatypes intégraux , parce que les détails) ainsi cette structure est des bytes de la taille 64.

Les valeurs de plusieurs champs ont une signification et/ou une gamme restreintes des valeurs.

Â

st_dev: 0 st_ino de console du dossier 1: Aucune signification valide pour la cible. Transmis sans changement. st_mode: Le peu valide de mode est décrit dans l'annexe C. N'importe quel autre peu n'a actuellement aucune signification pour la cible. st_uid: Aucune signification valide pour la cible. Transmis sans changement. st_gid: Aucune signification valide pour la cible. Transmis sans changement. st_rdev: Aucune signification valide pour la cible. Transmis sans changement. st_atime, st_mtime, st_ctime: Ces valeurs ont une exactitude d'hôte et de personne à charge de système de fichiers. Particulièrement sur Windows accueille les systèmes de fichiers ne soutiennent pas des valeurs exactes de synchronisation.

La cible obtient un statut de struct de la représentation ci-dessus et est responsable pour la contraindre à la représentation de cible avant de continuer.

Notez qu'en raison des différences de taille entre le centre serveur et la représentation de cible des membres de statut, ces membres pourraient par la suite obtenir tronqués sur la cible.

struct timeval

L'amortisseur de timeval de struct de type employé par la cible et le GDB est défini comme suit:

Â

struct timeval { tv_sec de time_t; en second lieu */longtemps tv_usec; * de micro-seconde/ };

Les datatypes intégraux sont conformément aux définitions données dans la section d'approriate (voient les datatypes intégraux , parce que les détails) ainsi cette structure est des bytes de la taille 8.

Constantes D.7.12

Les valeurs suivantes sont employées pour les constantes à l'intérieur de du protocole. GDB et cible sont resposible pour traduire ces valeurs before.and.after l'appel comme nécessaire.

Ouvrez les limites de drapeaux de Lseek de valeurs d'Errno de valeurs de mode_t de drapeaux

Ouvrez les drapeaux

Toutes les valeurs sont indiquées dans la représentation hexadécimale.

Â

O_rdonly 0X0 O_wronly 0X1 O_rdwr 0X2 O_append 0X8 O_creat 0X200 O_trunc 0X400 O_excl 0X800

valeurs de mode_t

Toutes les valeurs sont indiquées dans la représentation octale.

Â

S_ifreg 0100000 S_ifdir 040000 S_irusr 0400 S_iwusr 0200 S_ixusr 0100 S_irgrp 040 S_iwgrp 020 S_ixgrp 010 S_iroth 04 S_iwoth 02 S_ixoth 01

Valeurs d'Errno

Toutes les valeurs sont indiquées dans la représentation décimale.

Â

EPERM 1 ENOENT 2 EINTR 4 EBADF 9 EACCES 13 EFAULT 14 EBUSY 16 EEXIST 17 ENODEV 19 ENOTDIR 20 EISDIR 21 EINVAL 22 ENFILE 23 EMFILE 24 EFBIG 27 ENOSPC 28 ESPIPE 29 EROFS 30 ENAMETOOLONG 91 EUNKNOWN 9999

EUNKNOWN est employé comme valeur d'erreur de chute si un système hôte renvoie n'importe quelle valeur d'erreur pas dans la liste de nombres soutenus d'erreur.

Drapeaux de Lseek

Â

SEEK_set 0 SEEK_cur 1 SEEK_end 2

Limites

Toutes les valeurs sont indiquées dans la représentation décimale.

Â

INT_min -2147483648 INT_max 2147483647 UINT_max 4294967295 LONG_min -9223372036854775808 LONG_max 9223372036854775807 ULONG_max 18446744073709551615

Exemples De D.7.13 File-I/O

L'ordre d'exemple d'un appel d'inscription, le descripteur de dossier 3, amortisseur est à l'adresse 0x1234 de cible, 6 bytes devrait être écrit:

Â

< - Fwrite, 3, 1234, mémoire de 6 demandes a lu de la cible - > m1234,6 < - retour XXXXXX "6 bytes écrits" - > F6

L'ordre d'exemple d'un appel lu, le descripteur de dossier 3, amortisseur est à l'adresse 0x1234 de cible, 6 bytes devrait être lu:

Â

< - Fread, 3, 1234, mémoire de 6 demandes écrivent à la cible - > retour de X1234,6:xxxxxx "6 bytes lus" - > F6

L'ordre d'exemple d'un appel lu, appel échoue sur le centre serveur dû au descripteur de dossier inadmissible (EBADF):

Â

< - Fread, 3, 1234, 6 - > F-1,9

L'ordre d'exemple d'un appel lu, utilisateur serre Ctrl-C avant que le syscall sur le centre serveur s'appelle:

Â

< - Fread, 3, 1234, 6 - > F-1,4,c < - T02

L'ordre d'exemple d'un appel lu, utilisateur serre Ctrl-C après que le syscall sur le centre serveur s'appelle:

Â

< - Fread, 3, 1234, 6 - > X1234,6:xxxxxx < - T02

E. Le Mécanisme D'Expression D'Agent de GDB

Dans quelques applications, il n'est pas feasable pour que le programme de mise au point interrompe l'exécution du programme assez longtemps pour que le réalisateur apprenne n'importe quoi utile au sujet de son comportement. Si l'exactitude du programme dépend de son comportement en temps réel, retarde présenté par un programme de mise au point pourrait faire échouer le programme, même lorsque le code lui-même est correct. Il est utile de pouvoir observer le comportement du programme sans l'interrompre.

Employer GDB trace et rassemblez les commandes, l'utilisateur peuvent indiquer des endroits dans le programme, et des expressions arbitraires pour évaluer quand ces endroits sont atteints. Plus tard, employer tfind commandez, elle peut examiner les valeurs que ces expressions ont eu quand le programme a frappé les points de trace. Les expressions peuvent également dénoter des objets dans la mémoire -- des structures ou des rangées, par exemple -- dont les valeurs GDB devrait enregistrer; tout en visitant un tracepoint particulier, l'utilisateur peut inspecter objets comme si ils étaient dans la mémoire à ce moment. Cependant, parce que GDB enregistre ces valeurs sans agir l'un sur l'autre avec l'utilisateur, il peut faire tellement rapidement et discrètement, ne dérangeant si tout va bien pas le comportement du programme.

Quand GDB corrige une cible à distance, le code d'agent de GDB fonctionnant sur la cible calcule les valeurs des expressions elle-même. Pour éviter d'avoir un plein expert symbolique d'expression sur l'agent, GDB traduit des expressions dans la langue source en langue plus simple de bytecode, et puis envoie le bytecode à l'agent; l'agent exécute alors le bytecode, et enregistre les valeurs pour que GDB recherche plus tard.

La langue de bytecode est simple; il y a des opcodes quarante-impairs, dont la majeure partie sont le vocabulaire habituel des opérandes de C (addition, soustraction, décalages, et ainsi de suite) et de diverses tailles des shells et des opérations de référence de mémoire. L'interprète de bytecode opère strictement sur les valeurs de machine-niveau -- diverses tailles des nombres entiers et des nombres de virgule flottante -- et n'a besoin d'aucune information sur des types ou des symboles; ainsi, les structures de données internes de l'interprète sont simples, et chaque bytecode exige seulement quelques instructions de machine indigènes de les mettre en application. L'interprète est petit, et il est facile déterminer des limites strictes la mémoire et le temps requis pour évaluer une expression, la rendant appropriée à l'usage de l'agent de correction dans des applications en temps réel.

E.1 le Général Bytecode Design Overview de l'interprète. Descriptions d'E.2 Bytecode ce que chacun . E.3 en utilisant des expressions d'agent comment expressions d'agent adaptées dans la grande image. Possibilités variables de la cible E.4 comment découvrir ce que la cible peut faire. E.5 traçant sur l'information spéciale de Symmetrix pour l'exécution sur les boîtes d'EMC. Raisonnement E.6 pourquoi nous l'avons fait de cette façon.

E.1 Le Général Bytecode Design

L'agent représente des expressions de bytecode comme choix de bytes. Chaque instruction est un byte longtemps (ainsi le bytecode de limite ). Quelques instructions sont suivies des bytes d'opérande; par exemple, goto l'instruction est suivie d'une destination pour le saut.

L'interprète de bytecode est une machine empiler-basée; la plupart des instructions sautent leurs opérandes outre de la pile, effectuent une certaine opération, et repoussent le résultat sur la pile pour que la prochaine instruction consomme. Chaque élément de la pile peut contenir un nombre entier ou une valeur de virgule flottante; ces valeurs sont autant de peu au loin comme plus grand nombre entier qui peut être directement manoeuvré dans la langue source. Les éléments de pile ne portent aucun disque de leur type; le bytecode a pu pousser une valeur comme nombre entier, puis le saute comme valeur de virgule flottante. Cependant, GDB ne produira pas du code qui fait ceci. En C, on pourrait définir le type d'un élément de pile comme suit:

union agent_val { le PLUS LONG l; DOUBLEST d; };

là où LE PLUS LONGTEMPS et DOUBLEST soyez typedef noms pour plus grand les types de nombre entier et de virgule flottante sur la machine.

Avant que l'interprète de bytecode atteigne la fin de l'expression, la valeur de l'expression devrait être la seule valeur à gauche sur la pile. Pour des applications traçantes, trace les bytecodes dans l'expression auront enregistré les données nécessaires, et la valeur sur la pile peut être jetée. Pour d'autres applications, comme des breaks conditionnels, la valeur peut être utile.

Séparé de la pile, l'interprète a deux registres:

PC

L'adresse du prochain bytecode à exécuter.

début

L'adresse du début de l'expression de bytecode, nécessaire pour interpréter goto et if_goto instructions.

Ni l'un ni l'autre de ces registres n'est directement évident à la langue de bytecode elle-même, mais elles sont utiles pour définir les significations des opérations de bytecode.

Il n'y a aucune instruction d'exécuter des effets secondaires dessus

le programme courant, ou appellent les fonctions du programme; nous supposons que ces expressions sont seulement employées pour la correction discrète, pas pour raccorder le code courant.

La plupart des instructions de bytecode ne distinguent pas les diverses tailles des valeurs, et opèrent des valeurs de grande largeur; le peu supérieur des valeurs est simplement ignoré, puisqu'ils ne font pas habituellement une différence à la valeur calculée. Les exceptions à cette règle sont:

instructions de référence de mémoire (référencen

Il y a des instructions distinctes de chercher différentes tailles de mot de mémoire. Une fois sur la pile, cependant, les valeurs sont traitées en tant que nombres entiers normaux. Elles peuvent devoir être signe-prolongées; ext. l'instruction existe à cette fin.

l'instruction de signe-prolongation (ext. n

Ceux-ci doivent clairement connaître quelle partie de leur opérande doit être prolongée pour occuper la pleine longueur du mot.

Si l'interprète ne peut pas évaluer une expression complètement pour quelque raison (un endroit de mémoire est inaccessible, ou un diviseur est zéro, par exemple), nous disons que l'interprétation "se termine avec une erreur". Ceci signifie que le problème est fait un rapport au visiteur de l'interprète d'une certaine manière utile. En général, le code en utilisant l'agent que les expressions devraient supposer qu'elles peuvent essayer de se diviser par zéro, cherchent les endroits de mémoire arbitraires, et le misbehave d'autres manières.

Même les expressions compliquées de C compilent à quelques instructions de bytecode; par exemple, l'expression X + y * z produirait typiquement le code comme le suivant, assumant cela X et y vivez dans des registres, et z est une variable globale tenant un de 32 bits interne

l'adresse const32 du repérage 2 du repérage 1 du mul de l'ext. 32 de z ref32 ajoutent l'extrémité

En détail, ceux-ci signifient:

repérage 1

Poussez la valeur du registre 1 (se tenant vraisemblablement Xsur la pile.

repérage 2

Poussez la valeur du registre 2 (se tenant y

adresse const32 de z

Poussez l'adresse de z sur la pile.

ref32

Cherchez un mot de 32 bits de l'adresse au dessus de la pile; remplacez l'adresse sur la pile par la valeur. Ainsi, nous remplaçons l'adresse de z avec z'valeur de s.

ext. 32

Signe-prolongez la valeur sur le dessus de la pile de 32 bits à la pleine longueur. C'est nécessaire parce que z est un nombre entier signé.

mul

Sautez les deux nombres principaux sur la pile, multipliez-les, et poussez leur produit. Maintenant le dessus de la pile contient la valeur de l'expression y * z.

ajoutez

Sautez les deux nombres principaux, ajoutez-les, et poussez la somme. Maintenant le dessus de la pile contient la valeur de X + y * z.

extrémité

Cessez l'exécution; la valeur laissée sur le dessus de pile est la valeur à enregistrer.

Descriptions D'E.2 Bytecode

Chaque description de bytecode a la forme suivante:

ajoutez (0x02): a b = > a+b

Sautez les deux articles principaux de pile, a et bcomme nombres entiers; poussez leur somme, comme nombre entier.

Dans cet exemple, ajoutez est le nom du bytecode, et (0x02) est la valeur d'un-byte employée pour coder le bytecode, dans hexidecimal. L'expression "a b = > a+b"montre que la pile before.and.after que le bytecode s'exécute. Ã€ l'avance, la pile doit contenir au moins deux valeurs, a et bpuisque le dessus de la pile est vers la droite, b est sur le dessus de la pile, et a est sous lui. Après exécution, le bytecode aura sauté a et b de la pile, et remplacé leur par une valeur simple, a+b. Il peut y avoir d'autres valeurs sur la pile au-dessous de ceux montrés, mais le bytecode affecte seulement ceux montrés.

Voici un autre exemple:

const8 (0x22) n= > n

Poussez la constante de nombre entier de 8 bits n sur la pile, sans prolongation de signe.

Dans cet exemple, le bytecode const8 prend un opérande n directement du jet de bytecode; l'opérande suit const8 bytecode lui-même. Nous écrivons des tels opérandes juste après le nom du bytecode, avant les deux points, et décrivons le codage exact de l'opérande dans le jet de bytecode dans le corps de la description de bytecode.

Pour const8 le bytecode, là ne sont aucun article de pile donné avant que = >; ceci simplement des moyens que le bytecode ne consomme aucune valeur de la pile. Si un bytecode ne consomme aucune valeur, ou ne produit aucune valeur, la liste de chaque côté de = > peut être vide.

Si une valeur est écrite As a bou nalors le bytecode le traite comme nombre entier. Si une valeur est écrite est addralors le bytecode le traite comme adresse.

Nous ne décrivons pas entièrement les opérations de virgule flottante ici; bien que cette conception puisse être sortie d'une manière propre de manipuler des valeurs de virgule flottante, elles ne sont pas d'intérêt immédiat au client, ainsi nous évitons de les décrire, pour sauver le temps.

flotteur (0x01): = >

Préfixe pour les bytecodes à point mobile. Non mis en application encore.

ajoutez (0x02): a b = > a+b

Sautez deux nombres entiers de la pile, et poussez leur somme, comme nombre entier.

sous-marin (0x03): a b = > ab

Sautez deux nombres entiers de la pile, soustrayez la valeur supérieure de la valeur de prochain-à-dessus, et poussez la différence.

mul (0x04): a b = > a*b

Sautez deux nombres entiers de la pile, multipliez-les, et poussez le produit sur la pile. Notez cela, quand on multiplie deux n- nombres de bits rapportant des autres n- nombre de bits, il est non pertinent, que les nombres soient signés ou pas; les résultats sont identiques.

div_signed (0x05): a b = > a/b

Nombres entiers signés du bruit deux de la pile; divisez la valeur de prochain-à-dessus par la valeur supérieure, et poussez le quotient. Si le diviseur est zéro, terminez avec une erreur.

div_unsigned (0x06): a b = > a/b

Nombres entiers non signés du bruit deux de la pile; divisez la valeur de prochain-à-dessus par la valeur supérieure, et poussez le quotient. Si le diviseur est zéro, terminez avec une erreur.

rem_signed (0x07): a b = > un modulo b

Nombres entiers signés du bruit deux de la pile; divisez la valeur de prochain-à-dessus par la valeur supérieure, et poussez le reste. Si le diviseur est zéro, terminez avec une erreur.

rem_unsigned (0x08): a b = > un modulo b

Nombres entiers non signés du bruit deux de la pile; divisez la valeur de prochain-à-dessus par la valeur supérieure, et poussez le reste. Si le diviseur est zéro, terminez avec une erreur.

lsh (0x09): a b = > a<<b

Bruit deux nombres entiers de la pile; laissé a soyez la valeur de prochain-à-dessus, et b soyez la valeur supérieure. Décalez a gauche près b le peu, et pousse le résultat.

rsh_signed (0x0a): a b = > (signé)a>>b

Bruit deux nombres entiers de la pile; laissé a soyez la valeur de prochain-à-dessus, et b soyez la valeur supérieure. Décalez a redressez près b le peu, insérant des copies du peu supérieur à l'extrémité élevée, et pousse le résultat.

rsh_unsigned (0x0b): a b = > a>>b

Bruit deux nombres entiers de la pile; laissé a soyez la valeur de prochain-à-dessus, et b soyez la valeur supérieure. Décalez a redressez près b le peu, insérant le peu zéro à l'extrémité élevée, et pousse le résultat.

log_not (0x0e): a = > !a

Sautez un nombre entier de la pile; si elle est zéro, poussez la valeur une; autrement, poussez la valeur zéro.

bit_and (0x0f): a b = > a&b

Sautez deux nombres entiers de la pile, et poussez le leur au niveau du bit et.

bit_or (0x10): a b = > a|b

Sautez deux nombres entiers de la pile, et poussez le leur au niveau du bit ou.

bit_xor (0x11): a b = > a^b

Sautez deux nombres entiers de la pile, et poussez leur au niveau du bit exclusive-ou.

bit_not (0x12): a = > ~a

Sautez un nombre entier de la pile, et poussez le son complètent au niveau du bit.

égale (0x13): a b = > a=b

Bruit deux nombres entiers de la pile; s'ils sont égaux, poussez la valeur une; autrement, poussez la valeur zéro.

less_signed (0x14): a b = > a<b

Nombres entiers signés du bruit deux de la pile; si la valeur de prochain-à-dessus est moins que la valeur supérieure, poussez la valeur une; autrement, poussez la valeur zéro.

less_unsigned (0x15): a b = > a<b

Nombres entiers non signés du bruit deux de la pile; si la valeur de prochain-à-dessus est moins que la valeur supérieure, poussez la valeur une; autrement, poussez la valeur zéro.

ext. (0x16) n a = > asigne-prolongé de n peu

Sautez une valeur non signée de la pile; traitement d'elle en tant que n- la valeur de deux-complément de peu, le prolongent à la pleine longueur. Ceci signifie que tout le peu à la gauche du peu n-1 (où le moindre peu significatif est mordu 0) sont placés à la valeur du peu n-1. Notez cela n peut être plus grande qu'ou l'égale à la largeur des éléments de pile du moteur de bytecode; dans ce cas-ci, le bytecode ne devrait avoir aucun effet.

Le nombre de peu de source à préserver, nest codé en tant que suivre simple de nombre entier non signé de byte ext. bytecode.

zero_ext (0xà) n a = > azéro-prolongé de n peu

Sautez une valeur non signée de la pile; mettez tout sauf le fond n peu. Ceci signifie que tout le peu à la gauche de

peu n-1 (où le moindre peu significatif est mordu 0) sont placés à la valeur du peu n-1.

Le nombre de peu de source à préserver, nest codé en tant que suivre simple de nombre entier non signé de byte zero_ext bytecode.

ref8 (0x17): addr = > a

ref16 (0x18): addr = > a

ref32 (0x19): addr = > a

ref64 (0x1a): addr = > a

Sautez une adresse addr de la pile. Pour le bytecode référencencherchez n- valeur de peu de addren utilisant l'endianness normal de cible. Poussez la valeur cherchée comme nombre entier non signé.

Notez cela addr ne peut pas n'être aligné d'aucune manière particulière; référencen les bytecodes devraient fonctionner correctement pour n'importe quelle adresse.

Si essayant d'accéder à la mémoire à addr causerait une exception de processeur d'une certaine sorte, se terminent avec une erreur.

ref_float (0x1b): addr = > d

ref_double (0xç): addr = > d

ref_long_double (0x1d): addr = > d

l_to_d (0x1e): a = > d

d_to_l (0x1f): d = > a

Non mis en application encore.

duplication (0x28): a = > a a

Poussez une autre copie de l'élément supérieur de la pile.

échange (0x2b): a b = > b a

Echangez les deux articles principaux sur la pile.

bruit (0x29): a = >

Jetez la valeur supérieure sur la pile.

if_goto (0x20) excentrage a = >

Sautez un nombre entier outre de la pile; si elle est différente de zéro, embranchez-vous à l'excentrage donné dans la corde de bytecode. Autrement, continuez à la prochaine instruction dans le jet de bytecode. En d'autres termes, si a est différent de zéro, place PC registre à début + excentrage. Ainsi, un excentrage de zéro dénote le commencement de l'expression.

excentrage est stocké comme valeur non signée de seize-peu, stockée juste après if_goto bytecode. C'est toujours stocké la plupart de byte significatif d'abord, indépendamment de l'endianness normal de la cible. L'excentrage n'est pas garanti pour ne tomber à aucun alignement particulier dans le jet de bytecode; ainsi, sur des machines où chercher un de 16 bits sur une adresse unaligned soulève une exception, vous devriez chercher l'un byte excentré à la fois.

goto (0x21) excentrage= >

Branche sans réserve à excentrageen d'autres termes, placez PC registre à début + excentrage.

L'excentrage est stocké comme pour if_goto bytecode.

const8 (0x22) n= > n

const16 (0x23) n= > n

const32 (0x24) n= > n

const64 (0x25) n= > n

Poussez la constante de nombre entier n sur la pile, sans prolongation de signe. Pour produire une petite valeur négative, poussez une petite valeur de deux-complément, et puis signe-prolongez-l'employer ext. bytecode.

La constante n est dans le nombre approprié de bytes suivre stocké constb bytecode. La constante n est toujours stocké la plupart de byte significatif d'abord, indépendamment de l'endianness normal de la cible. La constante n'est pas garantie pour ne tomber à aucun alignement particulier dans le jet de bytecode; ainsi, sur des machines où chercher un de 16 bits sur une adresse unaligned soulève une exception, vous devriez chercher n un byte à la fois.

repérage (0x26) n= > a

Poussez la valeur du nombre de registre nsans prolongation de signe. Les registres sont numérotés après les conventions de GDB.

Le nombre de registre n est codé comme nombre entier non signé de 16 bits juste après repérage bytecode. C'est toujours stocké la plupart de byte significatif d'abord, indépendamment de l'endianness normal de la cible. Le nombre de registre n'est pas garanti pour ne tomber à aucun alignement particulier dans le jet de bytecode; ainsi, sur des machines où chercher un de 16 bits sur une adresse unaligned soulève une exception, vous devriez chercher au numéro de registre un byte à la fois.

trace (0x0c): addr taille = >

Enregistrez le contenu du taille bytes à addr dans un amortisseur de trace, pour la récupération postérieure par GDB.

trace_quick (0x0d) taille addr = > addr

Enregistrez le contenu du taille bytes à addr dans un amortisseur de trace, pour la récupération postérieure par GDB. taille est ce qui suit simple de nombre entier non signé de byte trace opcode.

Ce bytecode est équivalent à l'ordre duplication const8 taille tracemais nous la fournissons de toute façon à l'espace dans des cordes de bytecode.

trace16 (0x30) taille addr = > addr

Identique au trace_quick, sauf que taille est un grand-endian nombre entier non signé de 16 bits, pas un byte simple. Ceci devrait avoir été appelé probablement trace_quick16pour l'uniformité.

extrémité (0x27): = >

Cessez d'exécuter le bytecode; le résultat devrait être l'élément supérieur de la pile. Si le but de l'expression était de calculer un lvalue ou une gamme de mémoire, alors le prochain-à-dessus de la pile est l'adresse des lvalue, et le dessus de la pile est la taille des lvalue, dans les bytes.

E.3 En utilisant Des Expressions D'Agent

Voici un croquis d'un plein cycle direct de correction, montrant comment des expressions d'agent adaptées dans le processus.

L'utilisateur choisit des points de trace dans le code du programme auquel GDB devrait rassembler des données.

L'utilisateur indique des expressions pour évaluer à chaque point de trace. Ces expressions peuvent dénoter des objets dans la mémoire, dans ce cas le contenu de ces objets est enregistré pendant que le programme fonctionne, ou des valeurs calculées, dans ce cas les valeurs elles-mêmes sont enregistrées.

GDB transmet les tracepoints et leurs expressions associées à l'agent de GDB, fonctionnant sur la cible de correction.

L'agent se charge d'être annoncé quand un point de trace est frappé. Notez que, sur quelques systèmes, le logiciel d'exploitation de cible est complètement responsable de rassembler les données; voir l'E.5 tracer sur Symmetrix .

Quand l'exécution sur la cible atteint un point de trace, l'agent évalue les expressions liées à ce point de trace, et enregistre les valeurs et les gammes résultantes de mémoire.

Plus tard, quand l'utilisateur choisit un événement donné de trace et inspecte les objets et les valeurs d'expression enregistrés, GDB parle à l'agent pour rechercher a enregistré des données selon les besoins pour répondre aux demandes d'utilisateur. Si l'utilisateur demande à voir un objet dont le contenu n'a pas été enregistré, GDB rapporte une erreur.

Possibilités Variables De la Cible E.4

Quelques cibles ne soutiennent pas à point mobile, et certains ne devraient plutôt pas traiter longtemps longtemps opérations. En outre, les différentes cibles auront différentes tailles de pile, et différentes longueurs d'amortisseur de bytecode.

Ainsi, GDB a besoin d'une manière de demander la cible sur lui-même. Nous n'avons pas établi les détails encore, mais en général, GDB devrait pouvoir envoyer à la cible un paquet le demandant pour se décrire. La réponse devrait être un paquet dont la longueur est explicite, ainsi nous pouvons ajouter la nouvelle information au paquet dans de futures révisions de l'agent, sans confondre de vieilles versions de GDB, et il devrait contenir un nombre de version. Il devrait contenir au moins l'information suivante:

si la virgule flottante est soutenue

si longtemps longtemps est soutenu

taille acceptable maximum de pile de bytecode

longueur acceptable maximum des expressions de bytecode

quels registres sont réellement disponibles pour la collection

si la cible soutient les tracepoints handicapés

E.5 traçant sur Symmetrix

Cette section documente l'api employé par l'agent de GDB pour rassembler des données sur des systèmes de Symmetrix.

Cygnus a à l'origine mis en application ces derniers les devices traçants pour aider EMC Corporation à corriger leurs unités de disques de haut-disponibilité de Symmetrix. Le code d'application de Symmetrix inclut déjà les équipements de traçage substantiels; l'agent de GDB pour le système de Symmetrix emploie ces équipements pour sa propre collecte de données, par l'intermédiaire de l'api décrit ici.

Fonction: Adbg_find_memory_in_frame de DTC_response (FRAME_def *armaturechar *adresse** de charamortisseurinterne non signé *taille

Recherchez l'armature de trace armature pour la mémoire sauvée de adresse. Si la mémoire est disponible, fournissez l'adresse de l'amortisseur la tenant; autrement, fournissez l'adresse du prochain secteur sauvé.

Si la mémoire à adresse a été économisé dedans armatureensemble *amortisseur pour se diriger à l'amortisseur dans lequel cette mémoire a été sauvée, placez *taille au nombre de bytes de adresse cela sont sauvés à *amortisseuret retour OK_target_response. (clairement, dans ce cas-ci, la fonction placera toujours *taille à une valeur zéro plus grand que.)

Si armature n'enregistre aucune mémoire à adresseensemble *taille à la distance de adresse au début de la région sauvée avec la plus basse adresse plus haute que adresse. S'il n'y a aucune mémoire sauvée de n'importe quelle adresse plus élevée, placez *taille à zéro. Retour NOT_found_target_response.

Ces deux possibilités permettent le visiteur à recherchent les données, ou marchent l'espace adresse au prochain secteur sauvé.

Cette fonction permet à l'agent de GDB de tracer les régions de la mémoire sauvées dans une armature particulière, et recherche leur contenu efficacement.

Cette fonction fournit également une interface propre entre l'agent de GDB et les structures traçantes de Symmetrix, le facilitant d'adapter l'agent de GDB à de futures versions du système de Symmetrix, et vice versa. Cette fonction recherche toutes les données sauvées dedans armaturesi les données sont là sur demande d'une expression de bytecode, ou parce qu'elles tombent dans un des gammes de la mémoire du format, ou parce qu'elles ont été sauvées du dessus de la pile. EMC peut arbitrairement changer et augmenter le mécanisme traçant, mais aussi longtemps que cette fonction fonctionne correctement, toute la mémoire rassemblée est évidente à GDB.

La fonction elle-même est franche pour mettre en application. Un passage simple au-dessus du secteur de pile de l'armature de trace, mémoire s'étend, et les blocs d'expression peuvent rapporter l'adresse de l'amortisseur (si l'adresse demandée était sauvée), et notent également l'adresse du prochain

une gamme plus élevée de mémoire, être retourné quand la recherche échoue.

Comme exemple, supposez l'armature de trace f a sauvé des bytes de seize de l'adresse 0x8000 dans un amortisseur à 0x1000et bytes de thirty-two d'adresse 0xc000 dans un amortisseur à 0x1010. Voici quelques appels d'échantillon, et l'effet chacun aurait:

adbg_find_memory_in_frame (f, (char *) 0x8000, &buffer, &size)

Ceci placerait amortisseur à 0x1000ensemble taille à seize, et à retour OK_target_responsedepuis f sauve des bytes de seize de 0x8000 à 0x1000.

adbg_find_memory_in_frame (f, (char *) 0x8004, &buffer, &size)

Ceci placerait amortisseur à 0x1004ensemble taille à douze, et à retour OK_target_responsepuisque le ` f ' sauve les douze bytes de 0x8004 commencer quatre bytes dans l'amortisseur à 0x1000. Ceci prouve que les adresses de demande peuvent tomber au milieu des secteurs sauvés; la fonction devrait renvoyer l'adresse et la taille du reste de l'amortisseur.

adbg_find_memory_in_frame (f, (char *) 0x8100, &buffer, &size)

Ceci placerait taille à 0x3f00 et retour NOT_found_target_responsepuisqu'il n'y a aucune mémoire sauvée dedans f de l'adresse 0x8100et la prochaine mémoire disponible est à 0x8100 + 0x3f00ou 0xc000. Ceci prouve que les adresses de demande peuvent tomber dehors de toutes les gammes sauvées de mémoire; la fonction devrait indiquer le prochain secteur sauvé éventuel.

adbg_find_memory_in_frame (f, (char *) 0x7000, &buffer, &size)

Ceci placerait taille à 0x1000 et retour NOT_found_target_responsepuisque la prochaine mémoire sauvée est à 0x7000 + 0x1000ou 0x8000.

adbg_find_memory_in_frame (f, (char *) 0xf000, &buffer, &size)

Ceci placerait taille à zéro, et à retour NOT_found_target_response. Ceci montre comment la fonction indique au visiteur qu'aucune gamme supplémentaire de mémoire n'a été sauvée.

En tant qu'autre exemple, voici une fonction qui imprimera hors des adresses de toute la mémoire sauvée dans l'armature de trace armature sur la console de Symmetrix INLINES:

print_frame_addresses vides (FRAME_def * armature) { char * addr; char * amortisseur; longue taille non signée; addr = 0; pour (;;) {/* le l'un ou l'autre découvrez combien de mémoire nous avons ici, ou découvrez où la prochaine région sauvée est. */si == OK_target_response (d'adbg_find_memory_in_frame (l'armature, addr, &buffer, &size)) printp ("%x sauvé à %x\n ", à addr, à addr + à taille); si (== 0 de taille) coupure; addr + = taille; } }

Notez qu'il n'y a pas nécessairement aucun raccordement entre l'ordre dans lequel les données sont sauvées dans l'armature de trace, et l'ordre dans lequel adbg_find_memory_in_frame renverra ces gammes de mémoire. Le code ci-dessus imprimera toujours les régions de mémoire sauvées par ordre d'adresse croissante, alors que la structure fondamentale d'armature pourrait stocker les données dans un ordre aléatoire.

[ [ cette section devrait couvrir le reste des fonctions de Symmetrix que le moignon compte au moment, aussi. ] ]

Raisonnement E.6

Une partie de ce qui précède apparent de décisions de conception est défendable.

Que diriez-vous de la pile overflow/underflow?

GDB devrait pouvoir questionner la cible pour découvrir sa taille de pile. Fourni cette information, GDB peut déterminer au temps de traduction si une expression donnée débordera la pile. Mais cette Spéc. n'est pas au sujet de quels genres de GDB de contrôle d'erreurs doivent faire.

Pourquoi faites-vous tout dedans LE PLUS LONGTEMPS?

La vitesse n'est pas importante, mais le nombre d'instructions d'agent est; employer LE PLUS LONGTEMPS apporte un groupe de code de soutien pour faire des choses comme la division, etc... Ainsi c'est une préoccupation profonde.

D'abord, notez que vous n'avez pas besoin de différents bytecodes pour différentes tailles d'opérande. Vous pouvez produire du code sans savoir grand les éléments de pile sont réellement sur la cible. Si la cible soutient seulement les ints de 32 bits, et vous n'envoyez aucun bytecodes 64-bit, tout juste travaille. L'observation ici est que les MIPS et l'alpha ont seulement les registres à taille fixe, et vous pouvez immobile obtenir la sémantique du c quoique la plupart des instructions opèrent seulement des mots normaux. Vous le besoin juste de s'assurer tout est correctement signe-prolongé aux bons temps. Donc il n'y a aucun besoin de 32- et variantes 64-bit des bytecodes. Instrument juste tout employant la plus grande taille que vous soutenez.

GDB devrait certainement vérifier pour voir quelles tailles la cible soutient, ainsi l'utilisateur peut obtenir une erreur première, plutôt que plus tard. Mais cette information n'est pas nécessaire pour l'exactitude.

Pourquoi vous n'avez pas > ou < = opérateurs?

Je veux maintenir l'interprète petit, et nous n'avons pas besoin d'eux. Nous pouvons combiner moins _ opcodes avec log_notet permutez l'ordre des opérandes, rapportant chacun des quatre opérateurs asymétriques de comparaison. Par exemple, (x < = y) est ! (x > y)qui est ! (y < x).

Pourquoi vous avez log_not

Pourquoi vous avez ext.

Pourquoi vous avez zero_ext

Ce sont tous facilement synthétisés d'autres instructions, mais je m'attends à ce qu'elles emploient fréquemment, et elles sont simples, ainsi je les inclus pour maintenir des cordes de bytecode executees.

log_not est équivalent à égale const8 0elle est employée dans la moitié d'opérateurs apparentés.

ext. n est équivalent à const8 Sn lsh const8 Sn rsh_signedoù s est la taille des éléments de pile; elle suit référencem et repérage bytecodes quand la valeur devrait être signée. Voyez le prochain article bulleted.

zero_ext n est équivalent à constm masque log_andil est employé toutes les fois que nous poussons la valeur d'un registre, parce que nous ne pouvons pas supposer le peu supérieur du registre n'est pas des ordures.

Pourquoi ne pas avoir des variantes signe-se prolongeantes de référence opérateurs?

Puisque cela doublerait le nombre de référence les opérateurs, et nous avons besoin de ext. bytecode de toute façon pour les bitfields d'accès.

Pourquoi ne pas avoir constant-adressez les variantes du référence opérateurs?

Puisque cela doublerait le nombre de référence opérateurs encore, et const32 adresse ref32 est seulement un byte plus longtemps.

Pourquoi faites référencen les opérateurs doivent soutenir des efforts unaligned?

GDB produira du bytecode qui cherche des valeurs de multi-byte aux adresses unaligned toutes les fois que l'information de mise en point exécutable l'indique à. En outre, GDB ne sait pas que la valeur l'indicateur aura quand GDB produit du bytecode, ainsi il ne peut pas déterminer si un détail cherchent sera aligné ou pas.

En particulier, les bitfields de structure peuvent être plusieurs bytes longtemps, mais ne suivent aucune règle d'alignement; des membres des structures emballées ne sont pas nécessairement alignés non plus.

En général, il y a beaucoup de cas où les références unaligned se produisent en code correct de C, l'un ou l'autre à la demande explicite du programmeur, ou à la discrétion du compilateur. Ainsi, il est plus simple de faire fonctionner les bytecodes d'agent de GDB correctement dans toutes les circonstances que pour faire la conjecture de GDB dans chaque cas si le compilateur a fait la chose habituelle.

Pourquoi y a-t-il aucuns opérateurs côté-effectuants?

Puisque notre client courant ne les veut pas? C'est une réponse bon marché. Je pense que la vraie réponse est que j'ai peur de mettre en application des appels de fonction. Nous devrions revisiter cette issue après que le présent contrat soit fourni.

Pourquoi ne soyez pas goto ops PC-relatifs?

L'interprète prend l'adresse de base autour de toute façon pour des limites de PC vérifiant, et elle a semblé plus simple.

Pourquoi y a il seulement une taille excentrée pour goto ops?

Les excentrages sont actuellement des bits de seize. Je ne suis pas heureux avec cette situation non plus:

Supposez que nous avons des ops de branche multiple avec différentes tailles excentrées. Car je produis du code de gauche à droite, tous mes sauts sont des sauts vers l'avant (il n'y a aucune boucle dans les expressions), ainsi je ne connais jamais la cible quand j'émets l'opcode de saut. Ainsi, je dois toujours assumer la plus grande taille excentrée, ou saute la relaxation sur le code après que je produise de lui, qui semble comme une grande perte de temps.

Je puis imaginer une expression raisonnable être plus long que 256 bytes. Je ne puis pas imaginer un être plus long que 64k. ainsi, nous ont besoin d'excentrages de 16 bits. Ce genre de raisonnement est si faux, mais la relaxation est pathetic.

L'autre approche serait de produire du code droit-à-gauche. Alors je saurais toujours mon taille excentrée. Ce pourrait être amusement.

Où est l'appel de fonction du bytecode?

Quand nous ajoutons des effets secondaires, nous devrions ajouter ceci.

Pourquoi fait repérage prise de bytecode un nombre de 16 bits de registre?

L'architecture de l'Ia-64 d'Intel a 128 registres d'usage universel, et 128 registres à point mobile, et je suis sûr qu'elle a quelques compteurs d'instruction aléatoires.

Pourquoi nous avons besoin trace et trace_quick

Puisque GDB doit enregistrer le tout la mémoire contente et enregistre des contacts d'une expression. Si l'utilisateur veut évaluer une expression x->y->zl'agent doit enregistrer les valeurs de X et x->y aussi bien que la valeur de x->y->z.

Pas trace les bytecodes rendent l'interprète moins général?

Ils signifient que l'interprète contient le code pour un but particulier, mais cela ne signifie pas que l'interprète peut seulement être utilisé dans ce but. Si une expression n'emploie pas trace des bytecodes, ils n'obtiennent pas de sa manière.

Pourquoi pas trace_quick consommez ses arguments la manière que tout autrement ?

En général, vous voulez que vos opérateurs consomment leurs arguments; il est conformé, et réduit généralement la quantité de remise en ordre de pile nécessaire. Cependant, trace_quick est un kludge pour ménager de l'espace; il existe seulement ainsi nous n'avons pas besoin d'écrire duplication const8 TAILLE trace avant chaque référence de mémoire. Par conséquent, il est correct pour elle de ne pas consommer ses arguments; on le signifie pour un contexte spécifique dans lequel nous savons exactement ce qu'il devrait faire avec la pile. Si nous allons avoir un kludge, ce devrait être un kludge efficace.

Pourquoi trace16 existez?

Cet opcode a été ajouté par le client que Cygnus contracté pour le travail de traçage de données. Je pense personnellement que c'est inutile; les objets qui grand soyez tout à fait rare, ainsi lui est correct pour employer duplication const16 taille trace dans ces cas.

Avec celui que nous décidions de faire trace16nous devrions au moins laisser l'opcode 0x30 réservé, pour rester compatibles avec le client qui l'a ajouté.

<!--docid::SEC1::-->

<!--docid::SEC5::-->

<!--docid::SEC6::-->

<!--docid::SEC7::-->

<!--docid::SEC8::-->

<!--docid::SEC9::-->

<!--docid::SEC11::-->

<!--docid::SEC12::-->

<!--docid::SEC13::-->

<!--docid::SEC14::-->

<!--docid::SEC15::-->

base href="http://81.56.206.182/philippe/tmp/gdb4.html"

<!--docid::SEC16::-->

<!--docid::SEC17::-->

<!--docid::SEC18::-->

<!--docid::SEC19::-->

base href="http://81.56.206.182/philippe/tmp/gdb5.html"

<!--docid::SEC20::-->

<!--docid::SEC21::-->

<!--docid::SEC22::-->

<!--docid::SEC23::-->

<!--docid::SEC24::-->

<!--docid::SEC25::-->

base href="http://81.56.206.182/philippe/tmp/gdb6.html"

<!--docid::SEC26::-->

<!--docid::SEC27::-->

<!--docid::SEC28::-->

base href="http://81.56.206.182/philippe/tmp/gdb7.html"

<!--docid::SEC29::-->

<!--docid::SEC30::-->

<!--docid::SEC31::-->

base href="http://81.56.206.182/philippe/tmp/gdb8.html"

<!--docid::SEC32::-->

<!--docid::SEC33::-->

<!--docid::SEC34::-->

base href="http://81.56.206.182/philippe/tmp/gdb8.html"

<!--docid::SEC32::-->

<!--docid::SEC33::-->

<!--docid::SEC34::-->

base href="http://81.56.206.182/philippe/tmp/gdb9.html"

<!--docid::SEC35::-->

<!--docid::SEC36::-->

<!--docid::SEC37::-->

base href="http://81.56.206.182/philippe/tmp/gdb10.html"

<!--docid::SEC38::-->

<!--docid::SEC39::-->

<!--docid::SEC40::-->

base href="http://81.56.206.182/philippe/tmp/gdb11.html"

<!--docid::SEC41::-->

<!--docid::SEC42::-->

<!--docid::SEC43::-->

<!--docid::SEC44::-->

base href="http://81.56.206.182/philippe/tmp/gdb12.html"

<!--docid::SEC45::-->

<!--docid::SEC46::-->

<!--docid::SEC47::-->

base href="http://81.56.206.182/philippe/tmp/gdb13.html"

<!--docid::SEC48::-->

<!--docid::SEC49::-->

<!--docid::SEC50::-->

<!--docid::SEC51::-->

<!--docid::SEC52::-->

<!--docid::SEC53::-->

base href="http://81.56.206.182/philippe/tmp/gdb14.html"

<!--docid::SEC54::-->

<!--docid::SEC55::-->

<!--docid::SEC56::-->

<!--docid::SEC57::-->

base href="http://81.56.206.182/philippe/tmp/gdb15.html"

<!--docid::SEC58::-->

<!--docid::SEC59::-->

<!--docid::SEC60::-->

<!--docid::SEC61::-->

base href="http://81.56.206.182/philippe/tmp/gdb16.html"

<!--docid::SEC62::-->

base href="http://81.56.206.182/philippe/tmp/gdb17.html"

<!--docid::SEC63::-->

<!--docid::SEC64::-->

base href="http://81.56.206.182/philippe/tmp/gdb21.html"

<!--docid::SEC79::-->

<!--docid::SEC80::-->

<!--docid::SEC81::-->

<!--docid::SEC82::-->

<!--docid::SEC83::-->

<!--docid::SEC84::-->

<!--docid::SEC85::-->

base href="http://81.56.206.182/philippe/tmp/gdb22.html"

<!--docid::SEC86::-->

<!--docid::SEC87::-->

<!--docid::SEC88::-->

<!--docid::SEC89::-->

<!--docid::SEC90::-->

base href="http://81.56.206.182/philippe/tmp/gdb23.html"

<!--docid::SEC91::-->

<!--docid::SEC92::-->

<!--docid::SEC93::-->

base href="http://81.56.206.182/philippe/tmp/gdb24.html"

<!--docid::SEC94::-->

<!--docid::SEC95::-->

<!--docid::SEC96::-->

<!--docid::SEC97::-->

<!--docid::SEC98::-->

<!--docid::SEC99::-->

<!--docid::SEC100::-->

<!--docid::SEC101::-->

base href="http://81.56.206.182/philippe/tmp/gdb25.html"

<!--docid::SEC102::-->

<!--docid::SEC103::-->

<!--docid::SEC104::-->

<!--docid::SEC105::-->

base href="http://81.56.206.182/philippe/tmp/gdb26.html"

<!--docid::SEC106::-->

<!--docid::SEC107::-->

<!--docid::SEC108::-->

<!--docid::SEC109::-->

<!--docid::SEC110::-->

<!--docid::SEC111::-->

<!--docid::SEC112::-->

base href="http://81.56.206.182/philippe/tmp/gdb27.html"

<!--docid::SEC113::-->

<!--docid::SEC114::-->

<!--docid::SEC115::-->

<!--docid::SEC116::-->

<!--docid::SEC117::-->

base href="http://81.56.206.182/philippe/tmp/gdb28.html"

<!--docid::SEC118::-->

<!--docid::SEC119::-->

<!--docid::SEC120::-->

<!--docid::SEC121::-->

<!--docid::SEC122::-->

<!--docid::SEC123::-->

<!--docid::SEC124::-->

<!--docid::SEC125::-->

base href="http://81.56.206.182/philippe/tmp/gdb29.html"

base href="http://81.56.206.182/philippe/tmp/gdb30.html"

<!--docid::SEC126::-->

<!--docid::SEC127::-->

<!--docid::SEC128::-->

<!--docid::SEC129::-->

<!--docid::SEC130::-->

<!--docid::SEC131::-->

<!--docid::SEC132::-->

<!--docid::SEC133::-->

<!--docid::SEC134::-->

base href="http://81.56.206.182/philippe/tmp/gdb31.html"

base href="http://81.56.206.182/philippe/tmp/gdb32.html"

<!--docid::SEC135::-->

base href="http://81.56.206.182/philippe/tmp/gdb33.html"

<!--docid::SEC136::-->

<!--docid::SEC137::-->

<!--docid::SEC138::-->

<!--docid::SEC139::-->

base href="http://81.56.206.182/philippe/tmp/gdb34.html"

<!--docid::SEC140::-->

<!--docid::SEC141::-->

<!--docid::SEC142::-->

<!--docid::SEC144::-->

<!--docid::SEC145::-->

base href="http://81.56.206.182/philippe/tmp/gdb35.html"

<!--docid::SEC146::-->

<!--docid::SEC147::-->

<!--docid::SEC148::-->

<!--docid::SEC149::-->

<!--docid::SEC150::-->

base href="http://81.56.206.182/philippe/tmp/gdb36.html"

<!--docid::SEC151::-->

<!--docid::SEC192::-->

<!--docid::SEC193::-->

<!--docid::SEC194::-->

<!--docid::SEC195::-->

<!--docid::SEC196::-->

<!--docid::SEC197::-->

base href="http://81.56.206.182/philippe/tmp/gdb37.html"

<!--docid::SEC198::-->

<!--docid::SEC199::-->

<!--docid::SEC200::-->

<!--docid::SEC201::-->

<!--docid::SEC202::-->

base href="http://81.56.206.182/philippe/tmp/gdb38.html"

<!--docid::SEC203::-->

<!--docid::SEC204::-->

<!--docid::SEC205::-->

base href="http://81.56.206.182/philippe/tmp/gdb39.html"

<!--docid::SEC206::-->

<!--docid::SEC208::-->

<!--docid::SEC209::-->

base href="http://81.56.206.182/philippe/tmp/gdb40.html"

<!--docid::SEC210::-->

<!--docid::SEC211::-->

<!--docid::SEC212::-->

<!--docid::SEC213::-->

base href="http://81.56.206.182/philippe/tmp/gdb41.html"

<!--docid::SEC214::-->

<!--docid::SEC215::-->

<!--docid::SEC216::-->

<!--docid::SEC217::-->

<!--docid::SEC219::-->

<!--docid::SEC220::-->

base href="http://81.56.206.182/philippe/tmp/gdb42.html"

<!--docid::SEC221::-->

<!--docid::SEC222::-->

<!--docid::SEC223::-->

<!--docid::SEC224::-->

<!--docid::SEC225::-->

<!--docid::SEC226::-->

<!--docid::SEC227::-->

<!--docid::SEC228::-->

<!--docid::SEC229::-->

<!--docid::SEC230::-->

<!--docid::SEC231::-->

<!--docid::SEC232::-->

<!--docid::SEC233::-->

<!--docid::SEC234::-->

<!--docid::SEC235::-->

<!--docid::SEC236::-->

<!--docid::SEC237::-->

<!--docid::SEC238::-->

<!--docid::SEC239::-->

<!--docid::SEC240::-->

<!--docid::SEC241::-->

<!--docid::SEC242::-->

<!--docid::SEC243::-->

<!--docid::SEC244::-->

<!--docid::SEC245::-->

base href="http://81.56.206.182/philippe/tmp/gdb43.html"

<!--docid::SEC246::-->

<!--docid::SEC247::-->

<!--docid::SEC248::-->

<!--docid::SEC249::-->

<!--docid::SEC250::-->

<!--docid::SEC251::-->

<!--docid::SEC252::-->

<!--docid::SEC253::-->

<!--docid::SEC254::-->

<!--docid::SEC255::-->

<!--docid::SEC256::-->

<!--docid::SEC257::-->

<!--docid::SEC258::-->

<!--docid::SEC259::-->

<!--docid::SEC260::-->

<!--docid::SEC261::-->

<!--docid::SEC262::-->

<!--docid::SEC263::-->

<!--docid::SEC264::-->

<!--docid::SEC265::-->

<!--docid::SEC266::-->

<!--docid::SEC267::-->

<!--docid::SEC268::-->

<!--docid::SEC269::-->

<!--docid::SEC270::-->

<!--docid::SEC271::-->

<!--docid::SEC272::-->

<!--docid::SEC273::-->

base href="http://81.56.206.182/philippe/tmp/gdb44.html"

<!--docid::SEC274::-->

<!--docid::SEC275::-->

<!--docid::SEC276::-->

<!--docid::SEC277::-->

<!--docid::SEC278::-->

<!--docid::SEC279::-->

<!--docid::SEC280::-->

<!--docid::SEC281::-->

<!--docid::SEC282::-->

<!--docid::SEC283::-->

<!--docid::SEC284::-->

base href="http://81.56.206.182/philippe/tmp/gdb45.html"

<!--docid::SEC285::-->

<!--docid::SEC286::-->

<!--docid::SEC287::-->

<!--docid::SEC288::-->

<!--docid::SEC289::-->

<!--docid::SEC290::-->

<!--docid::SEC291::-->

<!--docid::SEC292::-->

<!--docid::SEC295::-->

<!--docid::SEC296::-->

<!--docid::SEC299::-->

<!--docid::SEC300::-->

<!--docid::SEC301::-->

<!--docid::SEC302::-->

<!--docid::SEC303::-->

<!--docid::SEC304::-->

base href="http://81.56.206.182/philippe/tmp/gdb46.html"

<!--docid::SEC305::-->

<!--docid::SEC306::-->

<!--docid::SEC307::-->

<!--docid::SEC308::-->

<!--docid::SEC309::-->

<!--docid::SEC310::-->

<!--docid::SEC311::-->

<!--docid::SEC312::-->

<!--docid::SEC313::-->

<!--docid::SEC314::-->

<!--docid::SEC315::-->

<!--docid::SEC316::-->

<!--docid::SEC317::-->

<!--docid::SEC318::-->

<!--docid::SEC319::-->

<!--docid::SEC320::-->

<!--docid::SEC321::-->

<!--docid::SEC322::-->

<!--docid::SEC323::-->

<!--docid::SEC324::-->

<!--docid::SEC325::-->

<!--docid::SEC326::-->

<!--docid::SEC327::-->

<!--docid::SEC328::-->

<!--docid::SEC329::-->

<!--docid::SEC330::-->

<!--docid::SEC331::-->

<!--docid::SEC332::-->

<!--docid::SEC333::-->

<!--docid::SEC334::-->

<!--docid::SEC335::-->

<!--docid::SEC336::-->

<!--docid::SEC337::-->

<!--docid::SEC338::-->

<!--docid::SEC339::-->

<!--docid::SEC340::-->

<!--docid::SEC341::-->

<!--docid::SEC342::-->

<!--docid::SEC343::-->

<!--docid::SEC344::-->

<!--docid::SEC345::-->

<!--docid::SEC346::-->

<!--docid::SEC347::-->

<!--docid::SEC348::-->

<!--docid::SEC349::-->

base href="http://81.56.206.182/philippe/tmp/gdb47.html"

<!--docid::SEC350::-->

<!--docid::SEC351::-->

<!--docid::SEC352::-->

<!--docid::SEC353::-->

<!--docid::SEC354::-->

<!--docid::SEC355::-->

<!--docid::SEC356::-->

<!--docid::SEC357::-->

<!--docid::SEC358::-->

<!--docid::SEC359::-->

<!--docid::SEC360::-->

<!--docid::SEC361::-->

<!--docid::SEC362::-->

<!--docid::SEC363::-->

<!--docid::SEC364::-->

<!--docid::SEC365::-->

<!--docid::SEC366::-->

<!--docid::SEC367::-->

<!--docid::SEC368::-->

<!--docid::SEC369::-->

<!--docid::SEC370::-->

<!--docid::SEC371::-->

<!--docid::SEC372::-->

<!--docid::SEC373::-->

<!--docid::SEC374::-->

<!--docid::SEC375::-->

<!--docid::SEC376::-->

<!--docid::SEC377::-->

<!--docid::SEC378::-->

<!--docid::SEC379::-->

<!--docid::SEC380::-->

<!--docid::SEC381::-->

<!--docid::SEC382::-->

<!--docid::SEC383::-->

<!--docid::SEC384::-->

<!--docid::SEC385::-->

<!--docid::SEC386::-->

<!--docid::SEC387::-->

<!--docid::SEC388::-->

<!--docid::SEC389::-->

<!--docid::SEC390::-->

<!--docid::SEC391::-->

base href="http://81.56.206.182/philippe/tmp/gdb48.html"

<!--docid::SEC392::-->

<!--docid::SEC393::-->

<!--docid::SEC394::-->

<!--docid::SEC395::-->

<!--docid::SEC396::-->

<!--docid::SEC397::-->

<!--docid::SEC398::-->

<!--docid::SEC399::-->

<!--docid::SEC400::-->

<!--docid::SEC401::-->

<!--docid::SEC402::-->

<!--docid::SEC403::-->

<!--docid::SEC404::-->

<!--docid::SEC405::-->

<!--docid::SEC406::-->

<!--docid::SEC407::-->

<!--docid::SEC408::-->

<!--docid::SEC409::-->

<!--docid::SEC410::-->

<!--docid::SEC411::-->

<!--docid::SEC412::-->

<!--docid::SEC413::-->

<!--docid::SEC414::-->

<!--docid::SEC415::-->

<!--docid::SEC416::-->

<!--docid::SEC417::-->

<!--docid::SEC418::-->

<!--docid::SEC419::-->

<!--docid::SEC420::-->

<!--docid::SEC421::-->

<!--docid::SEC422::-->

<!--docid::SEC423::-->

<!--docid::SEC424::-->

<!--docid::SEC425::-->

<!--docid::SEC426::-->

<!--docid::SEC427::-->

<!--docid::SEC428::-->

<!--docid::SEC429::-->

<!--docid::SEC430::-->

<!--docid::SEC431::-->

<!--docid::SEC432::-->

<!--docid::SEC433::-->

<!--docid::SEC434::-->

<!--docid::SEC435::-->

<!--docid::SEC436::-->

<!--docid::SEC437::-->

<!--docid::SEC438::-->

<!--docid::SEC439::-->

<!--docid::SEC440::-->

<!--docid::SEC441::-->

<!--docid::SEC442::-->

<!--docid::SEC443::-->

<!--docid::SEC444::-->

base href="http://81.56.206.182/philippe/tmp/gdb49.html"

<!--docid::SEC445::-->

<!--docid::SEC446::-->

<!--docid::SEC447::-->

<!--docid::SEC448::-->

<!--docid::SEC449::-->

<!--docid::SEC450::-->

<!--docid::SEC451::-->

<!--docid::SEC452::-->

<!--docid::SEC453::-->

<!--docid::SEC454::-->

<!--docid::SEC455::-->

<!--docid::SEC456::-->

<!--docid::SEC457::-->

<!--docid::SEC458::-->

<!--docid::SEC459::-->

<!--docid::SEC460::-->

<!--docid::SEC461::-->

<!--docid::SEC462::-->

<!--docid::SEC463::-->

<!--docid::SEC464::-->

<!--docid::SEC465::-->

<!--docid::SEC466::-->

<!--docid::SEC467::-->

<!--docid::SEC468::-->

<!--docid::SEC469::-->

<!--docid::SEC470::-->

<!--docid::SEC471::-->

<!--docid::SEC472::-->

base href="http://81.56.206.182/philippe/tmp/gdb50.html"

<!--docid::SEC473::-->

<!--docid::SEC474::-->

<!--docid::SEC475::-->

<!--docid::SEC476::-->

<!--docid::SEC477::-->

<!--docid::SEC478::-->

<!--docid::SEC479::-->

<!--docid::SEC480::-->

<!--docid::SEC481::-->

<!--docid::SEC482::-->

<!--docid::SEC483::-->

<!--docid::SEC484::-->

<!--docid::SEC485::-->

<!--docid::SEC486::-->

<!--docid::SEC487::-->

<!--docid::SEC488::-->

<!--docid::SEC489::-->

<!--docid::SEC490::-->

<!--docid::SEC491::-->

<!--docid::SEC492::-->

<!--docid::SEC493::-->

<!--docid::SEC494::-->

<!--docid::SEC495::-->

<!--docid::SEC496::-->

<!--docid::SEC497::-->

<!--docid::SEC498::-->

<!--docid::SEC499::-->

<!--docid::SEC500::-->

<!--docid::SEC501::-->

<!--docid::SEC502::-->

<!--docid::SEC503::-->

<!--docid::SEC504::-->

<!--docid::SEC505::-->

<!--docid::SEC506::-->

<!--docid::SEC507::-->

<!--docid::SEC508::-->

<!--docid::SEC509::-->

<!--docid::SEC510::-->

<!--docid::SEC511::-->

<!--docid::SEC512::-->

<!--docid::SEC513::-->

<!--docid::SEC514::-->

<!--docid::SEC515::-->

<!--docid::SEC516::-->

<!--docid::SEC517::-->

<!--docid::SEC518::-->

<!--docid::SEC519::-->

<!--docid::SEC520::-->

<!--docid::SEC521::-->

<!--docid::SEC522::-->

<!--docid::SEC523::-->

<!--docid::SEC524::-->

<!--docid::SEC525::-->

<!--docid::SEC526::-->

<!--docid::SEC527::-->

<!--docid::SEC528::-->

<!--docid::SEC529::-->

<!--docid::SEC530::-->

<!--docid::SEC531::-->

<!--docid::SEC532::-->

<!--docid::SEC533::-->

<!--docid::SEC534::-->

<!--docid::SEC535::-->

<!--docid::SEC536::-->

<!--docid::SEC537::-->

<!--docid::SEC538::-->

<!--docid::SEC539::-->

<!--docid::SEC540::-->

<!--docid::SEC541::-->

<!--docid::SEC542::-->

<!--docid::SEC543::-->

<!--docid::SEC544::-->

<!--docid::SEC545::-->

<!--docid::SEC546::-->

<!--docid::SEC547::-->

<!--docid::SEC548::-->

<!--docid::SEC549::-->

<!--docid::SEC550::-->

<!--docid::SEC551::-->

<!--docid::SEC552::-->

<!--docid::SEC553::-->

<!--docid::SEC554::-->

<!--docid::SEC555::-->

<!--docid::SEC556::-->

<!--docid::SEC557::-->

<!--docid::SEC558::-->

<!--docid::SEC559::-->

<!--docid::SEC560::-->

<!--docid::SEC561::-->

<!--docid::SEC562::-->

<!--docid::SEC563::-->

<!--docid::SEC564::-->

<!--docid::SEC565::-->

<!--docid::SEC566::-->

<!--docid::SEC567::-->

<!--docid::SEC568::-->

<!--docid::SEC569::-->

<!--docid::SEC570::-->

<!--docid::SEC571::-->

<!--docid::SEC572::-->

<!--docid::SEC573::-->

<!--docid::SEC574::-->

<!--docid::SEC575::-->

<!--docid::SEC576::-->

base href="http://81.56.206.182/philippe/tmp/gdb52.html"

<!--docid::SEC577::-->

<!--docid::SEC578::-->

<!--docid::SEC579::-->

<!--docid::SEC580::-->

<!--docid::SEC581::-->

<!--docid::SEC582::-->

<!--docid::SEC583::-->

<!--docid::SEC584::-->

<!--docid::SEC585::-->

<!--docid::SEC586::-->

<!--docid::SEC587::-->

<!--docid::SEC588::-->

<!--docid::SEC589::-->

<!--docid::SEC590::-->

<!--docid::SEC591::-->

<!--docid::SEC592::-->

<!--docid::SEC593::-->

<!--docid::SEC594::-->

<!--docid::SEC595::-->

<!--docid::SEC596::-->

<!--docid::SEC597::-->

<!--docid::SEC598::-->

<!--docid::SEC599::-->

<!--docid::SEC600::-->

<!--docid::SEC601::-->

<!--docid::SEC602::-->

<!--docid::SEC603::-->

<!--docid::SEC604::-->

<!--docid::SEC605::-->

<!--docid::SEC606::-->

<!--docid::SEC607::-->

base href="http://81.56.206.182/philippe/tmp/gdb53.html"

<!--docid::SEC608::-->

<!--docid::SEC609::-->

<!--docid::SEC610::-->

<!--docid::SEC611::-->

<!--docid::SEC612::-->

<!--docid::SEC613::-->

<!--docid::SEC614::-->

<!--docid::SEC615::-->

<!--docid::SEC616::-->

base href="http://81.56.206.182/philippe/tmp/gdb55.html"

<!--docid::SEC623::-->

<!--docid::SEC624::-->

<!--docid::SEC625::-->

<!--docid::SEC626::-->

<!--docid::SEC627::-->

<!--docid::SEC628::-->

base href="http://81.56.206.182/philippe/tmp/gdb56.html"

<!--docid::SEC629::-->

base href="http://81.56.206.182/philippe/tmp/gdb57.html"

<!--docid::SEC630::-->

<!--docid::SEC631::-->

<!--docid::SEC632::-->

<!--docid::SEC633::-->

<!--docid::SEC634::-->

base href="http://81.56.206.182/philippe/tmp/gdb58.html"

<!--docid::SEC635::-->

<!--docid::SEC636::-->

<!--docid::SEC637::-->

<!--docid::SEC638::-->

<!--docid::SEC639::-->

base href="http://81.56.206.182/philippe/tmp/gdb59.html"

<!--docid::SEC640::-->

<!--docid::SEC646::-->

<!--docid::SEC647::-->

<!--docid::SEC648::-->

base href="http://81.56.206.182/philippe/tmp/gdb60.html"

<!--docid::SEC649::-->

<!--docid::SEC650::-->

<!--docid::SEC651::-->

base href="http://81.56.206.182/philippe/tmp/gdb61.html"

<!--docid::SEC653::-->

<!--docid::SEC654::-->

base href="http://81.56.206.182/philippe/tmp/gdb62.html"

base href="http://81.56.206.182/philippe/tmp/gdb63.html"

<!--docid::SEC655::-->

base href="http://81.56.206.182/philippe/tmp/gdb64.html"

<!--docid::SEC656::-->

<!--docid::SEC657::-->

<!--docid::SEC658::-->

base href="http://81.56.206.182/philippe/tmp/gdb65.html"

<!--docid::SEC660::-->

<!--docid::SEC661::-->

<!--docid::SEC662::-->

<!--docid::SEC663::-->

<!--docid::SEC664::-->

<!--docid::SEC665::-->

<!--docid::SEC666::-->

<!--docid::SEC667::-->

<!--docid::SEC668::-->

<!--docid::SEC669::-->

base href="http://81.56.206.182/philippe/tmp/gdb66.html"

<!--docid::SEC670::-->

<!--docid::SEC671::-->

<!--docid::SEC672::-->

<!--docid::SEC673::-->

<!--docid::SEC674::-->

<!--docid::SEC675::-->

base href="http://81.56.206.182/philippe/tmp/gdb67.html"

<!--docid::SEC676::-->

<!--docid::SEC677::-->

<!--docid::SEC678::-->

<!--docid::SEC679::-->

<!--docid::SEC680::-->

<!--docid::SEC681::-->

<!--docid::SEC682::-->

<!--docid::SEC683::-->

<!--docid::SEC684::-->

base href="http://81.56.206.182/philippe/tmp/gdb68.html"

<!--docid::SEC685::-->

<!--docid::SEC686::-->

<!--docid::SEC687::-->

<!--docid::SEC688::-->

<!--docid::SEC689::-->

<!--docid::SEC690::-->

<!--docid::SEC691::-->

<!--docid::SEC692::-->

<!--docid::SEC693::-->

<!--docid::SEC694::-->

base href="http://81.56.206.182/philippe/tmp/gdb69.html"

<!--docid::SEC695::-->

base href="http://81.56.206.182/philippe/tmp/gdb70.html"

<!--docid::SEC696::-->

<!--docid::SEC697::-->

<!--docid::SEC698::-->

base href="http://81.56.206.182/philippe/tmp/gdb71.html"

<!--docid::SEC699::-->

GDB

30/12/03	Traduction Philippe Laneres	19/246

Philippe Laneres

2003-11-23T07:52:54