2012-04-22 13 views
7

Hem gfortran 4.4 hem de intel 11.1 kullanarak birkaç modül içeren bir Fortran kodu derledim ve daha sonra gdb ve DDT kullanarak hata ayıklamaya çalıştım. Her durumda, modüllerde beyan edilen değişkenlerin değerlerini göremiyorum. Bu global değişkenler, kod hala düzgün şekilde çalıştığı için değerlere sahiptir, ancak değerlerin hata ayıklayıcılarımda olduğunu göremiyorum. Yerel değişkenler iyidir. Çevrimiçi olarak başka bir yerde bu soruna bir çözüm bulmakta zorlandım, bu yüzden belki de basit bir çözüm yoktur, ancak global değişkenlerimin değerlerini göremiyorsam kodumun hatalarını ayıklamak gerçekten zor olacaktır.Fortran modülü değişkenleri hata ayıklayıcılarda erişilemiyor

+0

Eğer bayraklarla derleme O0 ve -g Are aşağıdaki programı atın? –

+0

Bunu gördüm ve yaptığım şey, değişkenleri bir kullanıcı türüne dahil etmek ve bir genel (kaydedilmiş) kaydı tutmaktı. Ardından, hata ayıklayıcısında% ile giriş yapın (OT, hedeflerimi içerdiğinde OT% POINT_COUNT) – ja72

+1

-O0 ile birlikte Nick Atomları hile yaptı, ancak yalnızca dizi olmayan öğeler için. Optimizasyonun global değişkenlerin erişilebilir olmamasına neden olabileceğini okudum, ancak optimizasyon bayrakları kullanılmadığı takdirde derleyicinin varsayılan olarak optimizasyon yapmadığını düşündüm. Anlaşılan yanılmışım. Bununla birlikte, global dizilerimdeki herhangi bir bilgiye hala erişemiyorum. Yine, doğru şekilde okundukları ve atanmışlardır, ancak dizideki diziyi veya dizinin içindeki tüm öğeleri hata ayıklayıcıda yazdıramıyorum. – rks171

cevap

3

gdb olarak,

Bunda global değişkenlerden birini bulmak için nm ve grep kullanarak düzeni bozma hakkı olup olmadığını kontrol edebilirsiniz VariableName __ __ modulename gibi isimlerle küresel değişkenlere referansta deneyin programınızın sembolleri.

Bu işe yaramazsa, gdb'nin son bir sürümünü kullandığınızdan emin olun. ayıklama modülleri basit, http://gcc.gnu.org/ml/fortran/2005-04/msg00064.html

+1

Bu, -O0 ile derlemeye ek olarak dizi dışı öğeleri görüntülemek için çalışır. Genel değişkenleri yazdırabilirim, ancak global dizilerin değerlerini hala göremiyorum. Dizinin adını __modulename_MOD_arrayname olarak yazdırmaya çalıştığımda, görünüşte rasgele büyük bir sayı döndürülür. Dizinin bir elemanını yazdırmaya çalışırsam, -nan (0xf ...) alırım. Dizi olmayan değişkenlerin yanı sıra doğru yazdırmak için diziler nasıl edinilir herhangi bir fikir? – rks171

+1

Sadece benim ilerleyişime dikkat çekmek için intel 11.1 (bu sefer -O0 ile) oluşturmayı ve gdb ile hata ayıklamayı denedim, tüm global değişkenler ve global diziler düzgün bir şekilde çıktı. G95 ile çalışmayı ve gdb ile hata ayıklamayı denedim ve global değişkenler -O0 ile oluşturulmuş olsa bile basılmayacaklar (onları almak için yukarıda listelenen adlandırma kurallarını kullanmalıyım). Ancak küresel diziler hala basmıyor. Özetle, gfortran ve g95 ile değil gdb ile ilgili bir problem gibi görünüyor. Intel 11.1 ile bina iyi çalışıyor. – rks171

4
yeni DİBS ile

(7.2 doğru hatırlamak,):

İşte bu konuda bir iplik var.

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

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

Artık çalıştırabilirsiniz::

$ 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

Bunun için çalıştığı gdb 7.2 olması gerekir, çünkü sistemime 7.1 yükledim ve "p modname :: var" yazarak hala "Geçerli bağlamda sembol yok" ile sonuçlanıyor. Ancak, kaynak kodumu intel ifort 11.1 ile oluşturduğumda, gdb'nin yerel veya global bir değişken veya diziyi basmada herhangi bir sorun yaşamadığından, tüm bu sorunun bir gdb sorunu ve gdb sorunu olmadığını göz önünde bulundurun.Gfortran ile optimizasyon olmadan yapılanma, global değişkenleri yazdırmaya izin verirken, yine de küresel dizileri değil. – rks171