Fixed:read media file bug.

This commit is contained in:
Fancy code 2024-07-13 11:24:05 +08:00
parent 93c02056b5
commit cf7ac85f1f
6 changed files with 87 additions and 49 deletions

View File

@ -1,10 +1,10 @@
# 1. gdb coredump分析 # 1. gdb coredump分析
  本文介绍ubuntu系统环境下coredump文件的分析方法。   本文介绍ubuntu系统环境下coredump文件的分析方法。**重要此文的场景在Ubuntu每次开机后需要重复设置coredump调试环境例如开启coredump和设置coredump文件生成路径。**
**一个coredump示例** **一个coredump示例**
``` ```code
$ ../output_files/test/bin/McuManagerTest --gtest_filter=McuManagerTest.RH_INTEGRATION_McuManager_AUTO_OtherSideSendIpcMission $ ../output_files/test/bin/McuManagerTest --gtest_filter=McuManagerTest.RH_INTEGRATION_McuManager_AUTO_OtherSideSendIpcMission
Note: Google Test filter = McuManagerTest.RH_INTEGRATION_McuManager_AUTO_OtherSideSendIpcMission Note: Google Test filter = McuManagerTest.RH_INTEGRATION_McuManager_AUTO_OtherSideSendIpcMission
[==========] Running 1 test from 1 test suite. [==========] Running 1 test from 1 test suite.
@ -33,29 +33,31 @@ Aborted (core dumped)
## 1.1. coredump文件生成路径查询 ## 1.1. coredump文件生成路径查询
``` ```code
$ cat /proc/sys/kernel/core_pattern $ 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 |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
``` ```
修改coredump文件生成路径 修改coredump文件生成路径
``` ```code
$ sudo sh -c 'echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern' $ 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 $ cat /proc/sys/kernel/core_pattern
/home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p /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' 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' sudo sh -c 'echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern'
``` ```
**发现路径下并未生成coredump文件** **发现路径下并未生成coredump文件**
``` ```code
$ ulimit -a $ ulimit -a
core file size (blocks, -c) 0 // 0表示终端未开启core dump core file size (blocks, -c) 0 // 0表示终端未开启core dump
data seg size (kbytes, -d) unlimited data seg size (kbytes, -d) unlimited
@ -76,12 +78,11 @@ file locks (-x) unlimited
``` ```
解决: 解决:
```
```code
$ ulimit -c unlimited $ 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查看堆栈信息 ## 1.2. gdb查看堆栈信息
**Ubuntu系统需要加sudo执行程序才会生成coredump文件。** **Ubuntu系统需要加sudo执行程序才会生成coredump文件。**
@ -90,7 +91,7 @@ sudo echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/
  在gdb中无法识别coredump文件如下所示   在gdb中无法识别coredump文件如下所示
``` ```code
$ sudo gdb ../output_files/test/bin/McuManagerTest core.smbd.3390383 $ sudo gdb ../output_files/test/bin/McuManagerTest core.smbd.3390383
[sudo] password for xiaojiazhu: [sudo] password for xiaojiazhu:
Sorry, try again. Sorry, try again.
@ -123,11 +124,11 @@ Program terminated with signal SIGABRT, Aborted.
#2 0x0000000000000000 in ?? () #2 0x0000000000000000 in ?? ()
``` ```
由于gdb和asan同时启用会冲突导致无法识别coredump文件。解决办法如下 **由于gdb和asan同时启用会冲突导致无法识别coredump文件。解决办法如下**
修改://build/sdk_config.cmake 修改://build/sdk_config.cmake
``` ```code
# Gdb debug # Gdb debug
if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX}) if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX})
message("---------------------------Debug mode.-----------------------") message("---------------------------Debug mode.-----------------------")
@ -149,7 +150,7 @@ endif()
解决后: 解决后:
``` ```code
$ sudo gdb ../output_files/test/bin/McuManagerTest core.McuManagerTest.3406751 $ sudo gdb ../output_files/test/bin/McuManagerTest core.McuManagerTest.3406751
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2 GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc. Copyright (C) 2020 Free Software Foundation, Inc.
@ -206,4 +207,4 @@ Program terminated with signal SIGABRT, Aborted.
#17 main (argc=<optimized out>, argv=<optimized out>) #17 main (argc=<optimized out>, argv=<optimized out>)
at /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/test/middleware/McuManager/mainTest.cpp:22 at /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/test/middleware/McuManager/mainTest.cpp:22
(gdb) (gdb)
``` ```

View File

@ -118,6 +118,9 @@ void MediaHandle::StartTaskTimer(void)
LogInfo("StartTaskTimer start.\n"); LogInfo("StartTaskTimer start.\n");
media->TaskTimer(); media->TaskTimer();
}; };
if (mTaskTimerThread.joinable()) {
mTaskTimerThread.join();
}
std::shared_ptr<MediaHandle> media = shared_from_this(); std::shared_ptr<MediaHandle> media = shared_from_this();
mTaskTimerThread = std::thread(taskTimerThread, media); mTaskTimerThread = std::thread(taskTimerThread, media);
} }
@ -162,6 +165,9 @@ void MediaHandle::StartFrameHandle(void)
LogInfo("StartFrameHandle start.\n"); LogInfo("StartFrameHandle start.\n");
media->FrameHandle(); media->FrameHandle();
}; };
if (mFrameHandleThread.joinable()) {
mFrameHandleThread.join();
}
std::shared_ptr<MediaHandle> media = shared_from_this(); std::shared_ptr<MediaHandle> media = shared_from_this();
mFrameHandleThread = std::thread(taskTimerThread, media); mFrameHandleThread = std::thread(taskTimerThread, media);
} }

View File

@ -33,7 +33,7 @@ public:
bool HandleFinished(void) override; bool HandleFinished(void) override;
private: private:
std::mutex mMutex; std::mutex mMutex; // TODO: To improve and delete this mutex.
void *mRecordMp4Object; void *mRecordMp4Object;
std::shared_ptr<VMediaTask> mRecordTask; std::shared_ptr<VMediaTask> mRecordTask;
std::vector<MediaTaskResponse> mTaskResponse; std::vector<MediaTaskResponse> mTaskResponse;

View File

@ -53,6 +53,22 @@ TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask)
MainThread::GetInstance()->Runing(); MainThread::GetInstance()->Runing();
} }
// ../output_files/test/bin/HuntingCameraTest // ../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 // --gtest_filter=HuntingCameraTest.INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_No_sdcard
TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_No_sdcard) TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_No_sdcard)
{ {

View File

@ -28,26 +28,7 @@ CameraHalTest::CameraHalTest(const CameraType &cameraType)
void CameraHalTest::Init(void) void CameraHalTest::Init(void)
{ {
CameraHal::Init(); CameraHal::Init();
if (nullptr == mReadH264File) { // ReadFileInit();
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::UnInit(void) void CameraHalTest::UnInit(void)
{ {
@ -57,18 +38,7 @@ void CameraHalTest::UnInit(void)
if (mTaskTimerThread.joinable()) { if (mTaskTimerThread.joinable()) {
mTaskTimerThread.join(); mTaskTimerThread.join();
} }
if (mReadH264File) { ReadFileUnInit();
ISetReadVideoCallback(mReadH264File, nullptr, nullptr);
IStopReadFile(mReadH264File);
IMediaBaseFree(mReadH264File);
mReadH264File = nullptr;
}
if (mReadG711aFile) {
ISetReadAudioCallback(mReadG711aFile, nullptr, nullptr);
IStopReadFile(mReadG711aFile);
IMediaBaseFree(mReadG711aFile);
mReadG711aFile = nullptr;
}
} }
void CameraHalTest::SetCameraMonitor(std::shared_ptr<VCameraHalMonitor> &monitor) void CameraHalTest::SetCameraMonitor(std::shared_ptr<VCameraHalMonitor> &monitor)
{ {
@ -86,6 +56,10 @@ void CameraHalTest::SetCameraMonitorTrace(std::shared_ptr<VCameraHalMonitor> &mo
StatusCode CameraHalTest::StartSingleTask(const CameraTaskParam &param) StatusCode CameraHalTest::StartSingleTask(const CameraTaskParam &param)
{ {
LogInfo("CameraHalTest::StartSingleTask\n"); LogInfo("CameraHalTest::StartSingleTask\n");
if (mTaskTimerThread.joinable()) {
mTaskTimerThread.join();
}
ReadFileInit();
auto taskTimerThread = [=](std::shared_ptr<CameraHalTest> cameraHal) { auto taskTimerThread = [=](std::shared_ptr<CameraHalTest> cameraHal) {
LogInfo("MockReportMediaStream start.\n"); LogInfo("MockReportMediaStream start.\n");
cameraHal->MockReportMediaStream(); cameraHal->MockReportMediaStream();
@ -134,6 +108,7 @@ void CameraHalTest::MockReportMediaStream(void)
*/ */
mTaskRuning = false; mTaskRuning = false;
} }
ReadFileUnInit();
} }
void CameraHalTest::ReadDataFromH264File(const void *stream, const unsigned int length, void CameraHalTest::ReadDataFromH264File(const void *stream, const unsigned int length,
const unsigned long long duration_us) 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); // LogInfo("CameraHalTest::ReadDataFromG711aFile duration = %ld\n", microseconds);
std::this_thread::sleep_for(std::chrono::milliseconds((duration_us / 1000) + 43)); 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) CameraHalMock::CameraHalMock(const CameraType &cameraType) : CameraHalTest(cameraType)
{ {
} }

View File

@ -39,6 +39,8 @@ private:
void MockReportMediaStream(void); void MockReportMediaStream(void);
void ReadDataFromH264File(const void *stream, const unsigned int length, const unsigned long long duration_us); 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 ReadDataFromG711aFile(const void *stream, const unsigned int length, const unsigned long long duration_us);
void ReadFileInit(void);
void ReadFileUnInit(void);
protected: protected:
const CameraType mCameraType; const CameraType mCameraType;