emacs 충돌을 어떻게 디버깅합니까?


16

패키지 1 의 함수를 사용할 때 emacs가 충돌하는 이유를 디버깅하고 있습니다 . 이 디버그 프로세스의 목적은를 사용하여 제출할 유용한 데이터를 얻는 것 M-x report-emacs-bug입니다.

emacs 충돌을 디버깅하는 방법에 대한 도움말을 보려면 이미 Emacs Manual-Crashing and Emacs Manual-After A Crash 를 보았지만 도움이되지 않았습니다.

후 충돌 설명서를 참조 emacs-buffer.gdb하지만 난 그것을 사용하는 방법을 모른다. Google에 도움을 요청하는 동안 이 emacs.SE 질문을 발견하고 -ggdb3플래그를 사용하여 emacs를 다시 컴파일했습니다 .

이전에 사용한 경험이 없으므로 파일 gdb을 사용하려는 시도가 거의 실패했습니다 emacs-buffer.gbd.

내가 시도한 것은 다음과 같습니다.

  • gdb -x /path/to/emacs-buffer.gdb
  • gdb -> file /path/to/emacs-buffer.gdb
  • gdb -> source /path/to/emacs-buffer.gdb
  • source /path/to/emacs-buffer.gdb

참고로, -ggdb3플래그로 컴파일 된 emacs 는로드하는 데 약 10 초가 더 걸립니다. 이전에는 5-6 초, 현재 약 16-17 초였습니다. 내 init에서 그것을 계산하는 코드 때문에 정확한 초를 알고 있습니다. 이 시작 시간 증가가 예상됩니까?


각주 1 : undo-tree특정 .org 파일 (공개적으로 공유 할 수 없음)에 대한 실행 취소 기록을 복원하려고 하면 emacs가 일관되게 충돌 합니다. 나는있다 (setq undo-tree-auto-save-history t). 이 충돌은 emacs 24.5가 아닌 emacs git master에서만 발생합니다. emacs 24.5에서는 undo-tree실행 취소 히스토리 파일을 통해도 실행 취소 히스토리를로드 할 수 없다는 오류가 발생하지만 최소한 emacs 세션이 해당 버전에서 충돌하지 않습니다.


2
내가 이맥스를 사용으로 2 년 이상 해요 아직도 정말 파악되지 않은 : stackoverflow.com/q/20891431/2112489는 솔직히 말해서, 그것은 신비의 다소이고 수행하는 방법을 가르치는 권위있는 스레드가 있어야한다 그것.
lawlist

좋아, 질문은 조회수를 받고 있지만 공감대는 없습니다. 질문을 개선하기 위해 필요한 경우 알려주십시오. 질문이 좋은 답변을 낳을 수 있고 emacs 커뮤니티에 도움이 될 것이라고 생각되면 예상 답변자에게 관심을 갖도록 질문을 올리십시오.
Kaushal Modi

나는 스레드를 가로 채고 싶지 않지만 제안 할 것이다. 스레드가 적절한 시간 내에 적절한 답변을 얻지 못하면 (즉, 그 의미를 결정)이 스레드를보다 일반적으로 만드는 것이 좋습니다. 충돌이 발생하면 Emacs 개발 팀의 전문가가 해당 정보가 포함 된 버그 보고서를받을 때 문제를 진단 / 문제 해결하는 데 도움이되는 의미있는 역 추적을 작성하십시오. 나는 문제가 있기 때문에 중요하다 이해 undue-tree문제,하지만 넓은이 잠재력을 .
법률 목록

@lawlist 이것이 바로이 스레드가 기대하는 것입니다. undo-tree다른 사람이 정확한 충돌을 재현하기가 어렵다는 것을 알고 있기 때문에 구체적인 답변을 기대하지 않았습니다 . 또한이 충돌을 일으키는 유일한 org 파일 전체를 공유 할 수 없습니다. 그래서 나는 gdb이 질문에 태그 만 적용했습니다 . 나는 답변을 통해 이맥스 충돌을 일반적으로 디버그하는 방법을 안내해 유용한 이맥스 버그 리포트를 제출할 수 있도록 뒷이야기를 들었다 .
Kaushal Modi

@lawlist 나는 어떤 패키지에만 국한되지 않는다는 것을 분명히하기 위해 질문을 다시 표현했다.
Kaushal Modi

답변:


15

Emacs 충돌을 디버깅하는 가장 쉬운 방법은에서 Emacs를 시작한 gdb다음 충돌을 재현하는 모든 작업을 수행하는 것입니다.

소스에서 Emacs를 빌드한다고 가정하면 스크립트로 전달 CFLAGS="-O0 -g3"해야합니다 ./configure. 이로 인해 C 컴파일러는 최적화를 끄고 (디버깅 중에 혼동 될 수 있음) 실행 파일에서 최대 디버그 정보를 활성화합니다. makeEmacs를 빌드하기 위해 실행하십시오 .

그런 다음 Emacs 트리 gdbsrc디렉토리 에서 시작 하십시오.

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

OSX에, 당신은 통과 할 것이다 --with-ns받는 ./configure스크립트와 생성 된 응용 프로그램 내부의 이맥스에 gdb를 시작합니다

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

src디렉토리 에서 시작하는 이유 는 .gdbinitEmacs 디버깅에 유용한 GDB 함수 정의를 설정 하는 파일이 있기 때문입니다 . 해당 파일이로드 된 경우 시작할 때 다음과 같은 내용이 표시됩니다 gdb.

DISPLAY = /private/tmp/com.apple.launchd.cNjhIdtUNd/org.macosforge.xquartz:0
TERM = xterm-256color
Breakpoint 1 at 0x1000ca444: file ../../src/emacs.c, line 353.
Breakpoint 2 at 0x1000e7e34: file ../../src/sysdep.c, line 926.

rEmacs를 시작하려면 입력하십시오 . 같은 줄에 추가 인수를 전달할 수 있습니다 (예 :) r --debug-init.

그런 다음 Emacs를 중단 시키십시오. 충돌이 발생하면에 메모가 표시 gdb되고 (gdb)프롬프트가 다시 나타납니다. Emacs가 충돌하지는 않지만 정지 C-z하면 실행중인 터미널 gdb을 눌러 프롬프트로 돌아갈 수 있습니다.

프롬프트에서 입력 bt하면 역 추적을 얻습니다. 또한 Emacs .gdbinit파일이 올바르게로드 된 경우 C 역 추적 뒤에 Lisp 역 추적이 표시됩니다. 두 역 추적 모두에 포함하는 데 매우 유용한 것입니다 M-x report-emacs-bug.


etc/DEBUGEmacs 트리 의 파일 에는 변수 상태 등을 검사하는 방법을 포함하여 훨씬 더 많은 정보가 있습니다 . C-h C-dEmacs 에 입력하여 열거 나 온라인에서 읽을 수 있습니다 .


감사. 오늘 귀하의 솔루션을 시험해 볼 시간을 찾을 것입니다. 나는 아직도 무엇을 emacs-buffer.gdb하고 어떻게 사용하는지 궁금 합니다.
Kaushal Modi

내가 이해하는 것처럼, 그것은 특히 Emacs가 추락했을 때 편집중인 파일의 내용을 복구하는 것입니다. Emacs는 매 30 초마다 300 번의 키를 누를 때마다 자동 저장되므로 제한적으로 사용한다고합니다.
레고 시아

1
그러나 그것은 비 파일 버퍼를 복구하는 데 도움이 될 것입니다. 맞습니까? 내 생각은이를 사용하여 충돌 직전에 * Messages * 및 * Backtrace *가 무엇인지 확인했습니다.
Kaushal Modi

아, 좋은 지적입니다. 나는 그것을 직접 사용하지 않았으므로 어떻게 해야할지 모르겠습니다.
legoscia

emacsclient에서 gdb를 실행하는 방법을 알고 있습니까? 에서이 바이너리를 찾을 수 없습니다 src/. 나는 그것을 발견 lib-src/했지만 이것은 효과가 없었다 gdb ./emacsclient -a '' -c. 따라서 gdb 대신 emacsclient에 해당 인수 -a-c인수를 전달하는 방법에 대한 도움이 필요합니다 .
Kaushal Modi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.