Идеи по устранению ошибок emacs: "apply: порождение дочернего процесса: ошибка формата exec"
Я пытаюсь использовать rdebug с emacs и cygwin, и у меня проблемы. Всякий раз, когда я делаю Mx rdebug и даю ему соответствующий скрипт для запуска, он останавливается с ошибкой
"apply: Spawning child process: exec format error"
После некоторого поиска в Google кажется, что это может произойти, если я пытаюсь запустить исполняемый файл cygwin через командную строку Windows или наоборот. Это также может произойти, если путь к исполняемому файлу является ссылкой в стиле Unix.
Я пытаюсь выяснить место, из которого выполняется rdebug, чтобы проверить, какая из них является проблемой и как ее исправить.
До сих пор я пробовал следующее, но без радости: * Используйте edebug на rdebug и его вызывающих пользователях: это привело меня к gud-common-init, и я быстро заблудился, пытаясь выяснить, где происходит вызов exec. * Попробуйте переключить оболочку с cygwin на windows и обратно, чтобы увидеть, есть ли разница: вообще нет разницы.
Обратите внимание, что я могу запустить rdebug из моей оболочки Windows, а также из оболочки Cygwin (вызывается через оболочку Mx). Я предполагаю, что /usr/bin/rdebug и /usr/bin/rdebug.bat как-то связаны с этим.
Любые идеи, чтобы исправить это или отладить эту проблему, были бы действительно хороши.
Некоторый прогресс
Мне удалось выяснить, что я могу повторить ту же проблему, пытаясь выполнить rdebug с помощью comint-run (Mx comint-run ENTER rdebug ENTER). После некоторой отладки и обработки кода, похоже, что emacs вызывает start-file-process (аналогично comint-run), чтобы запустить процесс rdebug.
У меня также есть следующее при загрузке Cygwin:
;;; Use `bash' as the default shell in Emacs.
(setq exec-path (cons cygwin-bin exec-path))
(setq shell-file-name (concat cygwin-bin "/bash.exe")) ; Subprocesses invoked via the shell.
(setenv "SHELL" shell-file-name)
(setenv "PATH" (concat
(getenv "PATH")
(concat ";" (substring data-directory 0 2) "\\cygwin\\bin")) )
(setq explicit-shell-file-name shell-file-name) ; Interactive shell
(setq explicit-shell-args '("--login" "-i"))
(setq w32-quote-process-args ?\") ;; "
Больше прогресса
Временное переименование rdebug.bat показало, что comint-run вызывал rdebug.bat через оболочку dos. Я бы хотел, чтобы rdebug вызывался через оболочку bash при запуске comint-run. Любые идеи о том, как указать, какую оболочку Comint-Run использует?
1 ответ
У меня та же проблема, и я нашел следующий простой способ.
После ввода Mx rdebug он предлагает выполнить команду. Следующая команда отображается как настройка по умолчанию:
Run rdebug (like this): rdebug --emacs 3 hanoi.rb
Изменение этой команды для:
Run rdebug (like this): ruby /usr/bin/rdebug --emacs 3 hanoi.rb
сможет обойти сообщенную проблему.