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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2011, 00:50   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
Плохо Непонятный AV в процедуре ведения лога.

Всем доброго времени суток!

Возникает Acces Violation в следующем коде:
Код:
{
const
  HLRLog_FileFormat = '%s.log';
  FileName_DateFormat = 'DDMMYY';
}
  HLRSelfUpdLog.SaveToFile(HLR_GetLogsDir(False, False, True) + Format(HLRLog_FileFormat, [FormatDateTime(FileName_DateFormat, Date)]));
  HLRSelfUpdLog.Free;
вот что выдаёт MadExcept:
Код:
exception number  : 1
exception class   : EAccessViolation
exception message : Access violation at address 00404E24 in module 'HLR.exe'. Read of address 000D0709.

main thread ($1b60):
00404e24 +004 HLR.exe System              @LStrAsg
004685e5 +029 HLR.exe Classes             TStringList.Get
004678b1 +05d HLR.exe Classes             TStrings.GetTextStr
00467edc +020 HLR.exe Classes             TStrings.SaveToStream
00467e96 +032 HLR.exe Classes             TStrings.SaveToFile
005d9e70 +0e8 HLR.exe THLRLogUnit  71  +4 THLRLog.Destroy

...

005d9e16 71   lea     eax, [ebp-$18]
005d9e19      push    eax
005d9e1a      xor     ecx, ecx
005d9e1c      mov     dl, 1
005d9e1e      xor     eax, eax
005d9e20      call    +$5d7 ($5da3fc)        ; GlobalConsts.HLR_GetLogsDir
005d9e20
005d9e25      lea     eax, [ebp-$18]
005d9e28      push    eax
005d9e29      lea     eax, [ebp-$1c]
005d9e2c      push    eax
005d9e2d      call    -$18356a ($4568c8)     ; SysUtils.Date
005d9e2d
005d9e32      add     esp, -8
005d9e35      fstp    qword ptr [esp]
005d9e38      wait
005d9e39      lea     edx, [ebp-$20]
005d9e3c      mov     eax, $5d9f28           ; 'DDMMYY'
005d9e41      call    -$182876 ($4575d0)     ; SysUtils.FormatDateTime
005d9e41
005d9e46      mov     eax, [ebp-$20]
005d9e49      mov     [ebp-$10], eax
005d9e4c      mov     byte ptr [ebp-$c], $b
005d9e50      lea     edx, [ebp-$10]
005d9e53      mov     eax, $5d9f38
005d9e58      xor     ecx, ecx
005d9e5a      call    -$184253 ($455c0c)     ; SysUtils.Format
005d9e5a
005d9e5f      mov     edx, [ebp-$1c]
005d9e62      pop     eax
005d9e63      call    -$1d4db8 ($4050b0)     ; System.@LStrCat
005d9e63
005d9e68      mov     edx, [ebp-$18]
005d9e6b      mov     eax, [esi+8]
005d9e6e      mov     ecx, [eax]
005d9e70    > call    dword ptr [ecx+$74]  ;EXCEPTION
005d9e70
005d9e73 72   mov     eax, [esi+8]
005d9e76      call    -$1d5fc3 ($403eb8)     ; System.TObject.Free
005d9e76
Как быть? В чем ошибка? 3 месяца код пахал. А тут начал выкидывать штуки.

Заранее спасибо!

Последний раз редактировалось Человек_Борща; 09.05.2011 в 10:57.
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 00:57   #2
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

а какая строка кода выдает ошибку?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 09.05.2011, 01:00   #3
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Я сомневаюсь что асм-требуха MadExcept'а тут вообще нужна. Достаточно поставить бряк на интересующую строку и посмотреть что передаётся в качестве параметров.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 09.05.2011, 10:58   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Строку с ошибкой выделил красным. Мне непонятно почему происходит эта ошибка...
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 12:54   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Хоть бы сообщение привёл.

...а, всё, увидел.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.05.2011, 13:00   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Я может чего не так читаю, но в логе написано что-то ОЧЕНЬ странное: сначала идёт вызов HLR_GetLogsDir, потом - формирование аргументов для неё. По-идее, должно быть наоборот.

Если закрыть на это глаза, то видно:
1. HLRSelfUpdLog - наследник TStrings (почему сам не сказал, кто это?).
2. Ошибка возникает при сохранении строк файл. Конкретно - при полученнии данных строки.

Т.е. налицо проблема порчи памяти. Поскольку это лог, то наиболее вероятна порча из-за отсутствия синхронизации в многопоточном приложении.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.05.2011, 13:31   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Ясно. Блоху тапочком не прибить. Вылазит.

Тогда как организовать логирование в многопоточном приложении?
Что использовать? Чем руководствоваться?
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 13:36   #8
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Поставьте семафор или мьютекс
ReportCube вне форума Ответить с цитированием
Старый 09.05.2011, 16:42   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Цитата:
Сообщение от ReportCube Посмотреть сообщение
Поставьте семафор или мьютекс
Можно пример? Пожалуйста.
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 20:16   #10
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Попробуйте, вроде бы должно быть понятно:
Цитата:
implementation

uses ;
// Локальные переменные модуля
var
hFileConn: THandle; //Семафор, пропуск потока

procedure WriteLog()
var
WaitReturn: Word;
begin
WaitReturn := WaitForSingleObject(hFileConn, INFINITE);
try
if WaitReturn = WAIT_OBJECT_0 then begin
// Ваш код
end;
finally
{Окрываем семафор, пропуск для следующего клиента}
ReleaseSemaphore(hFileConn, 1, nil);
end;
initialization
hFileConn := CreateSemaphore(nil, 1, 1, nil);
finalization
CloseHandle(hFileConn);
ReportCube вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ведение лога изменений в базе erzi Microsoft Office Access 6 02.02.2011 21:55
Ведения лога программы! $T@LKER Компоненты Delphi 2 09.09.2010 15:36
Как лучше включать режим лога? Alex Cones Общие вопросы Delphi 11 12.07.2010 00:07
Способы ведения файла-лога Norfolk Общие вопросы Delphi 2 14.06.2007 20:47