Войти
ПрограммированиеФорумОбщее

Запись файла лога

Страницы: 1 2 Следующая »
#0
6:02, 12 июня 2018

Как вы боретесь со следующей ситуацией?

1) При запуске приложения открывается файл лога на запись.
2) Приложение работает до определённого момента и успевает сделать несколько записей.
3) Приложение вылетает и файл лога остаётся пустой.
4) Файл лога должен закрываться при удачном завершении работы приложения.

У меня есть мысль при каждой записи открывать и закрывать файл лога. Поможет ли это моему горю, особенно если запись происходит из нескольких потоков, бывает что одновременно?
P.S. Вылет выполняется умышленно для проверки корректного ведения протокола работы приложения, потоки при записи друг другу не мешают.


#1
6:07, 12 июня 2018

Либо делай fflush() на каждой записи, либо лови креш и делай fflush() перед выходом.

#2
7:05, 12 июня 2018

>лови креш и делай fflush() перед выходом.
так лучше

#3
7:46, 12 июня 2018

Благодарю! Пока сделал для каждой записи, помогло.
А как корректно ловить креш для неопределённого участка кода?
На тот случай, если на каком-то компьютере по непонятной причине вылетит та или иная библиотека.

#4
9:08, 12 июня 2018

seh

#5
9:51, 12 июня 2018

Daniil Petrov
> Поможет ли это моему горю, особенно если запись происходит из нескольких
> потоков, бывает что одновременно?

кто мешает mutex использовать ? точнее critical section

#6
1:29, 13 июня 2018

innuendo
> seh
издеваешься : )
я бы подсказал повесить backtrace() на SIGSEGV, но чую автор на винде и не под cygwin/mingw/msys2/WSL

#7
3:15, 13 июня 2018

Sh.Tac.
> я бы подсказал повесить backtrace() на SIGSEGV, но чую автор на винде и не под cygwin/mingw/msys2/WSL
Да-да :) Винда проклятая

#8
8:32, 13 июня 2018

Sh.Tac.
> я бы подсказал повесить backtrace() на SIGSEGV, но чую автор на винде и не под
> cygwin/mingw/msys2/WSL
Ну пусть вешает AddVectoredExceptionHandler, делов-то:

Library: Kernel32.lib
DLL: Kernel32.dll

Ваще пофигу, какой компилятор, хоть LuaJIT+FFI.
#9
9:26, 13 июня 2018

Daniil Petrov
> Поможет ли это моему горю, особенно если запись происходит из нескольких
> потоков, бывает что одновременно?
по умолчанию fwrite потокобезопасен, поэтому если ты тупо просто один раз вызываешь fwrite с записью в конец файла, то нет смысла дополнительно еще синхронизировать функцию лога. Если же ты пытаешься записать мелкими порциями за раз тогда вешай mutex и записывай в свой внутренний  буфер, а когда придет время завершать программу запишешь все одним махом. Либо дергать каждый раз потоко не безопасные варианты если они имеются (для случай когда у тебя свой mutex guard).

#10
9:32, 13 июня 2018

Aroch
> а когда придет время завершать программу запишешь все одним махом

иногда бывает нужно смотреть лог во время работы, а не после :)

#11
9:50, 13 июня 2018

innuendo
> иногда бывает нужно смотреть лог во время работы, а не после :)
во время работы проще тогда уж сокет открыть и отправлять чем насиловать винты.

#12
10:03, 13 июня 2018

Aroch
> по умолчанию fwrite потокобезопасен, поэтому если ты тупо просто один раз
> вызываешь fwrite с записью в конец файла, то нет смысла дополнительно еще
> синхронизировать функцию лога.
Именно так и делаю, вопрос был в том, что при вылете приложения многое в файл не записивалось, пришлось выполнять ещё каждый раз и fflush.
Потом отдельно подумаю, как его красивее выполнять, чтоб не при каждой записи и одновременно не терять всё, что как бы записалось, но отлетает перед вылетом приложения.

#13
11:12, 13 июня 2018

Открыл, записал, закрыл и никаких проблем.

#14
11:17, 13 июня 2018

Daniil Petrov
тебе уже сказали, перехватывай segfault и обрабатывай в нем, нет большого смысла каждый раз делать fflush()
https://habr.com/post/131412/

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.