nytprofhtml, похоже, игнорирует модуль с именем DB
Я пытаюсь профилировать большое приложение, которое содержит модуль с креативным именем DB
, После запуска под -d:NYTProf
и звонит nytprofhtml
, как без каких-либо дополнительных переключателей или связанных переменных среды, я получаю обычно nytprof
каталог с выводом HTML. Однако кажется, что из-за некоторой внутренней логики любой вывод связан с моим модулем DB
сильно изуродован. Просто чтобы убедиться, DB
это чистый Perl.
- Список верхних и всех подпрограмм: в то время как ссылки на другие функции указывают на соответствующие
-pm-NN-line.html
файл, ссылки на сабы отDB
вместо этого укажите на скрипт входа. - ссылка "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. Если вы этого не сделаете, то, надеюсь, вы, по крайней мере, не будете делать те же ошибки снова