gdb - 为什么gdb在调试MPI程序时来回走动?

标签 gdb mpi

请问有人遇到过以下情况吗?

出于调试目的,我通过使用“mpi-run -np 1”启动基于 mpi 的程序,仅使用了一个 mpi 进程。然而,当我调试程序时,经常会发生重复的单步执行和单步执行。

所以,假设我逐行跟踪源代码,直到到达感兴趣的点。然后我尝试介入,并输入“n”期望继续一行。但是,调试器会返回到函数的第一行。只有经历过两三次之后,我才能继续。

印象是调试器没有做错什么,因为结果被认为是正确的。我真的很好奇它发生的原因。

提前致谢!

最佳答案

观察到的行为通常是编译器优化处于事件状态的结果。优化可能会导致二进制代码不完全遵循源代码的结构 - 它仍然给出相同的结果,但编译器以更有效地执行的方式重新排列操作。此外,某些函数可能会被内联。结果,调试信息中的指令范围和源代码行之间的对应关系变得毫无用处。

在进行源代码级调试时,请始终确保对大多数编译器使用 -O0 标志关闭优化,或者对 Sun/Oracle 编译器不提供任何优化标志。请注意,某些编译器选项可能会导致优化级别升高。例如,使用 -xopenmp 在 Sun/Oracle Studio 中启用 OpenMP 支持会自动将优化级别提升到 -xO3。相反,应使用 -xopenmp=noopt 并且不明确指定优化级别。此外,某些编译器默认会进行优化,例如英特尔的编译器。

关于gdb - 为什么gdb在调试MPI程序时来回走动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22753419/

相关文章:

linux - 核心转储文件格式

c++ - 在 GDB 启动时禁用名称 demangling

mpi - SLURM:如何在同一计算节点或不同节点上并行运行不同的可执行文件?

c - MPI多线程中的vfork VS fork

GDB - 附加和中断正在运行的 Go 应用程序

Rust 发现,配置文件未按预期工作

c - 必须将函数 sscanf 分配给变量,否则会出现奇怪的行为

c++ - 使用 MPI 发送二维数组

c++ - 如何防止并行代码耗尽所有可用的系统内存?

linux - 使用 mpirun 时,如何使分析器(valgrind、perf、pprof)获取/使用带有调试符号的本地版本的库?