Fixed:read media file bug.
This commit is contained in:
parent
93c02056b5
commit
cf7ac85f1f
doc
middleware/MediaManager/src
test
application/HuntingCamera/src_mock
hal/tool/src
|
@ -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=<optimized out>, argv=<optimized out>)
|
||||
at /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/test/middleware/McuManager/mainTest.cpp:22
|
||||
(gdb)
|
||||
```
|
||||
```
|
||||
|
|
|
@ -118,6 +118,9 @@ void MediaHandle::StartTaskTimer(void)
|
|||
LogInfo("StartTaskTimer start.\n");
|
||||
media->TaskTimer();
|
||||
};
|
||||
if (mTaskTimerThread.joinable()) {
|
||||
mTaskTimerThread.join();
|
||||
}
|
||||
std::shared_ptr<MediaHandle> 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<MediaHandle> media = shared_from_this();
|
||||
mFrameHandleThread = std::thread(taskTimerThread, media);
|
||||
}
|
||||
|
|
|
@ -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<VMediaTask> mRecordTask;
|
||||
std::vector<MediaTaskResponse> mTaskResponse;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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<VCameraHalMonitor> &monitor)
|
||||
{
|
||||
|
@ -86,6 +56,10 @@ void CameraHalTest::SetCameraMonitorTrace(std::shared_ptr<VCameraHalMonitor> &mo
|
|||
StatusCode CameraHalTest::StartSingleTask(const CameraTaskParam ¶m)
|
||||
{
|
||||
LogInfo("CameraHalTest::StartSingleTask\n");
|
||||
if (mTaskTimerThread.joinable()) {
|
||||
mTaskTimerThread.join();
|
||||
}
|
||||
ReadFileInit();
|
||||
auto taskTimerThread = [=](std::shared_ptr<CameraHalTest> 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)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user