(backtrace / stacktrace)에서 함수가 호출되는 위치를 찾는 방법은 무엇입니까?


10

과도 표시 모드에서 영역이 비활성화되는 문제가 발생했습니다. 이 함수 deactivate-mark가 호출되었으며 어디에서 왜 호출되는지 알아 내고 싶습니다.

시도했지만 M-x debug-on-entry RET deactivate-mark중지했지만 발신자를 찾을 수있는 방법을 찾지 못했습니다. 표시되는 전체 스택 추적은 다음과 같습니다.

Debugger entered--entering a function:
* deactivate-mark()

나는 시도 M-x edebug-eval-defun했지만 Edebug는 발신자를 표시하지 않습니다.

왜 (어디에서) deactivate-mark전화를 받았 는지 어떻게 알 수 있습니까? 백 트레이스 또는 스택 트레이스 기능을 찾고 있습니다.

편집하다:

advice-add트릭 :

(defun message-show-backtrace ()
  (message "%s" (backtrace-frame 10)))

(advice-add deactivate-mark :before #'message-show-backtrace)

생산 nil에서 *Messages*.

편집 :에 대한 자세한 정보 deactivate-mark: http://emacshorrors.com/posts/deactivate-mark.html


1
설명 된 동작과 출력을 재현 할 수 있습니다. 를 실행 emacs -Q하고 디버그를 켜고 M-x debug-on-entry deactivate-mark활성화 표시를 활성화 C-<SPC>한 다음 문자를 입력하십시오.
앤드류 스완

edebug가 예상 한 것을 보여주지 않으면 전체 콜 스택을 볼 수 있도록 조언 deactiveate-mark하고 조언 기능을 사용할 backtrace-frames수 있습니다.
Jordon Biondo

advice-add및 에 대한 수정 사항이 추가되었습니다 backtrace-frame. 도움이되지 않았습니다.
Gracjan Polak

@AndrewSwann의 재생산과 관련하여 일반적으로 문자를 입력하면 self-insert-command"self-insert-command는 대화식 내장 함수 인 'C 소스 코드'에 있습니다." 이것은 지금까지 언급 한 다른 동작과 함께로 디버깅해야 함을 나타 gdb냅니다.
Joe Corneli

1
질문을 읽은 후 마크가 예기치 않게 비활성화 된 것처럼 들렸습니다. 한편 @AndrewSwann이 설명한 동작은 완벽하게 예상됩니다 (입력 한 내용이 영역이 비활성화 됨). 당신이 얻는 행동이 Andrew의 행동과 일치하면, 당신이하고 싶은 일을 명확히하십시오.
Malabarba

답변:


4

에서 command_loop_1에서 keyboard.c.

  ...
  if (!NILP (BVAR (current_buffer, mark_active))
  && !NILP (Vrun_hooks))
{
  /* In Emacs 22, setting transient-mark-mode to `only' was a
     way of turning it on for just one command.  This usage is
     obsolete, but support it anyway.  */
  if (EQ (Vtransient_mark_mode, Qidentity))
    Vtransient_mark_mode = Qnil;
  else if (EQ (Vtransient_mark_mode, Qonly))
    Vtransient_mark_mode = Qidentity;

  if (!NILP (Vdeactivate_mark))
    /* If `select-active-regions' is non-nil, this call to
       `deactivate-mark' also sets the PRIMARY selection.  */
    call0 (Qdeactivate_mark);
  else
  ...

그것은 Qdeactivate_mark모두에서 호출 되는 유일한 장소 인 것 같습니다 src/*.c. 제 생각 엔 이것이 당신이 겪고있는 것입니다.


참고로, 저는 Emacs C의 전문가가 아닙니다. 디버그 기호로 emacs를 컴파일하는 방법을 읽은 후 주위둘러 보았습니다 . .gdb --args src/emacs -Q

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.