#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 и что правильная библиотека выбирается во время выполнения.