2012-04-22 26 views
7

Tôi đã biên soạn mã Fortran, chứa một số mô-đun, sử dụng cả gfortran 4.4 và intel 11.1 và sau đó đã cố gắng gỡ lỗi bằng cách sử dụng cả gdb và DDT. Trong mọi trường hợp, tôi không thể thấy giá trị của bất kỳ biến nào được khai báo trong mô-đun. Các biến toàn cầu này có giá trị, vì mã vẫn chạy đúng, nhưng tôi không thể thấy giá trị trong các trình gỡ lỗi của mình. Các biến cục bộ là tốt. Tôi đã gặp khó khăn trong việc tìm giải pháp cho vấn đề này ở nơi khác trực tuyến, vì vậy có lẽ không có giải pháp đơn giản, nhưng thực sự khó gỡ lỗi mã của tôi nếu tôi không thể thấy giá trị của bất kỳ biến toàn cục nào của mình.Biến mô-đun Fortran không thể truy cập trong các trình gỡ rối

+0

Bạn đang biên soạn với cờ -O0 và -G? –

+0

Tôi đã nhìn thấy điều này, và những gì tôi đã làm là để kèm theo các biến trong một loại người dùng, và giữ một bản ghi toàn cầu (đã lưu). Sau đó, bạn truy cập vào trình gỡ lỗi với% (ví dụ: OT% POINT_COUNT khi OT chứa số gobals của tôi) – ja72

+1

Để các nguyên tử Nick, biên dịch với -O0 thực hiện thủ thuật, nhưng chỉ với các phần tử không phải mảng. Tôi đọc rằng tối ưu hóa có thể gây ra các biến toàn cầu để không thể truy cập được, nhưng tôi nghĩ rằng nếu không có cờ tối ưu nào được sử dụng, thì trình biên dịch không tối ưu hóa theo mặc định. Rõ ràng, tôi đã sai. Tuy nhiên, tôi vẫn không thể truy cập bất kỳ thông tin nào trong mảng toàn cầu của mình. Một lần nữa, chúng đang được đọc và gán giá trị một cách chính xác, nhưng tôi không thể in toàn bộ mảng hoặc bất kỳ phần tử riêng lẻ nào trong mảng trong trình gỡ rối. – rks171

Trả lời

3

Trong gdb, hãy thử tham khảo các biến toàn cầu với những cái tên như __ modulename __ variablename

Bạn có thể kiểm tra rằng đây là quyền mangling kế hoạch sử dụng nm và grep để tìm một trong các biến toàn cục của bạn trong biểu tượng của chương trình của bạn.

Nếu cách đó không hiệu quả, hãy đảm bảo bạn đang sử dụng phiên bản gdb gần đây.

Dưới đây là một chủ đề về vấn đề này: http://gcc.gnu.org/ml/fortran/2005-04/msg00064.html

+1

Điều này làm việc để hiển thị các phần tử không phải mảng ngoài biên dịch với -O0. Tôi có thể in các biến toàn cầu, nhưng tôi vẫn không thể thấy các giá trị của mảng toàn cục. Khi tôi cố gắng in tên của mảng như __modulename_MOD_arrayname, một số số lớn dường như ngẫu nhiên được trả về. Nếu tôi cố gắng in một phần tử của mảng, tôi lấy -nan (0xf ...). Bất kỳ ý tưởng làm thế nào để có được mảng để in ra một cách chính xác cũng như các biến mảng không? – rks171

+1

Chỉ cần lưu ý về sự tiến bộ của tôi, tôi đã thử xây dựng với intel 11.1 (với -O0 lần này) và gỡ lỗi với gdb, và tất cả các biến toàn cầu và mảng toàn cầu in ra đúng cách. Tôi đã thử xây dựng với g95 và gỡ lỗi với biến gdb và toàn cầu sẽ không in ra ngay cả khi được xây dựng với -O0 (tôi phải sử dụng quy ước đặt tên được liệt kê ở trên để nhận chúng). Nhưng mảng toàn cầu vẫn không in ra. Tóm lại, có vẻ như đó là vấn đề với gfortran và g95 chứ không phải gdb. Và xây dựng với intel 11.1 hoạt động tốt. – rks171

4

Với GDBs mới hơn (7.2 nếu tôi nhớ chính xác), mô-đun gỡ lỗi rất đơn giản. Đi theo chương trình sau:

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

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

Bây giờ bạn có thể chạy:

$ 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

Nó phải là gdb 7.2 mà điều này làm việc vì tôi đã cài đặt 7.1 trên hệ thống của tôi và gõ "p modname :: var" vẫn còn kết quả trong "Không có biểu tượng trong bối cảnh hiện tại". Tuy nhiên, lưu ý rằng toàn bộ vấn đề này có vẻ là vấn đề gfortran chứ không phải vấn đề gdb, như khi tôi xây dựng mã nguồn của mình với ifort intel 11.1, gdb không có vấn đề gì trong việc in một biến cục bộ hoặc toàn cục hoặc mảng.Xây dựng không có tối ưu hóa với gfortran cho phép in toàn cầu biến nhưng vẫn không mảng toàn cầu. – rks171

Các vấn đề liên quan