Я пишу программу для извлечения данных из набора текстовых файлов и помещения их в БД.Все мои команды в настоящее время имеют форму, похожую на эту (с разными запросами):
$query = "INSERT INTO relations (relation_type_id, confidence) VALUES ($reltypeid, $conf)";
print "$query\n";
$result = $conn->query($query);
$relid = $result->insertid();
...
Однако я заметил случайные ошибки, возникающие во время выполнения, например:
INSERT INTO relations (relatiDBD::mysql::st execute failed: Query was empty at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
DBD::mysql::st execute failed: Query was empty at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
on_type_id, confidence) VALUES (12, 0.709310711263845)
Если я запускаю его с perl -w
, я получаю это:
INSERT INTO relations (relatiUse of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/DBD/mysql.pm line 211.
Use of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
DBD::mysql::st execute failed: Query was empty at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
Use of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/DBD/mysql.pm line 211.
Use of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
DBD::mysql::st execute failed: Query was empty at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/Mysql.pm line 175.
on_type_id, confidence) VALUES (12, 0.709310711263845)
Теперь меня беспокоит то, что явно происходит какое-то многопоточное дерьмо - программа не умирает, и ошибка вставляется всередина отпечатка - и я понятия не имею, как его отладить.Для справки, я сам не разветвляюсь и не использую нити где-либо, кроме обратной галочки zcat
, и это все пакеты, которые включены:
use Switch;
use File::Basename;
и во включенном pm
:
use Mysql;
use Exporter qw(import);
Кроме того, я погуглил сообщение об ошибке и не могу получить полный удар (имя и местоположение).Просто имя ошибки («Запрос был пуст») попало в статью, в которой постер получал доступ к соединению от двух впоследствии разветвленных процессов.
Еще одно замечание: это явление детерминированное.Ошибки всегда появляются в одном и том же месте, если код не поврежден.Если я изменяю вывод (например, вставляю несколько строк маркера, например print "---";
, чтобы отделить мои блоки записи), ошибки возникают раньше (не могу точно сказать, находится ли он на том же счетчике байтов на выходе или нет).
Есть ли способ отключить многопоточность в perl
?Как мне поймать баггера?О чем это сообщение об ошибке?
ОБНОВЛЕНИЕ: Проблема заключалась в комбинации буферизации стандартного вывода, вводящего в заблуждение попадания в Google, имени каталога perl и основного случая пердения мозга.