希望對大家有幫助 來自於
1、開啟onvif除錯開關,以便讓onvif列印一些可用的除錯資訊。
在makefile中新增除錯巨集定義如: cc = gcc -ddebug
2、開啟除錯巨集後,預設在程式執行的目錄產生三個檔案:
recv.log
sent.log
test.log
recv.log是onvif接收到的soap資料,沒接收一條,都會在recv.log中記錄
sent.log是onvif傳送出去的soap資料,沒傳送一套,也會在sent.log中生成記錄
最後是test.log,如果說recv和sent可以用wireshark工具抓包代替,那麼test.log是誰也替代不了的,test.log記錄了onvif的實時的工作狀態。
尤其當出現segmentation fault錯誤,test.log就成了唯一乙個能夠定位到具體記憶體出錯的地方了。
3、最常見的錯誤:segmentation fault錯誤的解決方法
segmentation fault錯誤是onvif開發過程最常見的錯誤,至少我是這樣的,主要是由於訪問了沒有分配位址的記憶體導致的,在填充功能函式時,很容易漏掉為必須的結構體分配記憶體,導致gsoap產生的**會在不知情的狀況下訪問該結構體,然後報segmentation fault錯誤。那如何快速的定位到記憶體出錯的地方呢?
有人說使用gdb、在這裡gdb除錯工具起不到什麼作用的,因為gdb定位到的記憶體訪問錯誤,是真的定位到訪問時的那一條**,而onvif中訪問結構體內存的**是有gsoap自動產生的,**本身並沒有錯,是最高一層的填充錯誤,這時候gdb就顯得無能為力了。只能通過test.log定位。
我故意將將成員變數uri的記憶體非配注釋掉,然後編譯執行程式,出現記憶體錯誤:
雖然我在函式裡,列印了一條資訊,表明出錯的函式,現在我們完全可以忽略該資訊,直接看test.log
出現記憶體錯誤等致命錯誤,程式會立刻結束,所以開啟test.log直接看最後面的資訊
[plain]view plain
copy
print?
element begin tag='soap-env:body' level='1' id='0' type=''
lookup location=0xbfd44a30 type=1548: not found
element begin tag='trt:getsnapshoturiresponse' level='2' id='0' type=''
element begin tag='trt:mediauri' level='3' id='0' type=''
element begin tag='soap-env:body' level='1' id='0' type=''
lookup location=0xbfd44a30 type=1548: not found
element begin tag='trt:getsnapshoturiresponse' level='2' id='0' type=''
element begin tag='trt:mediauri' level='3' id='0' type=''
最後一條顯示的element begin tag=' trt:mediauri',說明程式在開始編碼trt:getsnapshoturiresponse的trt:mediauri出了問題,這裡回過頭來看源**,
結構體的第一條就是uri,假如我注釋的並不是uri,而是__any等,那麼test.log中的最後一條就肯定不是上面那樣子的,我們可以再一些測試,說明test.log對於查詢錯誤的重要性。
修改的程式如下:
重新執行程式,執行到這段**的時候就會產生乙個記憶體錯誤,我們再次開啟test.log
從列印的資訊來看,tt:timeout已經編碼結束了,然後才出現的問題,這是再看看源**中timeout後面的成員變數是什麼
所以就很快的定位到出錯的地方了。
但是如果使用gdb除錯會是什麼樣的呢,還是可以做一下測試:
這能看出什麼啊?對於除錯onvif,gdb就顯得那麼多餘了。。。
段錯產生原因及除錯技巧
產生段錯誤是因為訪問了不該訪問的空間,比如 1 對空指標 指向位址為null的指標 進行操作。2 對野指標 未被初始化的指標 進行操作。3 陣列越界。4 用指針對陣列進行操作,指標偏移到了陣列長度之外。5 對唯讀空間進行操作,比如,操作.rodata空間區域,字串常量 如字串 hello 便是儲存在...
段錯誤除錯
1 gdb除錯 1 第一步是使用帶有除錯標誌 debugging flags 的方式編譯這段 如下 gcc g segfault.c 2 執行可執行程式 gdb a.out 進入gdb模式 gdb run 執行程式 starting program home dgawd cpsc 363 a.out...
段錯誤除錯
核心轉儲core dumped 概念 當 個程序要異常終止時,可以選擇把程序的使用者空間記憶體資料全部儲存到磁碟上,檔名通常是core,這叫做core dump。也叫核心轉儲,幫助開發者進行除錯,在程式崩潰時把記憶體資料dump到硬碟上,讓gdb識別 乙個程序允許產生多大的core檔案取決於程序的 ...