Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2012, 00:22   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
Злость О чем говорит этот рапорт Access Violation?

Доброго времени!

Ситация такая:
Получаю список жестких дисков, и каждый диск скармливаю потоку, который там что-то ищет.

При старте потока(ов), сервис выпадает в AV.

сам ав:
Код:
----------------------------------------------------------------------------------
|*Exception Thread: ID=2252; Priority=1; Class=TScanThread                       |
|--------------------------------------------------------------------------------|
|0042E0BB|si.exe      |             |     |                             |        |
|7C9010E0|ntdll.dll   |             |     |RtlLeaveCriticalSection      |        |
|7C910439|ntdll.dll   |             |     |RtlAcquirePebLock            |        |
|7C910451|ntdll.dll   |             |     |RtlReleasePebLock            |        |
|7C910380|ntdll.dll   |             |     |RtlImageNtHeader             |        |
|7C8645AA|kernel32.dll|             |     |UnhandledExceptionFilter     |        |
|7C903247|ntdll.dll   |             |     |RtlConvertUlongToLargeInteger|        |
|7C90E485|ntdll.dll   |             |     |KiUserApcDispatcher          |        |
|7C809E10|kernel32.dll|             |     |MultiByteToWideChar          |        |
|005AEDB0|si.exe      |NativeXml.pas|     |GetXmlFormatSettings         |9450[88]|
|005B080B|si.exe      |NativeXml.pas|     |GetXmlFormatSettings         |9450[88]|
--------------------------------------------------------------------------------

Assembler Information:
----------------------------------------------------------------
; System.TEncoding.GetByteCount (Line=0 - Offset=0)
; -------------------------------------------------
0042E0A3  mov     ebx, edi
0042E0A5  test    ebx, ebx
0042E0A7  jz      System.TEncoding.GetByteCount
0042E0A9  sub     ebx, +$04
0042E0AC  mov     ebx, [ebx]
0042E0AE  mov     eax, edi
0042E0B0  call    System._UStrToPWChar
0042E0B5  mov     edx, eax
0042E0B7  mov     ecx, ebx
0042E0B9  mov     eax, esi
0042E0BB  mov     ebx, [eax]                     ; <-- EXCEPTION
0042E0BD  call    dword ptr [ebx]
0042E0BF  pop     edi
0042E0C0  pop     esi
0042E0C1  pop     ebx
0042E0C2  ret


Stack:               Memory Dump:
------------------   ---------------------------------------------------------------------------
01E8F868: 01E8FAF0 012415A0: 8B 18 FF 13 5F 5E 5B C3 90 55 8B EC 83 C4 F4 53  ...._^[..U.....S
01E8F86C: 004C7BFE 012415B0: 56 89 4D FC 8B 75 08 83 7D FC 01 7D 27 8B 45 FC  V.M..u..}..}'.E.
01E8F870: 01E8F890 012415C0: 89 45 F4 C6 45 F8 00 8D 45 F4 50 6A 00 8B 0D 88  .E..E...E.Pj....
01E8F874: 7C885780 012415D0: F8 5C 00 B2 01 A1 30 FE 41 00 E8 B2 B1 FF FF E8  .\....0.A.......
01E8F878: 004C7ACC 012415E0: 9D 8D FD FF 85 F6 7D 24 89 75 F4 C6 45 F8 00 8D  ......}$.u..E...
01E8F87C: 012E734C 012415F0: 45 F4 50 6A 00 8B 0D 68 F6 5C 00 B2 01 A1 30 FE  E.Pj...h.\....0.
01E8F880: 0127F4DC 01241600: 41 00 E8 8A B1 FF FF E8 75 8D FD FF 8B CA 85 C9  A.......u.......
01E8F884: 00000000 01241610: 74 05 83 E9 04 8B 09 2B 4D FC 41 3B F1 7E 24 89  t......+M.A;.~$.
01E8F888: 00000000 01241620: 75 F4 C6 45 F8 00 8D 45 F4 50 6A 00 8B 0D 68 F6  u..E...E.Pj...h.
01E8F88C: 00000000 01241630: 5C 00 B2 01 A1 30 FE 41 00 E8 53 B1 FF FF E8 3E  \....0.A..S....>
01E8F890: 01E8FB00 01241640: 8D FD FF 8B 4D FC 8D 54 4A FE 8B CE 8B 18 FF 13  ....M..TJ.......
01E8F894: 7C864771 01241650: 5E 5B 8B E5 5D C2 04 00 90 55 8B EC 51 53 56 57  ^[..]....U..QSVW
01E8F898: 01E8FB10 01241660: 8B F9 8B F2 8B D8 8B 45 0C 50 8B CF 8B D6 8B C3  .......E.P......
01E8F89C: 00000000 01241670: E8 60 FE FF FF 89 45 FC 8B 45 FC 50 8B 45 08 B9  .`....E..E.P.E..
01E8F8A0: 00000000 01241680: 01 00 00 00 8B 15 EC BE 41 00 E8 AA B9 FD FF 83  ........A.......
01E8F8A4: 00000000 01241690: C4 04 8B 45 0C 50 8B 45 08 8B 00 50 6A 00 8B CF  ...E.P.E...Pj...
Код потока:
Код:
constructor TScanThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate := True;
  Priority := tpHigher;
  fLog := TLogFile.Create('', True); //Создание лог файла для потока(рандомные имена).
  fLog.SavePath := myDir; //Куды сохранять
end;

destructor TScanThread.Destroy;
begin
  fLog.Free;
  inherited Destroy;
end;

procedure TScanThread.Execute;
begin
  fLog.Add(fStartScan); //Это не выполняется, в fStartScan находится "x:\" ,где x - буква диска
  ListFileAndHash(fStartScan); //Вызов рекурсивного перебора папок надиске. 
end;
Человек_Борща вне форума Ответить с цитированием
Старый 09.03.2012, 01:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
ListFileAndHash
А эта как выглядит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.03.2012, 01:59   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Вот так:
Код:
procedure TScanThread.ListFileAndHash(StartDir: string);
var
  SearchRec: TSearchRec;
  Buff: string;
  fName: string;
  i, i2: SmallInt;
begin
  try
    if FindFirst(StartDir + '*.*', faAnyFile, SearchRec) = 0 then
    begin
      repeat
        if Terminated then
          Exit;
        if (SearchRec.Attr and faDirectory) <> faDirectory then
        begin
          if Terminated then
            Exit;
          if StartDir + SearchRec.Name <> StartDir then
          begin
            fLog.Add('fName = ' + SearchRec.Name);
            fName := SearchRec.Name;
            // Цикл по файлам
            for i := cFilesAMin to cFilesAMax do
            begin
              if Terminated then
                Exit;
              // если это наш файл
              fLog.Add('fName <> [' + IntToStr(i) + ']' + aSearchFilesList[i]);
              if (LowerCase(fName) = LowerCase(aSearchFilesList[i])) then
              begin
                fLog.Add('fName = [' + IntToStr(i) + ']' + aSearchFilesList[i]);
                // цикл// по каталогам
                for i2 := cFoldersAMin to cFoldersAMax do
                begin
                  if Terminated then
                    Exit;
                  // если рядом с файлом есть нужный каталог
                  fLog.Add('fName = [' + IntToStr(i) + ']' + aSearchFilesList[i]
                    + ' <> [' + IntToStr(i2) + ']' + aSearchFoldersList[i2]);
                  if DirectoryExists(StartDir + aSearchFoldersList[i2]) then
                  begin
                    fLog.Add('fName = [' + IntToStr(i) + ']' + aSearchFilesList
                      [i] + ' = [' + IntToStr(i2) + ']' +
                      aSearchFoldersList[i2]);
                    // передаем папку..
                    if Assigned(fOnFound) then
                      fOnFound(StartDir);
                  end;
                end;
              end;
            end;
          end;
          if Terminated then
            Exit;
        end
        else
        begin

          if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
          begin
            // Recursive
            ListFileAndHash(StartDir + SearchRec.Name + '\');
          end;
        end;
        if Terminated then
          Exit;
      until FindNext(SearchRec) <> 0;
    end;
  finally
    FindClose(SearchRec);
  end;
end;
Но даже код execute не вызывается... я понять не могу, ПОЧЕМУ?
Человек_Борща вне форума Ответить с цитированием
Старый 09.03.2012, 03:05   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Проблему решил.
Похоже я забыл, что при наследовании класса(fLog:TLogFile наследован от TStringList), нужно вызвать стандартный конструктор/деструктор при помощи inherited.

Но сути всеравно не понял. ???
Человек_Борща вне форума Ответить с цитированием
Старый 09.03.2012, 03:30   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Видимо, у тебя конструктор потока выбивал исключение - из-за TLogFile. Поэтому поток не стартовал.

Из лога видно, что вылет происходил в MultiByteToWideChar, вызываемой из System.TEncoding.GetByteCount. Он происходил потому, что конструктор TStrings не вызывался и поле FDefaultEncoding не было инициализировано. Соответственно, при вызове методов TEncoding Self = nil.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 09.03.2012 в 04:21.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
access violation ho_N Компьютерное железо 2 30.11.2011 08:36
непонимаю, чем этот код кривой. pufystyj Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 06.07.2011 18:23
О чем говорит ваш аватар Sibedir Свободное общение 86 02.05.2011 14:15
О чем говорит эта ошибка misher Компьютерное железо 3 01.04.2011 23:27
Access Violation Carbon Общие вопросы Delphi 12 18.09.2007 19:55