/* * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /////////////////////////////////////////////////////////////////////////////// /// \ingroup SS_SM_Logging /// \brief This file supports SM logging. /// /////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ss_system_manager.h" /////////////////////////////////////////////////////////////////////////// // Function : OnObtainLoggerserviceLogRequest // brief : Collect frameworkunifiedlog artifact and return a response to // SS_Logger. /////////////////////////////////////////////////////////////////////////// static int getExecedString(char* const argv[], std::stringstream &ss) { int ret; int pipeFd[2]; // 0:read, 1:write pid_t pid; ret = pipe(pipeFd); if (ret != 0) { // LCOV_EXCL_BR_LINE 5:pipe's error case // LCOV_EXCL_START 5:pipe's error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert SS_ASERT_ERRNO(0); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) goto error_exit; // LCOV_EXCL_STOP } pid = fork(); if (pid == -1) { // LCOV_EXCL_BR_LINE 5:fork's error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert SS_ASERT_ERRNO(0); // LCOV_EXCL_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } else if (pid == 0) { close(pipeFd[0]); // unnecessary pile (closing read) close(1); // closing stdout dup2(pipeFd[1], 1); // take stdout to pipe execve(argv[0], argv, environ); SS_ASERT_ERRNO(0); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) exit(EXIT_FAILURE); } else { char readBuf[256]; ssize_t rs; SS_ASERT_ERRNO(0 == close(pipeFd[1])); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) fd_set rfds; FD_ZERO(&rfds); // LCOV_EXCL_BR_LINE 15: marco defined in ns_logger_if.h // NOLINT(whitespace/line_length) FD_SET(pipeFd[0], &rfds); // LCOV_EXCL_BR_LINE 15: marco defined in ns_logger_if.h // NOLINT(whitespace/line_length) struct timeval timeout; timeout.tv_sec = 2; timeout.tv_usec = 0; int selRet = select(pipeFd[0] + 1, &rfds, NULL, NULL, &timeout); switch (selRet) { case 1: if (FD_ISSET(pipeFd[0], &rfds)) { do { rs = read(pipeFd[0], readBuf, sizeof(readBuf) - 1); if (rs > 0) { readBuf[rs] = '\0'; ss << readBuf; } else if (rs == -1) { // LCOV_EXCL_BR_LINE 5:read's error case // LCOV_EXCL_START 5:read's error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert if (errno != EINTR) { SS_ASERT_ERRNO(0); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) ret = -1; break; } // LCOV_EXCL_STOP } } while (rs != 0); } else { SS_ASERT(0); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } break; case -1: SS_ASERT_ERRNO(0); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) break; default: // LCOV_EXCL_START 5:never be this case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert if (0 == selRet) { ss << "timeout" << std::endl; } else { ss << "ERR:rslt=" << selRet << std::endl; } break; // LCOV_EXCL_STOP } // SM leaves processing to OnProcessExitDetected when using child process // SS_ASERT_ERRNO(-1 != waitpid(pid,&status,0)); } SS_ASERT_ERRNO(0 == close(pipeFd[0])); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) error_exit: return ret; } static int saveProcsMemInfo(std::ofstream &fo) { DIR *dir = NULL; int ret = 0; try { struct dirent dent, *next; // LCOV_EXCL_BR_START 11:unexpected branch // NOLINT(whitespace/line_length) { fo << "******** mem info **********" << std::endl; std::ifstream fin("/proc/meminfo"); std::string line; while (fin && std::getline(fin, line)) { fo << line << endl; } } { fo << "******** slab info **********" << std::endl; std::ifstream fin("/proc/slabinfo"); std::string line; while (fin && std::getline(fin, line)) { fo << line << endl; } } { fo << "******** zone info **********" << std::endl; std::ifstream fin("/proc/zoneinfo"); std::string line; while (fin && std::getline(fin, line)) { fo << line << endl; } } // LCOV_EXCL_BR_STOP // Linux dependency codes dir = opendir("/proc"); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (dir == NULL) { // LCOV_EXCL_BR_LINE 5:opendir's error case // LCOV_EXCL_START 11:opendir's error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert SS_ASERT_ERRNO(0); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) throw eFrameworkunifiedStatusFail; // LCOV_EXCL_STOP } fo << "******** proc status **********" << std::endl; while (0 == readdir_r(dir, &dent, &next) && next) { if (DT_DIR == dent.d_type) { struct stat statbuf; std::string statPath("/proc/"); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) statPath += dent.d_name; statPath += "/status"; if (stat(statPath.c_str(), &statbuf) == 0) { std::ifstream fin(statPath.c_str()); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) std::string line; while (fin && std::getline(fin, line)) { if (strstr(line.c_str(), "Name") != NULL || strstr(line.c_str(), "Pid") != NULL || strstr(line.c_str(), "Vm") != NULL) { fo << line << endl; } } fo << "************************************" << std::endl; } } } SS_ASERT_ERRNO(0 == closedir(dir)); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } catch (...) { if (dir) { // LCOV_EXCL_BR_LINE 5:opendir's error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert SS_ASERT_ERRNO(0 == closedir(dir)); // LCOV_EXCL_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } ret = -1; } return ret; } /////////////////////////////////////////////////////////////////////////// // Function : OnObtainLoggerserviceLogRequest // brief : Collect frameworkunifiedlog artifact and return a response to // SS_Logger. /////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::SendLogArtifactResponseToLogger(HANDLE f_hApp, EArtifactId f_artifactId, std::string f_artifactFilePathAndName) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus; HANDLE l_hLoggerServiceSession; ModuleLaunchListIter l_ModuleListIter; ARTIFACT_RESPONSE l_artifactResponse; l_artifactResponse.ArtifactId = f_artifactId; strncpy(l_artifactResponse.FilePathAndName, f_artifactFilePathAndName.c_str(), sizeof(l_artifactResponse.FilePathAndName) - 1); if (eFrameworkunifiedStatusOK != (l_eStatus = GetModuleIterator(SERVICE_LOGGER, l_ModuleListIter))) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: GetModuleIterator(%s) errored: %d/'%s'", SERVICE_LOGGER, l_eStatus, GetStr(l_eStatus).c_str()); } else { l_hLoggerServiceSession = l_ModuleListIter->hsession; l_eStatus = FrameworkunifiedSendMsg(l_hLoggerServiceSession, SS_SM_ERROR_EVENT_ARTIFACT_RSPN, sizeof(l_artifactResponse), &l_artifactResponse); LOG_ERROR_REC_HIST_IF_ERRORED(l_eStatus, // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) "FrameworkunifiedSendMsg(SS_SM_ERROR_EVENT_ARTIFACT_RSPN)"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnErrorEventArtifactRequest /// Dispatch logging requests to the various handlers. /// /// \param f_hApp Framework application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnErrorEventArtifactRequest(HANDLE hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus; INTERFACEUNIFIEDLOG_RECEIVED_FROM(hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg < EArtifactId > (hApp, m_requestedArtifactId))) { // LCOV_EXCL_BR_LINE 200:NSFW error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert LOG_ERROR("ReadMsg()"); // LCOV_EXCL_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } else { switch (m_requestedArtifactId) { case eArtifactIdBootMicroLog: l_eStatus = OnObtainBootMicroLog(hApp); LOG_ERROR_REC_HIST_IF_ERRORED(l_eStatus, "OnObtainBootMicroLog()"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) break; case eArtifactIdSystemDataCsv: l_eStatus = OnObtainSystemmanagerSystemDataCsv(hApp); LOG_ERROR_REC_HIST_IF_ERRORED(l_eStatus, "OnObtainSystemmanagerSystemDataCsv()"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) break; case eArtifactIdShowMemTxt: l_eStatus = OnObtainShowMemTxt(hApp); LOG_ERROR_REC_HIST_IF_ERRORED(l_eStatus, "OnObtainShowMemTxt()"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) break; case eArtifactIdProcessCore: SS_ASERT(0); // Never called in Linux PF // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) break; case eArtifactIdDebugDumpLog: l_eStatus = OnObtainDebugDumpLog(hApp); LOG_ERROR_REC_HIST_IF_ERRORED(l_eStatus, "OnObtainDebugDumpLog()"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) break; default: FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: Unsupported logging artifact requested: %d.", m_requestedArtifactId); break; } } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnObtainBootMicroLog /// Obtain the boot micro log content, write file to disk, and send filename to SL. /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnObtainBootMicroLog(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus; INTERFACEUNIFIEDLOG_RECEIVED_FROM(f_hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) FRAMEWORKUNIFIEDLOG(ZONE_STATE, __FUNCTION__, "from %s", FrameworkunifiedGetMsgSrc(f_hApp)); l_eStatus = RequestBootMicroLog(f_hApp); LOG_ERROR_REC_HIST_IF_ERRORED(l_eStatus, "RequestBootMicroLog"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnBootMicroLogResponse /// Boot micro log response sent from the logging shadow. /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnBootMicroLogResponse(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; UI_32 l_len; std::string l_artifactFilePathAndName; m_errorEventTimers[eSM_ERROR_EVENT_TIMER_BOOT_MICRO_LOG_RSPN].Stop(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) INTERFACEUNIFIEDLOG_RECEIVED_FROM(f_hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) FRAMEWORKUNIFIEDLOG(ZONE_STATE, __FUNCTION__, "from %s", FrameworkunifiedGetMsgSrc(f_hApp)); if (0 == strcmp(TIMER_SERVICE_NAME, FrameworkunifiedGetMsgSrc(f_hApp))) { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. Timer expired while waiting for the boot micro log."); } else if (0 == (l_len = FrameworkunifiedGetMsgLength(f_hApp))) { // LCOV_EXCL_BR_LINE 200:restricted by ss_sm_client // LCOV_EXCL_START 200:restricted by ss_sm_client AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: Invalid log response received. Length cannot be 0."); // LCOV_EXCL_STOP } else { char l_buf[l_len]; // NOLINT l_eStatus = FrameworkunifiedGetMsgDataOfSize(f_hApp, l_buf, static_cast(sizeof(l_buf)), eSMRRelease); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 200:NSFW error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert LOG_ERROR("FrameworkunifiedGetMsgDataOfSize()"); // LCOV_EXCL_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } else { l_artifactFilePathAndName = "/tmp/bootmicro.log"; l_len = static_cast(strlen((const char *) l_buf)); std::ofstream l_stream(l_artifactFilePathAndName.c_str()); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.write(l_buf, l_len); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.close(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } } l_eStatus = SendLogArtifactResponseToLogger(f_hApp, m_requestedArtifactId, l_artifactFilePathAndName); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (l_eStatus != eFrameworkunifiedStatusOK) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: SendLogArtifactResponseToLogger(Artifact '%d', '%s') " "errored: %d/'%s'", m_requestedArtifactId, l_artifactFilePathAndName.c_str(), l_eStatus, GetStr(l_eStatus).c_str()); } return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnErrorEventBootMicroLogResponseTimeout /// Called when the boot micro log request timer expires (e.g. no response). /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnErrorEventBootMicroLogResponseTimeout(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; std::string l_artifactFilePathAndName = ""; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: Boot micro log response timed out. Sending empty artifact response to SSL."); l_eStatus = SendLogArtifactResponseToLogger(f_hApp, m_requestedArtifactId, l_artifactFilePathAndName); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (l_eStatus != eFrameworkunifiedStatusOK) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: SendLogArtifactResponseToLogger(Artifact '%d', '%s') " "errored: %d/'%s'", m_requestedArtifactId, l_artifactFilePathAndName.c_str(), l_eStatus, GetStr(l_eStatus).c_str()); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnObtainSystemmanagerSystemDataCsv /// Obtain system content, write file to disk, and send filename to SL. /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnObtainSystemmanagerSystemDataCsv(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; // std::string l_artifactFilePathAndName = "/tmp/frameworkunified_systemdata.csv"; // std::ofstream l_stream(l_artifactFilePathAndName.c_str()); std::stringstream l_stream; char *l_pSignalName; INTERFACEUNIFIEDLOG_RECEIVED_FROM(f_hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) // Output version info { // LCOV_EXCL_BR_START 11:unexpected branch // NOLINT(whitespace/line_length) CSSVer ver; l_stream << "********** PACKAGE VERSIONS **********\n"; l_stream << left; l_stream << setw(16) << "PACKAGE" << setw(24) << "VERSION" << setw(10) << "DATE" << endl; for (SSVerPkgListIter ite = ver.begin(); ite != ver.end(); ite++) { l_stream << setw(16) << ite->first; l_stream << setw(24) << ite->second.version; l_stream << setw(10) << ite->second.date << std::endl; } // LCOV_EXCL_BR_STOP FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "\n%s", l_stream.str().c_str()); l_stream.str(""); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.clear(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } // LCOV_EXCL_BR_START 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "********** Error Description Start ***********" << endl; l_stream << "Error Event Type," << GetStr(m_errorEventCurrentIter->m_eventType) << endl; l_stream << m_errorEventCurrentIter->m_eventEnqueueTimeStamp.c_str() << endl; l_stream << "MessageStr," << m_errorEventCurrentIter->m_loggingInfo.messageStr.c_str() << endl; // LCOV_EXCL_BR_STOP { UI_32 l_ErrLogCount = 0; if (PowerHalGetResetInfo(AGL_ERRLOG_COUNTER, &l_ErrLogCount)) { // LCOV_EXCL_BR_LINE 11:Gcov constraints (because exception-handling routes are automatically generated) FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "Could not get AGL_ERRLOG_COUNTER from power_hal."); } { l_stream << "ErrLogCount," << l_ErrLogCount << "/" << SS_SM_ERR_LOGGING_LIMIT << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } } switch (m_errorEventCurrentIter->m_eventType) { case eErrorEventTypeProcessCrash: l_stream << "Crash Failure Binary Name," << m_errorEventCurrentIter->m_loggingInfo.binaryFileName << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "Module PID," << m_errorEventCurrentIter->m_loggingInfo.pid << endl; l_stream << "Exit Value," << m_errorEventCurrentIter->m_loggingInfo.exitValue << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_pSignalName = strsignal( m_errorEventCurrentIter->m_loggingInfo.signalNumber); if (NULL != l_pSignalName) { l_stream << "Exit Signal," << m_errorEventCurrentIter->m_loggingInfo.signalNumber // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) << "," << l_pSignalName << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } break; case eErrorEventTypeProcessExit: l_stream << "Exit Binary Name," << m_errorEventCurrentIter->m_loggingInfo.binaryFileName << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "Module PID," << m_errorEventCurrentIter->m_loggingInfo.pid << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "Exit Value," << m_errorEventCurrentIter->m_loggingInfo.exitValue << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) break; case eErrorEventTypeHeartBeatFailure: l_stream << "HB Failure Module Queue Name," << m_errorEventCurrentIter->m_moduleQueueName.c_str() << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "***************** HB Information Start *******************" << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "Entire State," << m_HBReport.eEntireState << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "Module Name,HB State,Retry Count" << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) for (UI_32 i = 0; i < m_HBReport.nNumOfModules; i++) { if (0 != m_HBReport.tModuleList[i].HeartBeatRetryCount) { l_stream << m_HBReport.tModuleList[i].ProcQueueName << "," // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) << m_HBReport.tModuleList[i].ProcHBState << "," // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) << m_HBReport.tModuleList[i].HeartBeatRetryCount // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } } l_stream << "***************** HB Information End *******************" << endl; break; case eErrorEventTypeSystemLowMemory: l_stream << "Free Memory Available (Byte)," << m_FreeMemAvailable << endl; break; case eErrorEventTypeBootMicroReset: l_stream << "Boot Micro Reset Reason," << m_BootMicroResetReason << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) break; case eErrorEventTypeModConnFailed: l_stream << "Failed Module Queue Name," << m_errorEventCurrentIter->m_moduleQueueName.c_str() << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) break; case eErrorEventTypeStartRespFailed: l_stream << "Failed Module Queue Name," << m_errorEventCurrentIter->m_moduleQueueName.c_str() << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) break; // No additional event specific log information to add. case eErrorEventTypeUserInvokedCollectAllLogs: case eErrorEventTypeUserInvokedCollectScreenShot: case eErrorEventTypeUserInvokedCollectInterfaceunifiedLogs: case eErrorEventTypeUserInvokedUserForceReset: case eErrorEventTypeUserInvokedCollectDevLogs: default: break; } { std::ifstream finNum("/proc/sys/vm/nr_oom_kill_process"); std::string strNum; if (finNum && std::getline(finNum, strNum)) { // LCOV_EXCL_BR_LINE 200:will not be this case // LCOV_EXCL_START 200:will not be this case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert char *endptr = NULL; long lNum = strtol(strNum.c_str(), &endptr, 10); // NOLINT if (('\0' != *endptr) || (lNum < 0)) { SS_ASERT(0); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } else { l_stream << "nr_oom_kill_process," << strNum.c_str() << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (0 != lNum) { std::ifstream finLast("/proc/sys/vm/last_oom_kill_victim"); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) std::string strLast; if (finLast && std::getline(finLast, strLast)) { l_stream << "last_oom_kill_victim," << strLast.c_str() << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } } } } // LCOV_EXCL_STOP } l_stream << "********** Error Description End ***********" << endl << endl; FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "\n%s", l_stream.str().c_str()); fprintf(stderr, "SS_SysManager/\n%s", l_stream.str().c_str()); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.str(""); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.clear(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "********** Variant Code Start ***********" << endl; if (NULL != m_pVarCodeStr) { l_stream << m_pVarCodeStr << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } else { l_stream << "Variant coding not available." << endl; } l_stream << "********** Variant Code End ***********" << endl << endl; FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "\n%s", l_stream.str().c_str()); l_stream.str(""); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.clear(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "********** File System Information Start ***********" << endl; l_stream << "== mounts info start==" << endl; { std::ifstream fin("/proc/mounts"); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) std::string line; while (fin && std::getline(fin, line)) { l_stream << line << endl; } } l_stream << "== mounts info end ==" << endl; FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "\n%s", l_stream.str().c_str()); l_stream.str(""); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.clear(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << "== DF info start==" << endl; { char* const argv[] = { const_cast("/bin/df"), const_cast("-a"), static_cast(NULL), }; SS_ASERT(0 == getExecedString(argv, l_stream)); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } l_stream << "== DF info end==" << endl; FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "\n%s", l_stream.str().c_str()); l_stream.str(""); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.clear(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) #if 0 // Need to install lsblk if requested so that it is not installed l_stream << "== lsblk info start==" << endl; { char* const argv[] = { const_cast("/usr/debug/bin/lsblk"), const_cast("-o"), const_cast("NAME,KNAME,MAJ:MIN,FSTYPE,PARTLABEL,MODEL,SERIAL,REV,VENDOR"), const_cast(NULL), }; SS_ASERT(0 == getExecedString(argv, l_stream)); } l_stream << "== lsblk info end==" << endl; FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "\n%s", l_stream.str().c_str()); l_stream.str(""); l_stream.clear(); #endif l_stream << "== proc info start==" << endl; { char* const argv[] = { const_cast("/bin/ps"), const_cast("auxc"), const_cast("-L"), static_cast(NULL), }; SS_ASERT(0 == getExecedString(argv, l_stream)); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } l_stream << "== proc info end==" << endl; { // Output is splitted so that the FRAMEWORKUNIFIEDLOG can not write data over 4K Bytes at a time std::list strList; boost::split(strList, static_cast(l_stream.str()), boost::is_any_of("\n")); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) int ii = 0; std::stringstream ss; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) for (std::list::iterator ite = strList.begin(); ite != strList.end(); ite++) { ss << *ite << endl; ii++; if (ii > 20) { FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "\n%s", ss.str().c_str()); ss.str(""); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) ss.clear(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) ii = 0; } } FRAMEWORKUNIFIEDLOG(ZONE_SYSLOG, __FUNCTION__, "\n%s", ss.str().c_str()); } l_stream.str(""); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.clear(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_eStatus = SendLogArtifactResponseToLogger(f_hApp, m_requestedArtifactId, ""); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (l_eStatus != eFrameworkunifiedStatusOK) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: SendLogArtifactResponseToLogger(Artifact '%d') " "errored: %d/'%s'", m_requestedArtifactId, l_eStatus, GetStr(l_eStatus).c_str()); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnObtainShowMemTxt /// Obtain showmem content, write file to disk, and send filename to SL. /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnObtainShowMemTxt(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; INTERFACEUNIFIEDLOG_RECEIVED_FROM(f_hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ns_logger_if.h // NOLINT(whitespace/line_length) std::string l_artifactFilePathAndName = "/tmp/showmem.txt"; { std::ofstream fo(l_artifactFilePathAndName.c_str()); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) saveProcsMemInfo(fo); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } l_eStatus = SendLogArtifactResponseToLogger(f_hApp, m_requestedArtifactId, l_artifactFilePathAndName); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (l_eStatus != eFrameworkunifiedStatusOK) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: SendLogArtifactResponseToLogger(Artifact '%d', '%s') " "errored: %d/'%s'", m_requestedArtifactId, l_artifactFilePathAndName.c_str(), l_eStatus, GetStr(l_eStatus).c_str()); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnErrorEventCoreFilePollTimeout /// Called periodically to verify whether the process core file has completed /// being written to disk. When complete, this function sends an artifact /// response to SSL. /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnErrorEventCoreFilePollTimeout(HANDLE f_hApp) { // LCOV_EXCL_START 8:dead code AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; BOOL l_sendResponse = FALSE; std::string l_artifactFilePathAndName = ""; std::ostringstream l_coreFilePathAndName; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) // struct stat l_fileInfo; struct stat64 l_fileInfo; int l_result; off_t l_coreFileSize; INTERFACEUNIFIEDLOG_RECEIVED_FROM(f_hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) l_coreFilePathAndName << "/debug/" << m_errorEventCurrentIter->m_loggingInfo.binaryFileName << ".core.gz"; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) // l_result = stat(l_coreFilePathAndName.str().c_str(), &l_fileInfo); l_result = stat64(l_coreFilePathAndName.str().c_str(), &l_fileInfo); if (l_result == 0) { l_coreFileSize = l_fileInfo.st_size; if ((l_coreFileSize > m_coreFileSizeBytes) || // Core file grew from last read. (l_coreFileSize == 0)) { // Core file not yet updated externally. m_coreFileSizeBytes = l_coreFileSize; // Wait until file stops growing. bool result = m_errorEventTimers[eSM_ERROR_EVENT_TIMER_CORE_FILE_POLL].Start( // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) 0, SS_ERROR_EVENT_CORE_FILE_POLL_TO_MS, 0, 0); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (FALSE == result) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: Failed to start timer SS_ERROR_EVENT_CORE_FILE_POLL_TO_MS."); l_sendResponse = TRUE; } else { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. Core file: %s, size: %ld still growing.", l_coreFilePathAndName.str().c_str(), m_coreFileSizeBytes); l_sendResponse = FALSE; } } else { // File has stopped growing. FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. Core file: %s, size: %ld write complete. Sending artifact response.", l_coreFilePathAndName.str().c_str(), m_coreFileSizeBytes); l_artifactFilePathAndName = l_coreFilePathAndName.str(); l_sendResponse = TRUE; } } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Info. Core file: %s, unable to determine size. Sending empty artifact response to SSL.", l_coreFilePathAndName.str().c_str()); l_sendResponse = TRUE; } if (TRUE == l_sendResponse) { l_eStatus = SendLogArtifactResponseToLogger(f_hApp, // Error getting file size. Send empty path to SSL. m_requestedArtifactId, l_artifactFilePathAndName); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (l_eStatus != eFrameworkunifiedStatusOK) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: SendLogArtifactResponseToLogger(Artifact '%d', '%s') " "errored: %d/'%s'", m_requestedArtifactId, l_artifactFilePathAndName.c_str(), l_eStatus, GetStr(l_eStatus).c_str()); } } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_STOP /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnObtainDebugDumpLog /// Obtain debug dump content, write file to disk, and send filename to SL. /// See OnModuleDebugDumpResponse(). /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnObtainDebugDumpLog(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; INTERFACEUNIFIEDLOG_RECEIVED_FROM(f_hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) ModuleLaunchListIter l_moduleIter; m_NbrDebugDumpRspnRecv = 0; for (GroupLaunchMapIter l_GroupIter = m_MapProclaunchGrps.begin(); l_GroupIter != m_MapProclaunchGrps.end(); l_GroupIter++) { for (l_moduleIter = l_GroupIter->second.modules.begin(); l_moduleIter != l_GroupIter->second.modules.end(); l_moduleIter++) { const BOOL isModuleConnected = l_moduleIter->IsModuleConnected(); // LCOV_EXCL_BR_LINE 11:Gcov constraints (because exception-handling routes are automatically generated) if ((SERVICE_NS_NPP != l_moduleIter->name) && // NPP is a special case and does NOT session connect with SM. (TRUE == isModuleConnected)) { l_eStatus = FrameworkunifiedSendMsg(l_moduleIter->hsession, SS_SM_DEBUG_DUMP, 0, NULL); if (eFrameworkunifiedStatusOK == l_eStatus) { // LCOV_EXCL_BR_LINE 200:NSFW error case FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Info. FrameworkunifiedSendMsg(SS_SM_DEBUG_DUMP) to %s succeeded.", // LCOV_EXCL_BR_LINE 15: marco defined in ns_logger_if.h // NOLINT(whitespace/line_length) l_moduleIter->name.c_str()); // LCOV_EXCL_BR_LINE 15: marco defined in ns_logger_if.h // NOLINT(whitespace/line_length) } else { // LCOV_EXCL_START 200:NSFW error case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: FrameworkunifiedSendMsg(%p, SS_SM_DEBUG_DUMP) to %s errored: %d/'%s'", (void *) l_moduleIter->hsession, l_moduleIter->name.c_str(), l_eStatus, GetStr(l_eStatus).c_str()); // LCOV_EXCL_STOP } } } } // Call debug dump handler for SM. l_eStatus = OnSystemManagerDebugDump(f_hApp); LOG_STATUS(l_eStatus, "OnSystemManagerDebugDump()"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) // Refresh debug dump timeout timer after each debug dump response received. // Non AGL framework modules will have the remaining time after the last // received response to complete their debug dump. bool result = m_errorEventTimers[eSM_ERROR_EVENT_TIMER_DEBUG_DUMP_RSPN].Start( SS_ERROR_EVENT_DEBUG_DUMP_RSPN_TO_SEC, 0, 0, 0); if (FALSE == result) { // LCOV_EXCL_BR_LINE 200:will not be this case // LCOV_EXCL_START 200:will not be this case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: Failed to start timer eSM_TIMER_DEBUG_DUMP_RSPN_MONITOR."); // LCOV_EXCL_STOP } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnDebugDumpResponseReceived /// Debug Dump complete Response handler. /// See OnDebugDumpCompleteTimeout(). /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnDebugDumpResponseReceived(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; ModuleLaunchListIter l_ModuleListIter; UI_32 l_len; INTERFACEUNIFIEDLOG_RECEIVED_FROM(f_hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ns_logger_if.h // NOLINT(whitespace/line_length) std::string l_moduleName = FrameworkunifiedGetMsgSrc(f_hApp); FRAMEWORKUNIFIEDLOG(ZONE_STATE, __FUNCTION__, "from %s", l_moduleName.c_str()); SetCmdHist("SS_SM_DEBUG_DUMP_RSPN", m_SMCmdHist, m_SMHistIter, FrameworkunifiedGetMsgSrc(f_hApp)); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) // SM is not launched by SM and is therefore not in the process list. // SM does however use the same debug dump mechanism as other processes. if (l_moduleName != SERVICE_SYSMANAGER) { l_eStatus = GetModuleIterator(l_moduleName.c_str(), l_ModuleListIter); if (eFrameworkunifiedStatusOK != l_eStatus) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: Module %s not found in Group Launch Map", l_moduleName.c_str()); } else { l_ModuleListIter->SetModuleDebugDumpState(MODULE_DEBUG_DUMP_STATE_RESPONSE_RECEIVED); } } if (0 == (l_len = FrameworkunifiedGetMsgLength(f_hApp))) { // LCOV_EXCL_BR_LINE 200:restricted by ss_sm_client // LCOV_EXCL_START 200:restricted by ss_sm_client AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert l_eStatus = eFrameworkunifiedStatusInvldBufSize; LOG_ERROR("0 == FrameworkunifiedGetMsgLength(f_hApp)"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) // LCOV_EXCL_STOP } else { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Received debug dump response from %s, size: %d bytes. " "Total number of responses received: %d", l_moduleName.c_str(), l_len, m_NbrDebugDumpRspnRecv); UI_8 l_buf[l_len]; // NOLINT l_eStatus = FrameworkunifiedGetMsgDataOfSize(f_hApp, l_buf, static_cast(sizeof(l_buf)), eSMRRelease); if (eFrameworkunifiedStatusOK != l_eStatus) { LOG_ERROR("FrameworkunifiedGetMsgDataOfSize()"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) } else { ios_base::openmode l_mode; if (0 == m_NbrDebugDumpRspnRecv) { // Create new file. l_mode = std::ios_base::trunc; } else { // Append existing file. l_mode = std::ios_base::app; } std::ofstream l_stream("/tmp/systemmanager_debugdump.log", l_mode); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream << l_buf << endl; // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) l_stream.close(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) } m_NbrDebugDumpRspnRecv++; // Refresh debug dump timeout timer after each debug dump response received. // Non AGL framework modules will have the remaining time after the last // received response to complete their debug dump. bool result = m_errorEventTimers[eSM_ERROR_EVENT_TIMER_DEBUG_DUMP_RSPN].Start( // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) SS_ERROR_EVENT_DEBUG_DUMP_RSPN_TO_SEC, 0, 0, 0); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (FALSE == result) { // LCOV_EXCL_BR_LINE 200:will not be this case // LCOV_EXCL_START 200:will not be this case AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200:test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: Failed to start timer eSM_TIMER_DEBUG_DUMP_RSPN_MONITOR."); l_eStatus = OnDebugDumpCompleteTimeout(f_hApp); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) LOG_ERROR_REC_HIST_IF_ERRORED(l_eStatus, // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) "OnDebugDumpCompleteTimeout()"); // LCOV_EXCL_BR_LINE 15: marco defined in ss_system_manager.h // NOLINT(whitespace/line_length) // LCOV_EXCL_STOP } } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_eStatus; } /////////////////////////////////////////////////////////////////////////////// /// \ingroup OnDebugDumpCompleteTimeout /// Called after the last debug dump message is received, or when the debug /// dump monitor timer expires. /// /// \param [in] f_hApp - Application handle. /// /// \return EFrameworkunifiedStatus /// Success ==> eFrameworkunifiedStatusOK /// Failure ==> Other values /////////////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CSystemManager::OnDebugDumpCompleteTimeout(HANDLE f_hApp) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; std::string l_artifactFilePathAndName = "/tmp/systemmanager_debugdump.log"; INTERFACEUNIFIEDLOG_RECEIVED_FROM(f_hApp); // LCOV_EXCL_BR_LINE 15: marco defined in ss_templates.h // NOLINT(whitespace/line_length) m_errorEventTimers[eSM_ERROR_EVENT_TIMER_DEBUG_DUMP_RSPN].Stop(); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "Received '%d' Debug Dump responses.", m_NbrDebugDumpRspnRecv); l_eStatus = SendLogArtifactResponseToLogger(f_hApp, m_requestedArtifactId, l_artifactFilePathAndName); // LCOV_EXCL_BR_LINE 11:unexpected branch // NOLINT(whitespace/line_length) if (l_eStatus != eFrameworkunifiedStatusOK) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: SendLogArtifactResponseToLogger(Artifact '%d', '%s') " "errored: %d/'%s'", m_requestedArtifactId, l_artifactFilePathAndName.c_str(), l_eStatus, GetStr(l_eStatus).c_str()); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_eStatus; }