前面文章只是給出簡單演示,實際的程式執行中會遇到這樣或那樣的問題。所以,本文結合筆者實際程式設計經歷,給出一些曾經遇到過的實際例子。
筆者遇到的大多數程式崩潰原因,基本上都是段錯誤:非法記憶體使用,越界。這就要在程式編碼中注意**的質量了。比如使用指標前必須先判斷其合法性,釋放指標後及時將指標置為null,使用陣列注意不能超出其範圍,等等。
下面的例子是筆者前段時間進行的onvif程式的片段。除錯過程如下:
注:筆者在實際工作中就遇到乙個rtsp模組使用多級指標但不做判斷的情況,由於接手的程式龐大又不熟悉架構,而且還是在特定方案中出現,所以排查起來很麻煩,所幸用coredump還是能定位到問題所在。
下面的例子同樣是onvif程式,是vector使用方式不恰當導致。
program terminated with signal sigsegv, segmentation fault.
#0 0x083deb46 in devicebindingproxyimpl::getservices (this=0xa383ff8, services=...) at src/onvifdevicebindingproxyimpl.cpp:68
68 services_[i].versionmajor = resp.service[i]->version->major;
(gdb) bt
#0 0x083deb46 in devicebindingproxyimpl::getservices (this=0xa383ff8, services=...) at src/onvifdevicebindingproxyimpl.cpp:68
#1 0x083af56a in onvifclient::test (this=0xa33a008, ip=0xbf88d91e "172.18.45.16") at onvifclient.cpp:101
#2 0x083af024 in main_cpp (argc=2, argv=0xbf88bdd4) at main.cpp:24
#3 0x083aefc4 in main (argc=2, argv=0xbf88bdd4) at main.cpp:10
**片段:
for (unsigned int i = 0; i < resp.service.size(); i++)
services_.push_back(tmp); // push_back,vector會自動增長
}注:std::vector為空情況下,不能直接用[i].***的方法來賦值,可以呼叫resize()預先設定大小。不過最好的是使用push_back。
後續可能也許會不定時更新本文。
李遲 2016.5.31 周二 晚
linux下core dump的妙用
在unix系統中,常將 主記憶體 main memory 稱為核心 core 因為在使用半導體作為記憶體材料之前,便是使用核心 core 而核心映像 core image 就是 程序 process 執行當時的記憶體內容。當程序發生段錯誤或收到 訊號 signal 而終止執行時,系統會將核心映像寫入...
Linux下core dump (段錯誤)
在linux下開發時,如果程式突然崩潰了,也沒有任何日誌。這時可以檢視core檔案。從core檔案中分析原因,通過gdb看出程式掛在 分析前後的變數,找出問題的原因。當程式執行的過程中異常終止或崩潰,作業系統會將程式當時的記憶體狀態記錄下來,儲存在乙個檔案中,這種行為就叫做core dump 中文有...
linux 下如何開啟core dump檔案開關
在linux下面就簡單的許多。只要開啟相應的開關,linux會自動在程式crash時生成相應的core檔案。這個檔案和window下的dump檔案類似。下面是簡單的一些步驟 1.檢視當前是否已經開啟了此開關 通過命令 ulimit c 如果輸出為 0 則代表沒有開啟。如果為unlimited則已經開...