nytprofhtml, похоже, игнорирует модуль с именем DB

Я пытаюсь профилировать большое приложение, которое содержит модуль с креативным именем DB, После запуска под -d:NYTProf и звонит nytprofhtml, как без каких-либо дополнительных переключателей или связанных переменных среды, я получаю обычно nytprof каталог с выводом HTML. Однако кажется, что из-за некоторой внутренней логики любой вывод связан с моим модулем DB сильно изуродован. Просто чтобы убедиться, DB это чистый Perl.

  1. Список верхних и всех подпрограмм: в то время как ссылки на другие функции указывают на соответствующие -pm-NN-line.html файл, ссылки на сабы от DB вместо этого укажите на скрипт входа.
  2. ссылка "line" в разделе "Исходные файлы" указывает на DB-pm-NN-line.html и он существует, но, в отличие от всех других файлов, в нем нет таблицы "Statements", а в таблице "Line" нет абсолютно никаких строк кода, только сводка вызовов.

Собственно, вот небольшой пример:

# main.pl
use lib '.';
use DB;

for (1..10) {
    print DB::do_stuff();
}

# DB.pm
package DB;

sub do_stuff {
    my $a = 1;
    my $b = 2;
    my $c = $a + $b;

   return $c;
}

1;

Попробуйте запустить perl -d:NYTProf main.pl, затем nytprofhtml а затем осмотреть nytprof/DB-pm-8-line.html,

Я не знаю, происходит ли это потому, что у самого NYTProf есть внутренний модуль с именем DB или он обрабатывает модули, начинающиеся с DB каким-то волшебным образом - я заметил вывод для функций из DBI выглядит несколько иначе.

Есть ли способ изменить / отключить это поведение, кроме переименования моего DB модуль?

1 ответ

Это вряд ли вариант

У вас действительно нет выбора. Специальный DB пакет и связанный с ним Devel:: Пространство имен кодируется в компилятор / интерпретатор perl. Если вы не хотите вообще обходиться без каких-либо средств отладки и не боитесь каких-либо таинственных не поддающихся количественному определению побочных эффектов, то вы должны рефакторинг своего кода, чтобы переименовать свой проприетарный DB библиотека

Во всяком случае, название очень общее, и именно поэтому оно ожидается

Напротив, Devel::NYTProf обязан использовать существующий пакет ядра DB, Именно потому, что это очень общий идентификатор, инженер должен отклонить его как выбор для производственного кода, который может потребоваться для работы с уже существующим сторонним кодом в любой момент

модуль с креативным названием DB

Это противоречит вашей собственной поддержке выбора. DBбыл основным модулем начиная с v5.6 в 2000 году, и все, что уже было в CPAN, должно было быть с самого начала. Я уверен, что столкновение пространств имен должно быть обнаружено до сих пор. Пожалуйста, не будьте кем-то еще, кто просто подметает проблему под ковром

Помните, что любой код, который вы сейчас помещаете в DB Пакет разделяет пространство со всем, что там уже есть в Perl. Удивительно, что вы уже не испытываете странных и необъяснимых симптомов

Я не вижу, что это слишком большая задача, чтобы исправить это, если у вас есть подходящий набор тестов для вашего 10 МБ кода Perl. Если вы этого не сделаете, то, надеюсь, вы, по крайней мере, не будете делать те же ошибки снова

Другие вопросы по тегам