четверг, 8 июля 2010 г.

Пробный шар: поиск неугодного вызова метода с помощью perl


Иногда нет возможности запустить дебаггер и понять, где именно происходит вызов того или иного метода.
Например, в одном проекте есть метод на php, который должен выдавать пользователю “ошибку 404”:
//class some_class {
funciton notFound($reason=”no reason”) {
//…
echo $reason;
//…
}
И есть пара сотен мест, где метод вызван без параметра (и выдает ‘no reason’). Как быть, если надо найти, где вызывается этот метод?
Хинт: можно заменить все вызовы метода без параметров - notFound() на вызовы notFound со случайным числом в качестве параметра (например: notFound(321653)) потом посмотреть на это число в браузере и спокойно найти его, например, с помощью команды grep.
Замену вызовов метода notFound() на notFound(random int) нам поможет сделать такой скрипт на перле:

#!/usr/bin/perl  
#  
 
my $file = $ARGV[0]; 
open FILE, $file or die "failed to open $file\n";  
my $text = join("", <FILE>);  
close FILE;  
 
$text =~ s/notFound\(\)/'notFound(' . int(rand() * 1000000) . ')'/ge;  
 
open (FILE, ">$file") or die "failed to write to $file\n"; 
print FILE $text; 
close(FILE); 
запуск:
chmod +x ./script.pl
find /path/to/project -type f -name *.php -exec ./script.pl {} \;
затем - поиск grep’ом:
grep -R “ваше заветное число” /path/to/project/*
так вы найдете строку, которая, возможно, портит вам жизнь
ps: Если вам приходится аналогичными способами работать с кодом, это свидетельствует о весьма тяжелом состоянии вашего проекта (тэг “код с душком”). Подумайте о рефакторинге, но если проект рефакторингу не подлежит, то иногда перл и средства командной строки вам помогут))