Changes between Version 4 and Version 5 of SoclibCourseTp5
- Timestamp:
- Oct 19, 2009, 6:40:38 PM (15 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SoclibCourseTp5
v4 v5 5 5 [[PageOutline]] 6 6 7 = 1 Objectif =7 = 1 Objectifs = 8 8 9 Le principal objectif de ce TP est d'introduire l'outil '''GDB Server''' qui permet de déverminer une application 10 logicielle embarquée s'exécutant sur une architecture matérielle prototypée avec SoCLib. 9 Ce TP possède un double objectif. D'un côté, on présente l'outil '''GDB Server''' qui est pratiquement indispensable pour déverminer une application logicielle embarquée s'exécutant sur une architecture matérielle prototypée avec SoCLib. 10 D'autre part, et puisque l'outil GDB Server permet d'analyser le comportement d'architectures multiprocesseurs, 11 on en profiter pour introduire les architectures clusterisées utilisant deux niveaux d'indexation. 11 12 12 13 = 2 Outil GDB Server = … … 45 46 (en effectuant directement des commandes de lecture ou d'écriture vers les composants adressables). 46 47 47 Il ne fautpas oublier d'inclure le "header" dans la top-cell48 Il ne fautpas oublier d'inclure le "header" dans la top-cell 48 49 {{{ 49 50 #include "gdb_server.h" … … 64 65 }}} 65 66 67 == 2.3 lancement du client GDB == 68 66 69 Une fois que le simulateur est lancé, il faut lancer (dans une autre fenêtre), l'exécution du client GDB adapté au type de processeur instancié dans la plate-forme, en lui passant en argument le nom du fichier contenant le code binaire exécuté par les processeurs de l'architecture. Pour un processeur MIPS32: 67 70 {{{ … … 73 76 (gdb) target remote Localhost:2346 74 77 }}} 78 79 == 2.4 identification des processeurs == 80 81 L'outil GDB standard permet par d'analyser le comportement d'applications multi-threads s'exécutant sur une architecture 82 monoprocesseur. Nous souhaitons ici contrôler une architecture multi-processeurs. Pour pouvoir re-utiliser le client GDB 83 standard, le GDB Server considère chaque processeur comme une thread. Pour obtenir le nombre de processeurs 84 contrôlables par GDB, il faut taper la commande : 85 {{{ 86 (gdb) info threads 87 }}} 88 Attention : la numérotation des threads ne correspond pas nécessairement à la numérotation des processors (proc_id) 89 90 == 2.5 Points d'arrêt == 91 92 La commande ''break'' (br) permet de poser des points d'arrêt correspondant à la détection 93 d'une adresse particulière dans le registre PC d'un processeur quelconque de l'architecture simulée : 94 {{{ 95 (gdb) br *0x8000180 96 }}} 97 Dans ce cas, tous les processeurs de la plate-forme s'arrêtent simultanément. 98 99 On peut également utiliser un nom de fonction plutôt qu'une adresse hexadécimale 100 {{{ 101 (gdb) br function_name 102 }}} 103 104 == 2.6 Exécution == 105 106 Lorsque l'exécution est arrété, la commande ''continue'' (c) permet de relancer l'exécution jusqu'au prochain point d'arrêt. 107 Tous les processeurs reprennent leur exécution. 108 {{{ 109 (gdb) c 110 }}} 111 112 La commande ''stepi'' permet de relancer l'exécution d'une seule instruction assembleur. Seul le processeur qui a détecté un point d'arrêt est concerné. Les autres processeurs restent bloqués: 113 {{{ 114 (gdb) stepi 115 }}} 116 117 == 2.7 Observation des registres == 118 119 La commande ''info'' permet d'afficher différentes informations. 120 {{{ 121 (gdb) info 122 }}} 123 Sans argument cette commande donne la liste des informations disponibles. 124 {{{ 125 (gdb) info reg 126 }}} 127 Avec l'argument ''reg'', elle affiche le contenu des registres du processeur qui a détecté un point d'arrêt. 128 Si on veut observer les valeurs contenues dans les registres d'un autre processeur, il faut préalablement 129 utiliser la commande ''thread n'' (où n est le numéro de la thread représentant le processeur. 130 {{{ 131 (gdb) thread n 132 (gdb) info reg 133 }}} 134 135 == 2.8 Observation/modification de la mémoire == 75 136 76 77 == 2.1 Points d'arrêt == 137 Pour observer les valeurs contenues en mémoire, on peut utiliser la commande ''examine'' (x) : 138 {{{ 139 (gdb) x/10x 0x400000 140 }}} 141 Cette commande va afficher en hexadécimal 10 mots de 32 bits à partir de l'adresse 0x400000. 142 143 Pour modifier une valeur en mémoire, on peut utiliser la commande ''set'' : 144 {{{ 145 (gdb) set *(int*)0x400000 = val 146 }}} 147 Cette commande écrit la valeur val (de type int) à l'adresse 0x400000. 78 148 79 149 = 3 Architectures Clusterisées =