專案需求
- 串接實體相機,讀取即時串流存入雙向循環鏈結串列。
- 測試背景建模功能效果。
- 預處理四組影像資料並顯示結果。
- 驗證多攝像頭即時處理顯示效能。
開發過程與踩坑記錄
階段一:資料接收模組(順利)
參考既有 DVR 多通道接收經驗,一天完成單通道與網路攝像頭即時資料讀取與顯示。
階段二:動態庫整合(看似順利)
依介面文件呼叫 update 更新背景、預處理模組,單雙通道顯示正常,但...
階段三:災難來襲 - 程式隨機崩潰
執行一段時間後程式當機,調試數天無果,最終定位兩大核心問題:
問題 1:memcpy 目的/來源大小不一致
- 徵兆:存取違規、堆損毀。
- 根因:設備傳輸的影像幀大小發生變化(推測海康 DVR 與非海康攝像頭相容性問題),導致固定大小的
memcpy 越界。
- 對策:每幀檢查實際資料長度,動態調整緩衝區大小;加入邊界檢查與斷言。
問題 2:雙重釋放與執行緒同步
- 徵兆:Heap corruption、中斷點觸發於
free()。
- 根因:多執行緒同時嘗試釋放同一記憶體塊。
- 對策:引入互斥鎖保護共享資源;後改用 C++ RAII 與拷貝建構函數管理生命週期,徹底解決。
除錯心得總結
- 理解業務邏輯:清楚每個模組的輸入輸出與契約。
- 掌握類別結構:繪製類圖,釐清指標擁有權與傳遞關係。
- 分模組測試:單元測試優於整合測試,快速定位問題域。
- 指標管理紀律:誰配置誰釋放,智慧指標優於裸指標,記錄指標流向。
- 初始化檢查:所有成員變數在建構子中明確初始化。
- 重視 IDE 警告:Visual Studio 的中斷提示、靜態分析警告往往直指問題核心。
- 保持冷靜心態:遇到棘手 Bug 暫時離開,換個角度思考常有突破。
測試動態庫過程中,每一次崩潰都是對記憶體管理與並發控制理解的深化。分享給正在奮戰的同路人,共勉之。