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 트리 gdb의 src디렉토리 에서 시작 하십시오.

$ 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.