Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Запись файла лога

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

Страницы: 1 2 Следующая »
Daniil PetrovПостоялецwww12 июня 20186:02#0
Как вы боретесь со следующей ситуацией?
1) При запуске приложения открывается файл лога на запись.
2) Приложение работает до определённого момента и успевает сделать несколько записей.
3) Приложение вылетает и файл лога остаётся пустой.
4) Файл лога должен закрываться при удачном завершении работы приложения.

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

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

WraithПостоялецwww12 июня 20186:07#1
Либо делай fflush() на каждой записи, либо лови креш и делай fflush() перед выходом.
TiendilУчастникwww12 июня 20187:05#2
>лови креш и делай fflush() перед выходом.
так лучше
Daniil PetrovПостоялецwww12 июня 20187:46#3
Благодарю! Пока сделал для каждой записи, помогло.
А как корректно ловить креш для неопределённого участка кода?
На тот случай, если на каком-то компьютере по непонятной причине вылетит та или иная библиотека.
innuendoПостоялецwww12 июня 20189:08#4
seh
innuendoПостоялецwww12 июня 20189:51#5
Daniil Petrov
> Поможет ли это моему горю, особенно если запись происходит из нескольких
> потоков, бывает что одновременно?

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

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

Sh.Tac.Постоялецwww13 июня 20181:29#6
innuendo
> seh
издеваешься : )
я бы подсказал повесить backtrace() на SIGSEGV, но чую автор на винде и не под cygwin/mingw/msys2/WSL

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

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

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

DelfigamerПостоялецwww13 июня 20188:32#8
Sh.Tac.
> я бы подсказал повесить backtrace() на SIGSEGV, но чую автор на винде и не под
> cygwin/mingw/msys2/WSL
Ну пусть вешает AddVectoredExceptionHandler, делов-то:
Library: Kernel32.lib
DLL: Kernel32.dll

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

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

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

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

ArochПостоялецwww13 июня 20189:50#11
innuendo
> иногда бывает нужно смотреть лог во время работы, а не после :)
во время работы проще тогда уж сокет открыть и отправлять чем насиловать винты.
Daniil PetrovПостоялецwww13 июня 201810:03#12
Aroch
> по умолчанию fwrite потокобезопасен, поэтому если ты тупо просто один раз
> вызываешь fwrite с записью в конец файла, то нет смысла дополнительно еще
> синхронизировать функцию лога.
Именно так и делаю, вопрос был в том, что при вылете приложения многое в файл не записивалось, пришлось выполнять ещё каждый раз и fflush.
Потом отдельно подумаю, как его красивее выполнять, чтоб не при каждой записи и одновременно не терять всё, что как бы записалось, но отлетает перед вылетом приложения.
nesПостоялецwww13 июня 201811:12#13
Открыл, записал, закрыл и никаких проблем.
ArochПостоялецwww13 июня 201811:17#14
Daniil Petrov
тебе уже сказали, перехватывай segfault и обрабатывай в нем, нет большого смысла каждый раз делать fflush()
https://habr.com/post/131412/
Страницы: 1 2 Следующая »

/ Форум / Программирование игр / Общее

2001—2018 © GameDev.ru — Разработка игр