Как запустить gdb в gnome-терминал из mpirun? - PullRequest
0 голосов
/ 25 мая 2019

У меня есть программа, которая использует mpi.Для отладки я могу использовать mpirun -np 2 xterm -e gdb myprog.

Однако xterm на моей машине глючит.Я хочу попробовать gnome-терминал, но я не знаю, что печатать.Я пробовал:

1) mpirun -np 2 gnome-terminal -- gdb myprog

2) mpirun -np 2 gnome-terminal -- "gdb myprog"

3) mpirun -np 2 gnome-terminal -- bash -c "gdb myprog"

4) mpirun -np 2 gnome-terminal -- bash -c "gdb myprog; exec bash"

Но ни один из них, похоже, не работает;1), 3), 4) говорят после run в GDB:

Похоже, MPI_INIT не удалось по какой-то причине;Ваш параллельный процесс может прерваться.Есть много причин, по которым параллельный процесс может завершиться с ошибкой во время MPI_INIT;некоторые из которых связаны с конфигурацией или проблемами среды.Эта ошибка, кажется, внутренняя ошибка;Вот некоторая дополнительная информация (которая может иметь отношение только к разработчику Open MPI):

ompi_mpi_init: ompi_rte_init failed

-> Returned "(null)" (-43) вместо "Success""(0)

-------------------------------------------------------------------------

*** Произошла ошибка в MPI_Init

*** на коммуникаторе NULL

*** MPI_ERRORS_ARE_FATAL (процессы в этом коммуникаторе теперь прервутся,

*** и, возможно, ваша работа MPI)

[oleg-VirtualBox: 4169] Локальный прерывание до успешного завершения MPI_INIT, но я не могу объединить сообщения об ошибках и не может гарантировать, что все другие процессы были уничтожены!

[Выход из Inferior 1 (процесс 4169) завершилсяс кодом 01]

В 2) терминал говорит:

Произошла ошибка при создании дочернего процесса для этого терминала

Не удалось выполнить дочерний процесспроцесс «приложение gdb» (нет такого файла или каталога)

Кстати, я использую Ubuntu 18.04.02 LTS.

Что я делаю не так?

РЕДАКТИРОВАТЬ: Как выясняется, это не Xterm, который глючит, это GDB с -вариант туи.Если ваша программа что-то печатает, окно GDB начнет отображать вещи неправильно, независимо от того, в каком терминале.

1 Ответ

2 голосов
/ 25 мая 2019

Проблема в том, что gnome-терминал передает запрашиваемую программу серверу терминалов и сразу же завершает работу.Затем mpirun видит, что запущенная программа завершилась, и уничтожает среду выполнения MPI.Когда программа MPI действительно запускается, mpirun уже завершился.Насколько мне известно, нет никакого способа заставить gnome-терминал ждать, пока данная команда не закончится.

Существует обходной путь: вместо непосредственного запуска gnome-терминала с mpirun вместо двух сценариев-оболочек,Первый запускается mpirun.Он создает временный файл, сообщает gnome-terminal запустить вторые сценарии оболочки, а затем ожидает, пока временный файл не исчезнет.Второй скрипт-обертка запускает команду, которую вы на самом деле хотите запустить, например, gdb myprog, ждет, пока она не закончится, а затем удаляет временный файл.В этот момент первая оболочка замечает, что временный файл исчез и выходит.Затем mpirun может безопасно уничтожить среду MPI.

Вероятно, это проще понять из самих сценариев.

debug.sh:

#!/bin/bash
# This is run outside gnome-terminal by mpirun.

# Create a tmp file that we can wait on.
export MY_MPIRUN_TMP_FILE="$(mktemp)"

# Start the gnome-terminal. It will exit immediately.
# Call the wrapper script which removes the tmp file
# after the actual command has ended.
gnome-terminal -- ./helper.sh "$@"

# Wait for the file to disappear.
while [ -f "${MY_MPIRUN_TMP_FILE}" ] ; do
    sleep 1
done

# Now exit, so mpirun can destroy the MPI environment
# and exit itself.

helper.sh

#!/bin/bash
# This is run by gnome-terminal.

# The command you actually want to run.
"$@"

# Remove the tmp file to show that the command has exited.
rm "${MY_MPIRUN_TMP_FILE}"

Запустите его как mpirun debug.sh gdb myproc.

...