충돌 Emacs의 더 나은 디버깅?


9

Finder에서 시작하면 Emacs (24.3.93.1)가 제대로 실행되지만 터미널 버전이 시작된 경우 :

/Applications/Emacs.app/Contents/MacOS/Emacs -nw

이맥스와 충돌 :

Fatal error 11: Segmentation fault[1] 51512 abort /Applications/Emacs.app/Contents/MacOS/Emacs -nw.

문제는 init.el의 한 줄로 인해 발생하는 것 같습니다.

(set-face-attribute 'default nil :font "Menlo-16")

해당 줄을 주석 처리하면 터미널 버전의 Emacs도 제대로 시작됩니다.

충돌의 원인을 알아 내기 위해 몇 시간이 걸렸습니다 (내 init.el을 반으로 줄였습니다).

어쨌든 Emacs는 터미널 응용 프로그램에 지정된 글꼴 및 글꼴 크기를 상속받습니다 (기본적으로 해당 줄은 의미가 없습니다).

  1. 일반적으로 말해서 충돌하는 Emacs를 디버깅하는 더 좋은 방법이 있습니까? 아마도 더 설명적인 메시지를 인쇄하는 일종의 cli 디버거를 사용하고 있습니까?
  2. 왜 그 줄이 cli를 통해 Emacs에 충돌을 일으키지 만 Finder에서 시작하면 그렇지 않습니까?

실제로 병원에서 시작됩니까? 또는 문제를 일으키는 터미널 버전을 시작합니까? set-face-attribute 주위에 오류를 잡으시겠습니까? (condition-case err (set-face-attribute ...) (오류 (메시지 "Whoops!"))
nic ferrier

3
버그 보고서를 제출하십시오. lisp 코드로 인해 이맥스가 충돌하지 않아야합니다. 그러나 이것은 사용중인 특정 빌드에 문제가 될 수 있습니다. 공식 릴리스입니까?
Malabarba

@ nic-ferrier : 이제 init.el에 한 줄만 남았지 만 (condition-case err (set-face-attribute 'default nil :font "Menlo-16") (error (message "Whoops!")))여전히 동일한 오류 메시지와 동일한 충돌이 발생합니다. 추가 elisp-originating 메시지가 없습니다.
gsl

@ malabarba : 내가 함께 시도 GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2013-03-13 on bob.porkrind.org에서 emacsformacosx.com 및 이맥스 충돌하지 않습니다. 따라서 이후 버전에서는 버그 여야합니다. 버그 신고를하겠습니다.
gsl

1
@Malabarba가 지적했듯이 : 버그 보고서를 제출하십시오 (즉시) : M-x report-emacs-bug. 그런 다음 Emacs 개발자가 문제점을 디버그하는 데 도움이되는 작업을 안내합니다.
Drew

답변:


6

다음에 추적 할 수 있도록

이것은 전에 나에게 일어났다. string-to-int이맥스 가 추락 한 상황이 있었는데, 정확히 지적하는데 몇 시간이 걸렸습니다.
더 좋은 답변을 제공 할 수는 없지만 죄송하지만 C 코드에서 Emacs 충돌이 발생하며 이러한 문제를 추적하는 데 사용할 수있는 기본 제공 도구가 없습니다.

나는 그것을 디버깅하는 gdb것이 가능하다고 생각 하지만 그 효율성은에 대한 귀하의 숙련도에 달려 있습니다 gdb.

당신이 정말로해야 할 일은

버그 신고 제출

바이트 단위로 컴파일되지 않은 순수 elisp 코드는 Emacs와 충돌하지 않아야합니다. 무한 루프로 인해 정지가 발생하고 Emacs에 메모리가 부족할 수 있습니다. 그러나 그 이상으로 모든 충돌은 버그 입니다.

M-x report-emacs-bug

빌드와 시스템에 대한 설명과 함께이 최소한의 작동 예제를 제공하는 것은 친절한 개발자에게 충분한 도움이 될 것입니다.


2
gdb를 사용하는 것이 유일한 방법입니다. 우리는 Emacs에 모든 C 호출을 스스로 잡을 수는 있지만 항상 오버 헤드가되는 것으로 래핑하기 위해 물건을 추가 할 수 있습니다. Emacs는 충돌하지 않을 것입니다. 더 이상 버그가 발생하지 않도록 버그를 구체적으로 처리해야합니다. 예, 고장이 나면 버그를 신고하십시오. gdb를 사용하여 버그가 어디에 있는지 절대적으로 찾으십시오.
nic ferrier

4

gdb로 디버그하는 것에 대한 참조로 빌드 트리에서 src / temacs를 사용하려고합니다. 디버거를 혼동시키는 사전 덤프 된 elisp가없는 Emacs입니다.

gdb --args src/temacs -nw

1
감사합니다, 훌륭한 조언 (그리고 쉽게 찾을 수는 없습니다). 감사.
gsl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.