यह कैसे पता करें कि एक फ़ंक्शन (बैकट्रेस / स्टैकट्रेस) को कहां से बुलाया जाता है?


10

मैंने एक समस्या हिट की है जो क्षेत्र निष्क्रिय है (क्षणिक-चिह्न-मोड में)। फ़ंक्शन deactivate-markको कहा जाता है और मैं यह पता लगाना चाहूंगा कि यह कहां से (और क्यों) कहा जाता है।

मैंने कोशिश की M-x debug-on-entry RET deactivate-markऔर यह रुक गया लेकिन मुझे फोन करने वाले का पता लगाने का कोई तरीका नहीं मिला। संपूर्ण प्रदर्शित स्टैकट्रेस है:

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

मैंने कोशिश की M-x edebug-eval-defunलेकिन एडबग कॉलर को भी नहीं दिखाता है।

मुझे कैसे पता चलेगा कि क्यों (कहाँ से) 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>, मार्क सक्रिय करें , एक चरित्र टाइप करें ।
एंड्रयू स्वान

आप सलाह दे सकते हैं deactiveate-markऔर अपने सलाह समारोह backtrace-framesमें पूरे कॉल स्टैक का एक दृश्य प्राप्त करने के लिए उपयोग करते हैं यदि एडिबॉग वह नहीं दिखा रहा है जो आप अपेक्षा करते हैं।
जॉर्डन बायोनडो

जोड़ा गया advice-addऔर के बारे में संपादित करें backtrace-frame। इससे कोई फायदा नहीं हुआ।
ग्रेकजन पोलाक

@AndrewSwann से प्रजनन के बारे में, यह ध्यान देने योग्य है कि एक चरित्र टाइप करना आमतौर पर चलता है self-insert-commandऔर "सी-सोर्स कोड 'में एक सेल्फ-इंसर्ट-कमांड एक इंटरैक्टिव बिल्ट-इन फ़ंक्शन है।" यह, अब तक उल्लिखित अन्य व्यवहार के साथ मिलकर बताता है कि किसी के साथ डिबग करना होगा gdb
जो कॉर्नेल

1
प्रश्न पढ़ने से, ऐसा लग रहा था कि चिह्न अप्रत्याशित रूप से निष्क्रिय किया जा रहा है। इस बीच @AndrewSwann द्वारा वर्णित व्यवहार पूरी तरह से अपेक्षित है (जब आप कुछ टाइप करते हैं तो यह क्षेत्र निष्क्रिय हो जाता है)। यदि आपको एंड्रयू के साथ जो व्यवहार मिलता है, तो कृपया स्पष्ट करें कि आप क्या करना चाहते हैं।
मालाबार

जवाबों:


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 सी मैं एक विशेषज्ञ नहीं कर रहा हूँ चारों ओर poked साथ gdb --args src/emacs -Qपढ़ने के बाद कैसे डिबग प्रतीकों के साथ Emacs संकलित करने के लिए?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.