From cf7ac85f1ff738a3bd282a0fe9f276fbc08aed78 Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Sat, 13 Jul 2024 11:24:05 +0800 Subject: [PATCH] Fixed:read media file bug. --- doc/gdb_coredump_guide.md | 33 ++++---- middleware/MediaManager/src/MediaHandle.cpp | 6 ++ middleware/MediaManager/src/RecordMp4.h | 2 +- .../src_mock/MediaManager_Mock_Test.cpp | 16 ++++ test/hal/tool/src/CameraHalMock.cpp | 77 +++++++++++-------- test/hal/tool/src/CameraHalMock.h | 2 + 6 files changed, 87 insertions(+), 49 deletions(-) diff --git a/doc/gdb_coredump_guide.md b/doc/gdb_coredump_guide.md index b7de2ad..04175f5 100644 --- a/doc/gdb_coredump_guide.md +++ b/doc/gdb_coredump_guide.md @@ -1,10 +1,10 @@ # 1. gdb coredump分析 -  本文介绍ubuntu系统环境下coredump文件的分析方法。 +  本文介绍ubuntu系统环境下coredump文件的分析方法。**重要:此文的场景在Ubuntu每次开机后需要重复设置coredump调试环境,例如开启coredump和设置coredump文件生成路径。** **一个coredump示例:** -``` +```code $ ../output_files/test/bin/McuManagerTest --gtest_filter=McuManagerTest.RH_INTEGRATION_McuManager_AUTO_OtherSideSendIpcMission Note: Google Test filter = McuManagerTest.RH_INTEGRATION_McuManager_AUTO_OtherSideSendIpcMission [==========] Running 1 test from 1 test suite. @@ -33,29 +33,31 @@ Aborted (core dumped) ## 1.1. coredump文件生成路径查询 -``` +```code $ cat /proc/sys/kernel/core_pattern |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E ``` 修改coredump文件生成路径: -``` -$ sudo sh -c 'echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern' +```code +$ sudo sh -c 'echo /home/xiaojiazhu/project/ipc-sdk/ipc/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern' $ cat /proc/sys/kernel/core_pattern /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p ``` + 命令: sudo sh -c 'echo /path/core.%e.%p > /proc/sys/kernel/core_pattern' -例如: -``` +例如(根据自己的实际情况写路径参数): + +```code sudo sh -c 'echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern' ``` **发现路径下并未生成coredump文件** -``` +```code $ ulimit -a core file size (blocks, -c) 0 // 0表示终端未开启core dump data seg size (kbytes, -d) unlimited @@ -76,12 +78,11 @@ file locks (-x) unlimited ``` 解决: -``` + +```code $ ulimit -c unlimited ``` -sudo echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern - ## 1.2. gdb查看堆栈信息 **Ubuntu系统需要加sudo执行程序才会生成coredump文件。** @@ -90,7 +91,7 @@ sudo echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/   在gdb中无法识别coredump文件,如下所示: -``` +```code $ sudo gdb ../output_files/test/bin/McuManagerTest core.smbd.3390383 [sudo] password for xiaojiazhu: Sorry, try again. @@ -123,11 +124,11 @@ Program terminated with signal SIGABRT, Aborted. #2 0x0000000000000000 in ?? () ``` -由于gdb和asan同时启用会冲突,导致无法识别coredump文件。解决办法如下: +**由于gdb和asan同时启用会冲突,导致无法识别coredump文件。解决办法如下:** 修改://build/sdk_config.cmake -``` +```code # Gdb debug if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX}) message("---------------------------Debug mode.-----------------------") @@ -149,7 +150,7 @@ endif() 解决后: -``` +```code $ sudo gdb ../output_files/test/bin/McuManagerTest core.McuManagerTest.3406751 GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2 Copyright (C) 2020 Free Software Foundation, Inc. @@ -206,4 +207,4 @@ Program terminated with signal SIGABRT, Aborted. #17 main (argc=, argv=) at /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/test/middleware/McuManager/mainTest.cpp:22 (gdb) -``` \ No newline at end of file +``` diff --git a/middleware/MediaManager/src/MediaHandle.cpp b/middleware/MediaManager/src/MediaHandle.cpp index ee77a78..ce1850a 100644 --- a/middleware/MediaManager/src/MediaHandle.cpp +++ b/middleware/MediaManager/src/MediaHandle.cpp @@ -118,6 +118,9 @@ void MediaHandle::StartTaskTimer(void) LogInfo("StartTaskTimer start.\n"); media->TaskTimer(); }; + if (mTaskTimerThread.joinable()) { + mTaskTimerThread.join(); + } std::shared_ptr media = shared_from_this(); mTaskTimerThread = std::thread(taskTimerThread, media); } @@ -162,6 +165,9 @@ void MediaHandle::StartFrameHandle(void) LogInfo("StartFrameHandle start.\n"); media->FrameHandle(); }; + if (mFrameHandleThread.joinable()) { + mFrameHandleThread.join(); + } std::shared_ptr media = shared_from_this(); mFrameHandleThread = std::thread(taskTimerThread, media); } diff --git a/middleware/MediaManager/src/RecordMp4.h b/middleware/MediaManager/src/RecordMp4.h index b88bac4..369d812 100644 --- a/middleware/MediaManager/src/RecordMp4.h +++ b/middleware/MediaManager/src/RecordMp4.h @@ -33,7 +33,7 @@ public: bool HandleFinished(void) override; private: - std::mutex mMutex; + std::mutex mMutex; // TODO: To improve and delete this mutex. void *mRecordMp4Object; std::shared_ptr mRecordTask; std::vector mTaskResponse; diff --git a/test/application/HuntingCamera/src_mock/MediaManager_Mock_Test.cpp b/test/application/HuntingCamera/src_mock/MediaManager_Mock_Test.cpp index 4dee901..533fd03 100644 --- a/test/application/HuntingCamera/src_mock/MediaManager_Mock_Test.cpp +++ b/test/application/HuntingCamera/src_mock/MediaManager_Mock_Test.cpp @@ -53,6 +53,22 @@ TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask) MainThread::GetInstance()->Runing(); } // ../output_files/test/bin/HuntingCameraTest +// --gtest_filter=HuntingCameraTest.INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_Twice +TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_Twice) +{ + McuManagerTestTool::MockOtherSideIpcMissionReply(IpcMission::TEST); + SetAllCamerasResult(mAllCamerasMock); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + MainThread::GetInstance()->Init(); + TestManager::ResetTimeOut(1000 * 25); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + HalTestTool::MockKeyClick("reset", 200); // Simulate pressing a button. + std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 15)); + LogInfo("Make a media task 2 times.\n"); + HalTestTool::MockKeyClick("reset", 200); // Simulate pressing a button. + MainThread::GetInstance()->Runing(); +} +// ../output_files/test/bin/HuntingCameraTest // --gtest_filter=HuntingCameraTest.INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_No_sdcard TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_No_sdcard) { diff --git a/test/hal/tool/src/CameraHalMock.cpp b/test/hal/tool/src/CameraHalMock.cpp index b3fe4a3..bdc7a30 100644 --- a/test/hal/tool/src/CameraHalMock.cpp +++ b/test/hal/tool/src/CameraHalMock.cpp @@ -28,26 +28,7 @@ CameraHalTest::CameraHalTest(const CameraType &cameraType) void CameraHalTest::Init(void) { CameraHal::Init(); - if (nullptr == mReadH264File) { - ReadVideoFileCallback videCallback = [](const void *stream, - const unsigned int length, - const unsigned long long duration_us, - void *context) -> void { - ((CameraHalTest *)context)->ReadDataFromH264File(stream, length, duration_us); - }; - mReadH264File = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_H264); - ISetReadVideoCallback(mReadH264File, videCallback, this); - } - if (nullptr == mReadG711aFile) { - ReadAudioFileCallback audioCallback = [](const void *stream, - const unsigned int length, - const unsigned long long duration_us, - void *context) -> void { - ((CameraHalTest *)context)->ReadDataFromG711aFile(stream, length, duration_us); - }; - mReadG711aFile = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_G711A); - ISetReadVideoCallback(mReadG711aFile, audioCallback, this); - } + // ReadFileInit(); } void CameraHalTest::UnInit(void) { @@ -57,18 +38,7 @@ void CameraHalTest::UnInit(void) if (mTaskTimerThread.joinable()) { mTaskTimerThread.join(); } - if (mReadH264File) { - ISetReadVideoCallback(mReadH264File, nullptr, nullptr); - IStopReadFile(mReadH264File); - IMediaBaseFree(mReadH264File); - mReadH264File = nullptr; - } - if (mReadG711aFile) { - ISetReadAudioCallback(mReadG711aFile, nullptr, nullptr); - IStopReadFile(mReadG711aFile); - IMediaBaseFree(mReadG711aFile); - mReadG711aFile = nullptr; - } + ReadFileUnInit(); } void CameraHalTest::SetCameraMonitor(std::shared_ptr &monitor) { @@ -86,6 +56,10 @@ void CameraHalTest::SetCameraMonitorTrace(std::shared_ptr &mo StatusCode CameraHalTest::StartSingleTask(const CameraTaskParam ¶m) { LogInfo("CameraHalTest::StartSingleTask\n"); + if (mTaskTimerThread.joinable()) { + mTaskTimerThread.join(); + } + ReadFileInit(); auto taskTimerThread = [=](std::shared_ptr cameraHal) { LogInfo("MockReportMediaStream start.\n"); cameraHal->MockReportMediaStream(); @@ -134,6 +108,7 @@ void CameraHalTest::MockReportMediaStream(void) */ mTaskRuning = false; } + ReadFileUnInit(); } void CameraHalTest::ReadDataFromH264File(const void *stream, const unsigned int length, const unsigned long long duration_us) @@ -155,6 +130,44 @@ void CameraHalTest::ReadDataFromG711aFile(const void *stream, const unsigned int // LogInfo("CameraHalTest::ReadDataFromG711aFile duration = %ld\n", microseconds); std::this_thread::sleep_for(std::chrono::milliseconds((duration_us / 1000) + 43)); } +void CameraHalTest::ReadFileInit(void) +{ + if (nullptr == mReadH264File) { + ReadVideoFileCallback videCallback = [](const void *stream, + const unsigned int length, + const unsigned long long duration_us, + void *context) -> void { + ((CameraHalTest *)context)->ReadDataFromH264File(stream, length, duration_us); + }; + mReadH264File = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_H264); + ISetReadVideoCallback(mReadH264File, videCallback, this); + } + if (nullptr == mReadG711aFile) { + ReadAudioFileCallback audioCallback = [](const void *stream, + const unsigned int length, + const unsigned long long duration_us, + void *context) -> void { + ((CameraHalTest *)context)->ReadDataFromG711aFile(stream, length, duration_us); + }; + mReadG711aFile = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_G711A); + ISetReadVideoCallback(mReadG711aFile, audioCallback, this); + } +} +void CameraHalTest::ReadFileUnInit(void) +{ + if (mReadH264File) { + ISetReadVideoCallback(mReadH264File, nullptr, nullptr); + IStopReadFile(mReadH264File); + IMediaBaseFree(mReadH264File); + mReadH264File = nullptr; + } + if (mReadG711aFile) { + ISetReadAudioCallback(mReadG711aFile, nullptr, nullptr); + IStopReadFile(mReadG711aFile); + IMediaBaseFree(mReadG711aFile); + mReadG711aFile = nullptr; + } +} CameraHalMock::CameraHalMock(const CameraType &cameraType) : CameraHalTest(cameraType) { } diff --git a/test/hal/tool/src/CameraHalMock.h b/test/hal/tool/src/CameraHalMock.h index 3b2d1e0..391e03b 100644 --- a/test/hal/tool/src/CameraHalMock.h +++ b/test/hal/tool/src/CameraHalMock.h @@ -39,6 +39,8 @@ private: void MockReportMediaStream(void); void ReadDataFromH264File(const void *stream, const unsigned int length, const unsigned long long duration_us); void ReadDataFromG711aFile(const void *stream, const unsigned int length, const unsigned long long duration_us); + void ReadFileInit(void); + void ReadFileUnInit(void); protected: const CameraType mCameraType;