Debugging MPI codes with GDB

Simple example of debugging a single process of a multi-process C++ MPI program on Kay is as follows.

Create a file named hello_mpi.cpp with contents

#include <mpi.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    MPI_Init( &argc, &argv );
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    printf("Hello from %d, received %d args\n", rank, argc);

    MPI_Finalize();
    return 0;
}

Launch an interactive session on a compute node using

srun -A <account-name> --time=1:00:00 -p DevQ --pty bash

Load the Intel module with

module load intel/2018u4

set the I_MPI_CXX environment variable with

export I_MPI_CXX=icpc

Build the code with -g flag to include symbols and -O0 flag to disable compiler optimizations

mpicxx -g -O0 -o hello_mpi hello_mpi.cpp

When launching the MPI with gdb, will need to set a breakpoint beyond the call to MPI_Init and tell the debugger to run to this point. This can be done by creating a command file and passing it to gdb using the -x flag. For example, create a file named gdb_cmds.txt with

break hello_mpi.cpp:9
run

To run the MPI code and attach the debugger to a single process, use the --multi-prog switch for srun (see "MULTIPLE PROGRAM CONFIGURATION" of the srun manual page for more details). Create a multi-program configuration file named multi_prog.conf with contents

0 hello_mpi 1 2
1 gdb -x gdb_cmds.txt hello_mpi 34
2-3 hello_mpi 2 3

which will launch the hello_mpi program on processes 0, 2 and 3 (with arguments 1 2 on process 0 and arguments 2 3 on processes 2 and 3) and on process 1 a gdb session looking at the hello_mpi program which should run until it gets to line 9 of the code.

From here, regular gdb commands can be used although there appear to be some issues with the formatting in the console. Exiting this can be done using the quit command and it might be necessary to hit Ctrl-C a few times to get back to the console.

Supported By

File Browser Reference
Department FHERIS
University of Galway
HEA Logo