2012-04-22 17 views
7

Złożyłem kod Fortrana, który zawiera kilka modułów, używając zarówno gfortran 4.4 jak i intel 11.1, a następnie próbował debugować go za pomocą gdb i DDT. We wszystkich przypadkach nie widzę wartości żadnych zmiennych zadeklarowanych w modułach. Te zmienne globalne mają wartości, ponieważ kod nadal działa poprawnie, ale nie widzę, jakie wartości znajdują się w moich debuggerach. Zmienne lokalne są w porządku. Mam problem ze znalezieniem rozwiązania tego problemu w innym miejscu w Internecie, więc być może nie ma prostego rozwiązania, ale będzie naprawdę trudno debugować mój kod, jeśli nie widzę wartości żadnej z moich zmiennych globalnych.Zmienne modułowe Fortran nie są dostępne w debuggerach

+0

Czy kompilacji z flagami -O0 i -g? –

+0

Widziałem to, a co zrobiłem, to ująć zmienne w typie użytkownika i zachować jeden rekord globalny (zapisany). Następnie uzyskujesz dostęp do debuggera za pomocą% (np. OT% POINT_COUNT, gdy OT zawiera moje gobale). – ja72

+1

Do Nicka Atomy, kompilując z -O0, udało się, ale tylko dla elementów nie będących tablicami. Czytałem, że optymalizacja może spowodować, że zmienne globalne nie będą dostępne, ale pomyślałem, że jeśli nie użyto żadnych flag optymalizacyjnych, to kompilator domyślnie nie dokonał optymalizacji. Najwyraźniej się myliłem. Nadal jednak nie mam dostępu do żadnych informacji w moich globalnych tablicach. Znów są one odczytywane i przypisywane wartości poprawnie, ale nie mogę wydrukować całej tablicy ani poszczególnych elementów w tablicy w debugerze. – rks171

Odpowiedz

3

W gdb, próby odwoływania się do zmiennych globalnych o nazwach takich jak __ modulename __ variableName

Można sprawdzić, że jest to prawo maglowania schemat używając nm i grep, aby znaleźć jeden z globalnych zmiennych w symbole twojego programu.

Jeśli to nie pomoże, upewnij się, że używasz najnowszej wersji gdb.

Oto wątek na ten temat: http://gcc.gnu.org/ml/fortran/2005-04/msg00064.html

+1

Powoduje to wyświetlanie elementów nie zawierających tablic oprócz kompilacji z -O0. Mogę drukować zmienne globalne, ale nadal nie widzę wartości tablic globalnych. Kiedy próbuję wydrukować nazwę tablicy jako __modulename_MOD_arrayname, zwracana jest pewna losowa duża liczba. Jeśli spróbuję wydrukować jeden element tablicy, otrzymam -nan (0xf ...). Masz pomysł, jak poprawnie wydrukować tablice, a także zmienne nieszablonowe? – rks171

+1

Po prostu, aby zauważyć na moim postępie, próbowałem budować z intel 11.1 (z -O0 tym razem) i debugowaniem za pomocą gdb, a wszystkie zmienne globalne i globalne tablice są drukowane poprawnie. Próbowałem budować za pomocą G95, a debugowanie za pomocą gdb i zmiennych globalnych nie będzie drukowane, nawet jeśli zbudowane jest z -O0 (muszę użyć konwencji nazewnictwa wymienionej powyżej, aby je uzyskać). Ale globalne tablice nadal nie są drukowane. Podsumowując, wydaje się, że jest to problem z gfortran i g95, a nie gdb. I budowanie z intel 11.1 działa dobrze. – rks171

4

Z nowszych GDBs (7,2 jeśli dobrze pamiętam), moduły debugowania jest prosta. Weźmy następujący program:

module modname 
    integer :: var1 = 1 , var2 = 2 
end module modname 

use modname, only: newvar => var2 
newvar = 7 
end 

Teraz można uruchomić:

$ gfortran -g -o mytest test.f90; gdb --quiet ./mytest 
Reading symbols from /dev/shm/mytest...done. 
(gdb) b 6 
Breakpoint 1 at 0x4006a0: file test.f90, line 6. 
(gdb) run 
Starting program: /dev/shm/mytest 
Breakpoint 1, MAIN__() at test.f90:6 
6  newvar = 7 
(gdb) p newvar 
$1 = 2 
(gdb) p var1 
No symbol "var1" in current context. 
(gdb) p modname::var1 
$2 = 1 
(gdb) p modname::var2 
$3 = 2 
(gdb) n 
7  end 
(gdb) p modname::var2 
$4 = 7 
(gdb) 
+1

To musi być gdb 7.2, dla którego to działa, ponieważ mam zainstalowany 7.1 w moim systemie i wpisanie "p modname :: var" nadal powoduje "Brak symbolu w bieżącym kontekście". Należy jednak zauważyć, że cały ten problem wydaje się problemem gfortran, a nie problemem gdb, ponieważ kiedy zbudowałem swój kod źródłowy za pomocą intel ifort 11.1, gdb nie miał problemu z drukowaniem lokalnej lub globalnej zmiennej lub tablicy.Budowanie bez optymalizacji za pomocą gfortran umożliwiło drukowanie zmiennych globalnych, ale nadal nie jest tablicami globalnymi. – rks171

Powiązane problemy