4 votes

Débogage Fortran avec gdb sur Mac OS?

J'ai des problèmes pour déboguer des programmes Fortran sur Mac OS Mountain Lion avec gdb. Lorsque j'invoque

gdb (nom du binaire fortran)

à partir d'un terminal, je reçois le message suivant :

Ce GDB a été configuré comme "x86_64-apple-darwin"... Lecture des symboles pour les bibliothèques partagées.

warning: Impossible de trouver le fichier objet "/Users/fx/devel/gcc/ibin-462-x86_64/x86_64-apple-darwin11/libgfortran/.libs/backtrace.o"
- aucune information de débogage disponible pour "../../../gcc-4.6.2-RC-20111019/libgfortran/runtime/backtrace.c". ... (une liste extrêmement longue de mises en garde analogues apparaît pour les bibliothèques libgcc et libquadmath) ...

En gros, gdb recherche une série de fichiers objets dans des chemins (/Users/fx/...) qui n'existent pas.

Mis à part cela, le débogueur semble fonctionner correctement. Est-ce que quelqu'un sait comment je peux résoudre ce problème?

À noter, gdb fonctionne parfaitement sur les programmes C. Les compilateurs C et Fortran fonctionnent bien ; gcc était inclus dans les outils en ligne de commande de Xcode, tandis que gfortran a été installé à partir d'une source séparée (chemin : /usr/local/bin/gfortran).

J'ai essayé de lire plusieurs autres réponses mais aucune ne semblait correspondre à ce problème.

2voto

user1139069 Points 563

Vous pouvez utiliser lldb avec Fortran. Prenez un exemple de programme.

      PROGRAM test

      IMPLICIT NONE

      INTEGER                :: i
      INTEGER, DIMENSION(10) :: array

      DO i = 1, 10
         array(i) = i
      END DO

      END PROGRAM

Vous pouvez exécuter ceci dans lldb

$ lldb -- test
(lldb) target create "test"
Current executable set to 'test' (x86_64).
(lldb) b test.f:9
Breakpoint 1: where = test`test + 17 at test.f:9, address = 0x0000000100000eac
(lldb) run
Process 869 launched: '/Users/mark/Desktop/test' (x86_64)
Process 869 stopped
* thread #1: tid = 0xb5f5, 0x0000000100000eac test`test + 17 at test.f:9, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000eac test`test + 17 at test.f:9
   6          INTEGER, DIMENSION(10) :: array
   7    
   8          DO i = 1, 10
-> 9             array(i) = i
   10         END DO
   11   
   12         END PROGRAM
(lldb) c
Process 869 resuming
Process 869 stopped
* thread #1: tid = 0xb5f5, 0x0000000100000eac test`test + 17 at test.f:9, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000eac test`test + 17 at test.f:9
   6          INTEGER, DIMENSION(10) :: array
   7    
   8          DO i = 1, 10
-> 9             array(i) = i
   10         END DO
   11   
   12         END PROGRAM
(lldb) c
Process 869 resuming
Process 869 stopped
* thread #1: tid = 0xb5f5, 0x0000000100000eac test`test + 17 at test.f:9, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000eac test`test + 17 at test.f:9
   6          INTEGER, DIMENSION(10) :: array
   7    
   8          DO i = 1, 10
-> 9             array(i) = i
   10         END DO
   11   
   12         END PROGRAM
(lldb) c
Process 869 resuming
Process 869 stopped
* thread #1: tid = 0xb5f5, 0x0000000100000eac test`test + 17 at test.f:9, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000eac test`test + 17 at test.f:9
   6          INTEGER, DIMENSION(10) :: array
   7    
   8          DO i = 1, 10
-> 9             array(i) = i
   10         END DO
   11   
   12         END PROGRAM
(lldb) p array
(int [11]) $0 = ([0] = 1, [1] = 2, [2] = 3, [3] = 0, [4] = 0, [5] = 0, [6] = 0, [7] = 0, [8] = 0, [9] = 0, [10] = 0)
(lldb) 

Il y a un inconvénient. lldb ne comprend pas nativement Fortran mais vous pouvez toujours utiliser les équivalents en C. Par exemple, si vous voulez inspecter l'index du tableau fortran array(3), vous devez utiliser l'équivalent en C de

(lldb) p array[2]
(int) $1 = 3
(lldb)

Tout ce qui a un équivalent en C ou C++ fonctionnera. Les types dérivés agiront comme des structures, etc... Toutes les commandes régulières de lldb fonctionneront. Vous pouvez changer de cadres de pile. Vous pouvez définir des points d'arrêt, vous pouvez suivre les instructions, etc... tout fonctionnera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X