Fixed:read media file bug.
This commit is contained in:
parent
93c02056b5
commit
cf7ac85f1f
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 ¶m)
|
StatusCode CameraHalTest::StartSingleTask(const CameraTaskParam ¶m)
|
||||||
{
|
{
|
||||||
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user