Идеи по устранению ошибок emacs: «apply: порождение дочернего процесса: ошибка формата exec» - PullRequest
1 голос
/ 14 февраля 2010

Я пытаюсь использовать rdebug с emacs и cygwin, и у меня возникают проблемы. Всякий раз, когда я делаю M-x rdebug и даю ему соответствующий скрипт для запуска, он останавливается с ошибкой

 "apply: Spawning child process: exec format error"

Из некоторых поисковиков кажется, что это может произойти, если я пытаюсь запустить исполняемый файл cygwin через командную строку Windows или наоборот. Это также может произойти, если путь к исполняемому файлу является ссылкой в ​​стиле Unix.

Я пытаюсь выяснить место, из которого выполняется rdebug, чтобы проверить, какая из них является проблемой и как ее исправить.

До сих пор я пробовал следующее, но без радости: * Используйте edebug на rdebug и его вызывающих: это привело меня к gud-common-init, и я быстро заблудился, пытаясь выяснить, где происходит вызов exec. * Попробуйте переключить оболочку с cygwin на windows и обратно, чтобы увидеть, есть ли разница: вообще нет разницы.

Обратите внимание, что я могу запустить rdebug из моей оболочки Windows, а также из оболочки Cygwin (вызывается через оболочку M-x). Я предполагаю, что / usr / bin / rdebug и /usr/bin/rdebug.bat как-то связаны с этим.

Любые идеи, чтобы исправить это или отладить эту проблему, были бы действительно хороши.

Некоторый прогресс

Мне удалось выяснить, что я могу повторить ту же проблему, пытаясь выполнить rdebug с помощью comint-run (M-x 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 Ответ

1 голос
/ 26 июля 2011

У меня та же проблема, и я нашел следующий простой способ.

После ввода M-x rdebug он предлагает выполнить команду. Следующая команда отображается как настройка по умолчанию:

Run rdebug (like this): rdebug --emacs 3 hanoi.rb

Изменение этой команды на:

Run rdebug (like this): ruby /usr/bin/rdebug --emacs 3 hanoi.rb

сможет обойти сообщенную проблему.

...