Проблемы при обработке текста через DJVU IFilter (LTIFilter.DLL) всех версий
IFilter для PDF, офисных документов, картинок - всё нормально работает.
Фильтр DjVu обрабатывает пару тысяч файлов и виснет, причём ошибка чтения происходит в библиотеке NTDLL.
======================================================
Project WebSearch.exe raised exception class $C0000005 with
message 'access violation at 0x7c91b1fa: write of address 0x00000010'.
ntdll.RtlpWaitForCriticalSection
======================================================
Project WebSearch.exe raised exception class $C0000005 with
message 'access violation at 0x020f3913: read of address 0xabab0043'.
LTIFilter.DllRegisterServer
======================================================
У кого такое было? Как лечится?
У кого такое было? Как лечится?
Выясните файл на котором происходит обвал. Скорее всего файл поврежден, а в фильтре ошибка. (вряд ли ошибка будет в ntdll).
begin
Tools.Config_WriteStr('dangerous',ExtractFileName(File1),'danger');
SPFilter.GetFileContentsFromIFilter(File1, OutData);
Tools.Config_DeleteKey('dangerous',ExtractFileName(File1));
end;
Но это не серьёзно :-( .
Это лечится?
Это лечится?
Разве что новой версией
1.0.0.537 Copyright (c)1996-2003
1.1.0.861 Copyright (c)1996-2004
1.1.1.1320 Copyright (c)1996-2004
Какие ещё бывают?
Я заметил, что если закоментировать строчку FreeLibrary(DLLHandle), то ошибок не будет. Что бы это значило?
if DLLHandle > 0 then FreeLibrary(DLLHandle);
if DLLHandle=GetModuleHandle(PAnsiChar(FilterDLL)) then
FreeLibrary(DLLHandle);
//заново определяем - а загружена ли вообще библиотека?
if (DLLHandle>=32) then
FreeLibrary(DLLHandle);
Я перед выгрузкой библиотеки обнулял указатели на функции:
DllCanUnloadNow:=nil;
DllRegisterServer:=nil;
А надо было делать так:
@DllCanUnloadNow:=nil;
@DllRegisterServer:=nil;
Вот и вылетал Access Violation...
Djvu IFilter (LTIFilter.DLL) обрабатывает несколько файлов и виснет!
Чего делать то?
Новая версия-то не появилась?
Новой версии фильтра я не нашёл.
Может быть, кто нибудь ещё создал djvu-фильтр, кроме Lizard-Tech?
Я составил список файлов, которые обрабатывались с ошибками,
и теперь буду их игнорировать.
Остальные файлы индексируются успешно.
<>
Вряд ли проблема была в том, что ты не игнорировал (не)нужные файлы...
** Message name: DjVuFile.failed
Parameter: file://localhost/D:/001-200-g4_0055.djvu
** Message name: EOF
** Message name: ByteStream.open_fail
Parameter: 095_0001_1.djbz
Parameter: No such file or directory
** Message name: ByteStream.open_fail
Parameter: 095_0001_1.djbz
Parameter: No such file or directory
** Message name: DjVuFile.failed
Parameter: file://localhost/D:/rl28_3-4_091.djvu
** Message name: JB2Image.need_dict
может ли вывод ошибок подвешивать программу, которая работает в режиме сервиса?
Чем меньше кода, тем лучше. Если прога будет по прежнему вешатся, тогда по крайней мере поймёшь, что ~50% где-то за ошибку в фильтре (другие 50 - за ошибку в твоём использовании его). Если же всё будет работать, то значит фильтр в порядке, и проблема где-то у тебя.
{$APPTYPE CONSOLE}
uses
Windows, Messages, SysUtils, Classes, Tools, Math, SPFilter;
var
Data1:TMemoryStream;
Files:TStrings;
x:integer;
begin
Files:=TStringList.Create;
Data1:=TMemoryStream.Create;
Tools.FileSearcher('d:\Документация',Files,'*.dj*',False,True,True);
repeat
x:=Random(Files.Count);
DebugWrite(Files[x]);
try
WriteLog(Files[x]);
SPFilter.GetFileContentsFromIFilter(Files[x],Data1);
except
on e: Exception do
WriteLog('Exception '+e.Message+#32+'('+Files[x]+')');
end;
if Data1.Size>0 then Write(':') else Write('.');
DebugWrite(Tools.BytesToStr(Data1.Size));
Data1.Clear;
until 1=2;
Data1.Free;
ReadLN;
end.
Если я правильно понял, есть файлы, которые неверно обрабатываются библиотекой и на них программа виснет. Проблема где-то в коде обработки ошибок в библиотеке LTIFilter.DLL.
Я не про то. Имелось в виду, каков результат его работы-то? Вылетает, виснет, работает нормально?
О чём и речь. Прогони своё минимальное приложение на одном (нескольких) таких файлов и напиши, что вышло.
1. Имеем минимальную прогу.
2. Имеем список файлов, которые неправильно обрабатываются.
3. Передаём один из них их минимальной проге.
4. Минимальная прога вылетает?
В #23 говорится о списке неправильно обрабатываемых файлов, но не говорится о том, чем они обрабатывались - вашим web crawler'ом или кодом что парой постов выше.
Я просто пытаюсь прояснить вопрос.
Каким образом она выводит на экран, если до моих процедур обработки исключений дело не доходит?
При использовании функций writeln() в не-консольном приложении программа виснет.
Может быть и тут происходит нечто подобное?
Какие? Может это нормальные (штатные) ошибки?
writeln, видимо. Другое дело, что очень странно, что подобные функции используются в официальном фильтре. А эта SPFilter.GetFileContentsFromIFilter - стандартная функция/юнит?
Кстати, под минимальной прогой я понимал ещё меньшую. Грубо говоря: ifilter.create; ifilter.openfile('a file.djvu'); ifilter.free; - без всяких Tools и пр.
Нет, это юнит, который я нашёл где-то на просторах сети и доделал.
Могу выложить, ничего секретного там нет.
Если отключить обработку DjVu-файлов, или просто удалить LTIFilter.dll,
то программа индексирует 20000 файлов формата PDF и ещё кучу документов
Microsoft Word через другие IFilter без единой ошибки.
Основная идея, которую я пытаюсь донести, такая - если есть фильтр в виде одной длл или юнита, то нужно составить самую минимальную прогу и ободрать загрузку/обработку файла в проге до костей.
Иными словами, без всяких SPFilter и прочих полезностей - в идеале вообще должны остаться только 3-4 вызова функций фильтра.
Я не знаю, как устроен djvu-фильтр, но надеюсь что ты сможешь для этого использовать самую минимальную его часть.
Тогда проще будет отлаживать.
CoInitialize(nil);
в конце процедуры добавил
CoUninitialize;
Выгрузку библиотек вообще закоментировал.
// DLLHandle := GetModuleHandleA(PAnsiChar(FilterDLL));
// if (DLLHandle>=32) then
// FreeLibrary(DLLHandle);