Возникли проблемы с использованием GDB для отладки MPI-кода

#c #debugging #gdb #openmpi

#c #отладка #gdb #openmpi

Вопрос:

Я пытаюсь использовать GDB, чтобы узнать, что происходит с низкоуровневыми вызовами OPEN MPI. Однако я не смог использовать GDB для перехода к низкоуровневым библиотечным функциям в OpenMPI.

Сначала я скомпилировал OpenMPI с тегом «—enable-debug —включить отладку символов», поэтому библиотека должна быть скомпилирована с тегом «-g». Затем я компилирую свой тестовый код, используя «mpicc / path /to / my / code -g -o / dest / code». Код прост, показан как показано ниже:

 #include "mpi.h"
#include <stdio.h>

main(int argc, char *argv[]) {
    int numtasks, rank, dest, source, rc, count, tag=1;
    int buf;
    const int root=0;
    MPI_Status Stat;

    // sleep still GDB attached
    int i = 0;
    char hostname[256];
    gethostname(hostname, sizeof(hostname));
    printf("PID %d on %s ready for attachn", getpid(), hostname);
    fflush(stdout);
    while (0 == i)
        sleep(5);

    MPI_Init(amp;argc,amp;argv);
    MPI_Comm_size(MPI_COMM_WORLD, amp;numtasks);
    MPI_Comm_rank(MPI_COMM_WORLD, amp;rank);

    if(rank == root) {
        buf = 777;
    }

    printf("[%d]: Before Bcast, buf is %dn", rank, buf);

    MPI_Bcast(amp;buf, 1, MPI_INT, root, MPI_COMM_WORLD);

    printf("[%d]: After Bcast, buf is %dn", rank, buf);

    MPI_Finalize();
}
  

Этот код сначала распечатает PID для каждого процесса, затем сохранит режим ожидания для присоединения. Затем я использую метод GDB attach для подключения одного из процессов. Установите точку останова и сбросьте значение i will jump out из цикла ожидания while.

Затем я продолжаю использовать «s» для следующего шага моего кода. Предполагалось, что он перейдет к низкоуровневым библиотечным функциям, таким как MPI_Init(), MPI_Bcast(). Однако GDB просто перейдет к следующей строке и проигнорирует переход к любой функции. Ни один «bt» не смог распечатать информацию обратного отслеживания. Но весь код может выполняться без ошибок.

Может ли кто-нибудь найти какую-либо ошибку, которую я допустил во всем этом процессе? Заранее благодарю.

Комментарии:

1. Обычно, если step не запускается вызов, это означает, что либо нет debuginfo, либо вы установили skip . Поэтому я бы убедился, что в библиотеке действительно есть debuginfo и что правильная библиотека выбирается во время выполнения.