【问题标题】:Fortran debugging with gdb on Mac OS?在 Mac OS 上使用 gdb 进行 Fortran 调试?
【发布时间】:2012-12-10 21:34:02
【问题描述】:

我在使用 gdb 在 Mac OS Mountain Lion 上调试 Fortran 程序时遇到问题。当我调用

gdb (fortran executable name)

从终端,我收到以下消息:

This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries.

warning: Could not find object file "/Users/fx/devel/gcc/ibin-462-x86_64/x86_64-apple-darwin11/libgfortran/.libs/backtrace.o"
- no debug information available for "../../../gcc-4.6.2-RC-20111019/libgfortran/runtime/backtrace.c". ... (an extremely long list of analogous warnings pop up for libgcc and libquadmath libraries) ...

基本上,gdb 会在不存在的路径 (/Users/fx/...) 中搜索一堆目标文件。

除此之外,调试器似乎工作正常。有谁知道我该如何解决这个问题?

附带说明,gdb 在 C 程序上运行良好。 C 和 Fortran 编译器都运行顺畅; gcc 包含在 Xcode 命令行工具中,而 gfortran 是从单独的源安装的(路径:/usr/local/bin/gfortran)。

我尝试阅读其他几个答案,但似乎没有一个与此问题相符。

【问题讨论】:

  • 你不需要为 gcc-fortran 安装一些调试包吗?

标签: macos debugging gdb fortran shared-libraries


【解决方案1】:

您可以将 lldb 与 Fortran 一起使用。举个例子吧。

      PROGRAM test

      IMPLICIT NONE

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

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

      END PROGRAM

你可以在 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) 

有一个警告。 lldb 本身不理解 Fortran,但您仍然可以使用 C 等价物。例如,如果要检查 fortran 数组索引 array(3),则需要使用 C 等效项

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

任何具有 C 或 C++ 等价物的东西都可以工作。派生类型将像结构等一样...所有常规 lldb 命令都可以工作。您可以更改堆栈帧。你可以设置断点,你可以单步执行指令,等等……一切都会奏效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多