Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » С++ отключить прокручивание лог файла

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

BoriSS23

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня на телефоне уже .so (Shared Object) файлы я их могу павить в Ida Pro и есть исходники C++ в которых я могу смотреть чистый код.
 
Кода много, но конкретно этот кусок который пишет в лог сообщения небольшой, однако не могу распазнать в нём как именно реализована прокрутка (log rotation) лога, файл максимум около 3 мегабайт когда этот размер набран потом внутри сообщения начинают прокручиваться с потерей старой информации, задача сделать чтобы все сообщения оставались на месте, а увеличивался размер файла.
 
Я скину те куски кода которые относятся к данному файлу вы подскажите мне где и что искать я уже сутки потратил на поиски, сам я не с++ програмист поэтому возможно не замечаю.
 
Поискал через IDE все места где встречается переменная debugLogFilename и pDebugLogFile это всё где они используются, почему же тогда лог прокручивается?
 
Вспомогательные функции

Код:
 
static CAMX_INLINE INT VSNPrintF(
        CHAR*       pDst,
        SIZE_T      sizeDst,
        const CHAR* pFormat,
        va_list     argptr)
    {
        INT numCharWritten = 0;
#if defined(_LINUX)
        numCharWritten = vsnprintf(pDst, sizeDst, pFormat, argptr);
#elif defined(_WIN32)
        numCharWritten = vsnprintf_s(pDst, sizeDst, _TRUNCATE, pFormat, argptr);
#elif defined(ANDROID)
        numCharWritten = vsnprintf(pDst, sizeDst, pFormat, argptr);
#else
        CAMX_STATIC_ASSERT_MESSAGE(FALSE, "Unsupported Target");
#endif // defined(_LINUX)
        return numCharWritten;
    }
 
 
static CAMX_INLINE INT SNPrintF(
        CHAR*       pDst,
        SIZE_T      sizeDst,
        const CHAR* pFormat,
                    ...)
    {
        INT     numCharWritten;
        va_list args;
 
        va_start(args, pFormat);
        numCharWritten = VSNPrintF(pDst, sizeDst, pFormat, args);
        va_end(args);
 
        return numCharWritten;
    }
 
FILE* OsUtils::FOpen(
    const CHAR* pFilename,
    const CHAR* pMode)
{
    return fopen(pFilename, pMode);
}
 
 
VOID OsUtils::GetDateTime(
    CamxDateTime* pDateTime)
{
    CAMX_ASSERT(NULL != pDateTime);
    struct timeval  timeValue;
    struct tm*      pTimeInfo   = NULL;
    INT             result      = 0;
 
    result = gettimeofday(&timeValue, NULL);
    if (0 == result)
    {
        pTimeInfo = localtime(&timeValue.tv_sec);
        if (NULL != pTimeInfo)
        {
            pDateTime->seconds                           = static_cast<UINT32>(pTimeInfo->tm_sec);
            pDateTime->microseconds                   = static_cast<UINT32>(timeValue.tv_usec);
            pDateTime->minutes                           = static_cast<UINT32>(pTimeInfo->tm_min);
            pDateTime->hours                              = static_cast<UINT32>(pTimeInfo->tm_hour);
            pDateTime->dayOfMonth                     = static_cast<UINT32>(pTimeInfo->tm_mday);
            pDateTime->month                             = static_cast<UINT32>(pTimeInfo->tm_mon);
            pDateTime->year                               = static_cast<UINT32>(pTimeInfo->tm_year);
            pDateTime->weekday                         = static_cast<UINT32>(pTimeInfo->tm_wday);
            pDateTime->yearday                          = static_cast<UINT32>(pTimeInfo->tm_yday);
            pDateTime->dayLightSavingTimeFlag   = static_cast<UINT32>(pTimeInfo->tm_isdst);
        }
    }
}
 
INT OsUtils::FPrintF(
    FILE*       pFile,
    const CHAR* pFormat,
                ...)
{
    INT     result;
    va_list argptr;
 
    va_start(argptr, pFormat);
    result = vfprintf(pFile, pFormat, argptr);
    va_end(argptr);
 
    return result;
}
 
CamxResult OsUtils::FClose(
    FILE* pFile)
{
    CamxResult result = CamxResultSuccess;
    if (0 != fclose(pFile))
    {
        result = CamxResultEFailed;
    }
    return result;
}
 

 
 

Код:
 
 
m_pStaticSettings->debugLogFilename=Log_file
 
 
if ('\0' != m_pStaticSettings->debugLogFilename[0])
{
    FILE*   pDebugLogFile           = NULL;
    CHAR    filename[FILENAME_MAX]  = {0};
    OsUtils::SNPrintF(filename, sizeof(filename),
                      "%s%s%s.bin",
                      ConfigFileDirectory, PathSeparator, m_pStaticSettings->debugLogFilename);
 
    pDebugLogFile                      = OsUtils::FOpen(filename, "w");
    newLogInfo.pDebugLogFile    = pDebugLogFile;
}
else
{
    newLogInfo.pDebugLogFile = NULL;
}
 

 
 

Код:
 
m_debugLogInfo.pDebugLogFile = pNewLogInfo->pDebugLogFile;
 
if (NULL != g_logInfo.pDebugLogFile)
{
    OsUtils::FClose(g_logInfo.pDebugLogFile);
    g_logInfo.pDebugLogFile = NULL;
}
 
if (NULL != g_logInfo.pDebugLogFile)
{
    CamxDateTime systemDateTime;
    OsUtils::GetDateTime(&systemDateTime);
    OsUtils::FPrintF(g_logInfo.pDebugLogFile, "%02d-%02d %02d:%02d:%02d:%03d %s\n", systemDateTime.month,
                           systemDateTime.dayOfMonth, systemDateTime.hours, systemDateTime.minutes, systemDateTime.seconds,
                           systemDateTime.microseconds / 1000, logText);
}
 
 

 
 

Код:
 
if (NULL != CamX::g_logInfo.pDebugLogFile)
{
    CamX::OsUtils::FPrintF(CamX::g_logInfo.pDebugLogFile, "%s\n", assertText);
}
 

Всего записей: 186 | Зарегистр. 18-12-2014 | Отправлено: 11:30 28-07-2024 | Исправлено: BoriSS23, 13:34 28-07-2024
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На линуксе этим занимается отдельный процесс logrotate.
Но не таким извращённым способом, вмешиваясь в содержание логфайла.
Может и тут кто-то другой по ночам смотрит на дату и время в заголовках строк и стирает старые.
Правда, непонятно как он справляется, если учесть, что имеется только месяц, день и врема, а нет года.

Всего записей: 1553 | Зарегистр. 01-11-2004 | Отправлено: 12:25 28-07-2024
BoriSS23

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens в этом приложении для фото логи летят в режиме реального времени за пару 5 секунд может набраться 50мб логов в зависимости от того какой уровень детализации включить.
 
Чатгпт пишет что на андройде обычно нету logrotate, сэкстрактил файлы с телефона нету ничего с таким именем logrotate.
 

Цитата:
 Правда, непонятно как он справляется, если учесть, что имеется только месяц, день и врема, а нет года.

может просто когда максимальный размер достигнут то pointer для каждого нового сообщения ставиться в начало файла?
 
есть ещё такие вспомогательные функции в приложении, но не вижу чтобы они применялись к данному логу.
 

Код:
 
CamxResult OsUtils::FFlush(
    FILE* pFile)
{
    CamxResult result = CamxResultSuccess;
    if (0 != fflush(pFile))
    {
        result = CamxResultEFailed;
    }
    return result;
}
 
INT OsUtils::FScanF(
    FILE*       pFile,
    const CHAR* pFormat,
    ...)
{
    INT     result;
    va_list argptr;
 
    va_start(argptr, pFormat);
    result = vfscanf(pFile, pFormat, argptr);
    va_end(argptr);
 
    return result;
}
 
 
CamxResult OsUtils::FSeek(
    FILE*   pFile,
    INT64   offset,
    INT     origin)
{
    CamxResult result = CamxResultSuccess;
    if (0 != fseeko(pFile, static_cast<off_t>(offset), origin))
    {
        result = CamxResultEFailed;
    }
    return result;
}
 
INT64 OsUtils::FTell(
    FILE* pFile)
{
    return static_cast<INT64>(ftello(pFile));
}
 
UINT64 OsUtils::GetFileSize(
    const CHAR* pFilename)
{
    UINT64      size     = 0;
    struct stat statBuf;
 
    if (0 == stat(pFilename, &statBuf))
    {
        size = statBuf.st_size;
    }
 
    return size;
}
 

Всего записей: 186 | Зарегистр. 18-12-2014 | Отправлено: 12:37 28-07-2024 | Исправлено: BoriSS23, 12:57 28-07-2024
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
... нету logrotate

Есть, только по другому называется - logcat.

Всего записей: 1553 | Зарегистр. 01-11-2004 | Отправлено: 12:57 28-07-2024
BoriSS23

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 Есть, только по другому называется - logcat.

 
Догкат он глючный когда столько сообщений за секунду летит то в logcat постоянно нехватает сообщений а в логе который выше они всегда есть.
 
Хотя с другой стороны в логкат примерно там 3мб буфер и есть по дефолту, но из кода выше же следует что он пишет напрямую в файл.

Код:
pDebugLogFile = OsUtils::FOpen(filename, "w");

Всего записей: 186 | Зарегистр. 18-12-2014 | Отправлено: 12:59 28-07-2024 | Исправлено: BoriSS23, 13:03 28-07-2024
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В OsUtils(); может быть всё что угодно.
A, там  fopen, было выше.
Тогда действительно логи обрабатывает кто-то другой.
 

Всего записей: 1553 | Зарегистр. 01-11-2004 | Отправлено: 13:17 28-07-2024 | Исправлено: ne_viens, 13:26 28-07-2024
BoriSS23

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
В OsUtils(); может быть всё что угодно.  

Я думаю там вся логика с прокруткой в функции которая пишет в лог.
 
OsUtils::FPrintF() я в первом посте привёл её содержимое но вроди она просто упираетс в vfprintf(pFile, pFormat, argptr);  
 
Добавлено:
Всё оказалось намного проще, не нужно искать о чего нету.  
 
Тут имеется ошибка кодера, в Ida Pro сделал дебаггинг тригерит ся fopen и fclose каждый раз при отрытии приложения для фото, а должно быть один раз при запуске сервиса, потому и перезаписывает лог.
 
Это вроде называется "Circular dependency problem".
 

 
теперь вопрос как профиксить код чтобы избежать данной проблемы, с учётом того что фикс будет в ассемблере и там особо не распишешся. по идее мне норм если даже файл открыть для записи и не закрывать более пока телефон или сервис камеры не перезагрузится.

Всего записей: 186 | Зарегистр. 18-12-2014 | Отправлено: 14:19 28-07-2024 | Исправлено: BoriSS23, 16:50 28-07-2024
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » С++ отключить прокручивание лог файла


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru