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

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

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

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

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

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

12 июня 2018 (Правка: 6:06)

#1

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

12 июня 2018

#2

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

12 июня 2018

#3

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

12 июня 2018

#4

seh

12 июня 2018

#5

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

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

12 июня 2018 (Правка: 9:51)

#6

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

13 июня 2018 (Правка: 2:01)

#7

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

13 июня 2018 (Правка: 3:16)

#8

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

Library: Kernel32.lib
DLL: Kernel32.dll

Ваще пофигу, какой компилятор, хоть LuaJIT+FFI.

13 июня 2018 (Правка: 8:34)

#9

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

13 июня 2018

#10

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

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

13 июня 2018

#11

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

13 июня 2018

#12

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

13 июня 2018

#13

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

13 июня 2018

#14

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

13 июня 2018

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