(バックトレース/スタックトレース)から関数が呼び出される場所を見つける方法は?


10

(transient-mark-modeで)リージョンが非アクティブ化されるという問題に遭遇しました。関数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-markhttp : //emacshorrors.com/posts/deactivate-mark.html


1
記述された動作と出力を再現できます。実行emacs -Qし、デバッグをオンにし、M-x debug-on-entry deactivate-markマークをアクティブにしC-<SPC>、文字を入力します。
Andrew Swann

あなたは助言ができdeactiveate-mark、あなたのアドバイス機能の使用中のbacktrace-framesEdebugのは、あなたが期待するものを表示されていない場合は、全体コールスタックのビューを取得します。
Jordon Biondo

advice-addおよびに関する編集を追加しましたbacktrace-frame。それは助けにはならなかった。
Gracjan Polak

@AndrewSwannからの複製については、通常、文字を入力するself-insert-commandと実行され、「自己挿入コマンドは「Cソースコード」のインタラクティブな組み込み関数です」と指摘する価値があります。これは、これまでに述べた他の動作と合わせて、でデバッグする必要があることを示唆していgdbます。
Joe Corneli、2015年

1
質問を読むと、マークが予期せず無効化されているように思えました。一方、@ AndrewSwannによって記述された動作は完全に予想されます(何かを入力すると、領域は非アクティブになります)。取得した動作がアンドリューの動作と一致する場合は、何をしたいかを明確にしてください。
マラバルバ2015年

回答:


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.私の専門家ではないです周りつついgdb --args src/emacs -Q読んだ後にデバッグシンボルでのemacsをコンパイルする方法は?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.