سؤال

أنا أستخدم ActivePerl 5.8 على نظام التشغيل Windows XP.

use strict;
use warnings;
use Data::Dumper;

هناك ثلاثة فرعية تستخدم في البرنامج النصي الخاص بي.

للكشف عن مكدس المكالمات، لا يمكنني إلا إدراج بعض print "some location"; وتحقق من نتيجة الطباعة من نافذة وحدة التحكم.

هل هناك طريقة جيدة لمراقبة ذلك؟ شكرا لك.

هل كانت مفيدة؟

المحلول

لم تكن محددة حول سبب رصد مكدس المكالمات وتتبع الغواصات الخاصة بك، لذلك يجب أن تكون الإجابات واسعة.

طريقة واحدة هي caller:

المتصل

إرجاع سياق مكالمة الروتين الفرعية الحالية. في سياق العددية، بإرجاع اسم حزمة المتصل إذا كان هناك متصل، فهذا هو، إذا كنا في روتين فرعي أو إيطالي أو تتطلب، والقيمة غير المحددة خلاف ذلك. في سياق القائمة، يعود

# 0         1          2
($package, $filename, $line) = caller;

مع expr، تقوم بإرجاع بعض المعلومات الإضافية التي يستخدمها مصحح الأخطاء لطباعة أثر مكدس. تشير قيمة EXPR إلى عدد إطارات المكالمات للعودة قبل المرء الحالي.

#  0         1          2      3            4
  ($package, $filename, $line, $subroutine, $hasargs,
#  5          6          7            8       9         10
$wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
 = caller($i);

قد تستخدم أيضا DEVEL :: Cover. وحدة:

يتم جمع بيانات تغطية الكود باستخدام وظيفة Runops قابلة للتوصيل والتي تعتبر عدد المرات التي يتم فيها تنفيذ كل مرة. ثم يتم تعيين هذه البيانات مرة أخرى إلى الواقع باستخدام وحدات برامج التحويل البرمجي B. هناك أيضا مرفق للتنطيب في بيان يحتاج إلى الخلفية أفضل أن تكون مفيدة حقا.

كلما قلت لنا حول ما تريد القيام به، كلما كانت مفيدة لك إجاباتنا ستكون!

نصائح أخرى

إذا كان الكود الخاص بك، فقد ترغب في استخدام:

Carp::cluck( "And here's the stack:" );

يرى Carp::cluck. وبعد يطبع تحذيرا مع تتبع مكدس. إنه يعمل مثل أسلوب "Printf" لإخراج التصحيح.

استخدم المصحح T أمر.

مثال:

$ perl -d -e'
sub foo {}
sub bar { foo; }
bar;
'

Loading DB routines from perl5db.pl version 1.32
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:4):   bar;
  DB<1> s
main::bar(-e:3):        sub bar { foo; }
  DB<1> s
main::foo(-e:2):        sub foo {}
  DB<1> T
. = main::foo() called from -e line 3
. = main::bar() called from -e line 4
  DB<1> s
Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.
  DB<1> q

نادرا ما تحتاج إلى إدارة مكدس المكالمة مباشرة في بيرل. اذا فعلت caller هي الأداة التي تريدها. ومع ذلك، نادرا ما تكون هناك حاجة فقط.

في كثير من الأحيان، أريد أن أرى تتبع مكدس عندما أكون أخيصا. أخبار جيدة، من السهل الحصول على تتبع مكدس، ما عليك سوى استخدام كاربconfess و cluck وظائف بدلا من die و warn.

use strict;
use warnings;
use Carp;

bar(6.1);
bar(1);

sub foo {
    confess "Oh noes" unless @_ == 6;  # confess is fatal
}

sub bar {
    my $count = shift;
    cluck "bar is in trouble" unless int $count == $count;  # cluck is not fatal
    foo( ('a')x $count );
}

هذا يحصل لك:

dao:~ toad$ perl test.pl
bar is in trouble at test.pl line 14
    main::bar(6.1) called at test.pl line 5
Oh noes at test.pl line 9
    main::foo('a') called at test.pl line 15
    main::bar(1) called at test.pl line 6
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top