Debugging 使用GDB在Fortran(MAC)中调试MPI程序
我用这篇文章()的答案在我的Mac上调试一个MPI Fortran程序。我试图实现Vladimir F给出的答案。但是,在:Debugging 使用GDB在Fortran(MAC)中调试MPI程序,debugging,emacs,fortran,gdb,mpi,Debugging,Emacs,Fortran,Gdb,Mpi,我用这篇文章()的答案在我的Mac上调试一个MPI Fortran程序。我试图实现Vladimir F给出的答案。但是,在: gdb -pid <the_pid_you_got_from_getpid> 我得到了“没有可用的符号表信息”。因此,我无法将gdb附加到正在运行的进程 我正在使用MacOS 10.12(Sierra)、gdb 8.0,并使用为ifort配置的mpif90(版本:17.0.4)进行编译 关于我的问题的原因,你有什么想法吗?如果你对gdb没有那么投入(事实上
gdb -pid <the_pid_you_got_from_getpid>
我得到了“没有可用的符号表信息”
。因此,我无法将gdb附加到正在运行的进程
我正在使用MacOS 10.12(Sierra)、gdb 8.0,并使用为ifort配置的mpif90(版本:17.0.4)进行编译
关于我的问题的原因,你有什么想法吗?如果你对gdb没有那么投入(事实上,gdb在mac os上作为默认工具链的一部分被弃用),你可以使用lldb 因此,对于这样的代码:
program main
use mpi
integer error
integer id
integer p
call MPI_Init ( error )
call MPI_Comm_size ( MPI_COMM_WORLD, p, error )
call MPI_Comm_rank ( MPI_COMM_WORLD, id, error )
write (*,*) 'Hello: ', id, '/', p
call MPI_Finalize ( error )
stop
end
像这样的编辑
mpif90 -g -o fort ./fort.f90
mpirun -np 2 xterm -e gdb ./mpi_sample
您应该能够按照以下方式启动lldb
mpirun -np 2 xterm -e lldb ./fort
这将为您提供两个单独的XTERM,并运行lldb
请注意,对于xterm,您需要安装XQuartz()
更新:
我不确定这是否有助于解决这个问题,但您可以尝试从源代码编译GDB。请查看此处,了解如何执行此操作的说明:
然后,您可以使用xterm和gdb以及您的MPI代码运行mpirun,如下所示
mpif90 -g -o fort ./fort.f90
mpirun -np 2 xterm -e gdb ./mpi_sample
现在,您可以看到dyld版本仍然存在警告,但代码似乎工作正常
但问题仍然是,ifort编译代码会发生什么情况:(在我的例子中,我使用:
mpifort --version
GNU Fortran (GCC) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
gdb --version
GNU gdb (GDB) 8.0
Copyright (C) 2017 Free Software Foundation, Inc.
mpirun --version
mpirun (Open MPI) 2.0.2
请演示如何编译代码。您必须告诉编译器通过
-g
生成调试符号。此外,动态库和调试符号有多种不同格式,gdb可能不支持您的当前设置。感谢您的回答。我使用mpif90-ggdb test.f90编译,然后使用mpirun-n 2运行./a.out.我还尝试了mpif90-g main.f90。它也不起作用。用ifort直接编译的简单串行程序怎么样?我可以编译并调试它,没有问题。您可以使用(lldb)进程附加--pid 123
或(lldb)附加-p 123
,以实现与问题中链接的功能类似的功能。您确认lldb支持英特尔Fortran吗?我没有iFortran编译器:(对此不能说:(尽管如此,我想至少值得一试。是的,的确如此。看起来OP在调试器和某个库之间存在一些不兼容。不同的调试器可以修复它。