(ব্যাকট্র্যাস / স্ট্যাকট্রেস) কোথা থেকে কোনও ফাংশন ডাকা হয়েছে তা কীভাবে খুঁজে বের করবেন?


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>, একটি অক্ষর টাইপ করুন।
অ্যান্ড্রু সোয়ান 14

আপনি পরামর্শ দিতে পারেন deactiveate-markএবং আপনার পরামর্শ backtrace-framesফাংশনটিতে যদি ইডব্যাগ আপনার প্রত্যাশাটি না দেখায় তবে পুরো কল স্ট্যাকের একটি দর্শন পেতে ব্যবহার করতে পারেন।
জর্ডন বিওনডো

সম্পর্কে সম্পাদন করা যোগ করা হয়েছে advice-addএবং backtrace-frame। এটি কোনও উপকারে আসেনি।
গ্রাজন পোলাক

@ অ্যান্ড্রুসওয়ান থেকে প্রজনন সম্পর্কিত, এটি লক্ষণীয় যে কোনও চরিত্র টাইপ করা সাধারণত চালিত হয় self-insert-commandএবং "স্ব-সন্নিবেশ-কমান্ড 'সি উত্স কোডে" একটি ইন্টারেক্টিভ অন্তর্নির্মিত ফাংশন। " এটি, এখনও পর্যন্ত উল্লিখিত অন্যান্য আচরণের সাথে একত্রিত করে যে একটিকে ডিবাগ করতে হবে gdb
জো কর্নেলি

1
প্রশ্নটি পড়ার সময় থেকে মনে হচ্ছিল চিহ্নটি অপ্রত্যাশিতভাবে নিষ্ক্রিয় করা হচ্ছে। ইতিমধ্যে @ অ্যান্ড্রুসওয়ান দ্বারা বর্ণিত আচরণটি পুরোপুরি প্রত্যাশিত (আপনি কিছু টাইপ করার সময় অঞ্চলটি নিষ্ক্রিয় করা হয়)। যদি আপনি যে আচরণটি পান সেটি অ্যান্ড্রুয়ের সাথে মেলে তবে দয়া করে আপনি কী করতে চান তা পরিষ্কার করুন।
মালাবারবা

উত্তর:


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 কম্পাইল কিভাবে?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.