推 johnjohnlin:memory leak? 05/05 21:11
謝謝j大..
整個程式我並沒有使用動態記憶體,
真要說有free的地方就是存取資料庫後的..mysql_free_result(result);
抑或和字串實字有關呢!?
由於不停的迴圈,而重覆一直宣告字串實字..
程式內的副程式也有多個宣告字元陣列的地方..
我以為區域變數在離開副程式後,便會釋放掉記憶體空間,
難道不是這樣嘛.. XD
※ 編輯: BIAO (140.124.42.70), 05/05/2014 21:20:09
參閱網上此文件http://blog.sina.com.cn/s/blog_75bf554501019cvt.html
一、的確有使用strcpy、sprintf...等指令,
但如果前一小時程式執行沒出錯,一小時後怎麼會出錯呢!?
二、有使用一個執行緒(thread),卻沒加上mutex,
在程序執行過程,小弟刻意不對該執行緒輸入指令,
該執行緒也是無窮迴圈,不停的等候client端送命令進來。
附上完整程式碼,還請板上高手指點,謝謝大家..>//<
https://www.dropbox.com/sh/tbnn6f0qv3eyalu/F0wfudQZzq
※ 編輯: BIAO (140.124.42.70), 05/05/2014 21:44:17
→ scott260202:嗯...你的程式存取了不屬於他的範圍的記憶體 05/06 00:30
→ bitlife:前一小時沒錯,一小時候出錯還是代表有錯,只能說前一小時沒 05/06 15:35
→ bitlife:出錯是運氣. 另外程式碼連結無法下載 05/06 15:36
→ bitlife:從你的第二點和1hr症狀來猜測,很可能是race condition問題 05/06 15:37
→ bitlife:如果兩thread會有共用的變數,就該用mutex確保無race現象 05/06 15:39
謝謝b大的解說,
程式碼修正部份小錯誤後已重新上傳。
使用valgrind --leak-check=full ./modbus+MySQL+Control26
得到以下結果..(截取片段)
==1062== HEAP SUMMARY:
==1062== in use at exit: 132,574 bytes in 41 blocks
==1062== total heap usage: 97 allocs, 56 frees, 163,638 bytes allocated
==1062==
==1062== 136 bytes in 1 blocks are possibly lost in loss record 2 of 3
==1062== at 0x482C778: calloc (in
/usr/lib/valgrind/vgpreload_memcheck-arm-linux.so)
==1062==
==1062== LEAK SUMMARY:
==1062== definitely lost: 0 bytes in 0 blocks
==1062== indirectly lost: 0 bytes in 0 blocks
==1062== possibly lost: 136 bytes in 1 blocks
==1062== still reachable: 132,438 bytes in 40 blocks
==1062== suppressed: 0 bytes in 0 blocks
==1062== Reachable blocks (those to which a pointer was found) are not shown.
==1062== To see them, rerun with: --leak-check=full --show-reachable=yes
==1062==
==1062== For counts of detected and suppressed errors, rerun with: -v
==1062== Use --track-origins=yes to see where uninitialised values come from
==1062== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 1 from 1)
Killed
----------------------
--------------------
目前打算先找出這5個錯誤,謝謝大家,會再上來回報^^
※ 編輯: BIAO (140.124.42.70), 05/06/2014 16:31:33
→ bitlife:稍微捲著看了一下程式,你另外要注意row有可能不是標準的 05/06 17:41
→ bitlife:null-terminated string,你把它放進str開頭的函數可能會出 05/06 17:42
→ bitlife:問題,這是我瞄完第一個感覺.反正就是每個s開頭和字串相關 05/06 17:43
→ bitlife:的函數,你就要思考它的參數有沒有可能是非0結尾字串,這是 05/06 17:44
→ bitlife:常見的core dump來源之一 05/06 17:44
謝謝b大的熱心回覆,
原來有非0結尾的字串@@"
那麼str系列都只能處理"0結尾的字串"嗎!?
另想請問..若是非0字串和為0字串相比較的話,
在記憶體空間會產什麼樣的問題呢!?
因為該段程式是比較字串若相等,則做什麼事情..
而程式也的確有依照要求去執行對應的動作(讀取設備資訊),
所以資料庫內也有產生設備資訊,故小弟也沒想太多/.\
這一~二天有閱讀關於C語言和記憶體配置的文件,
若您不嫌棄的話,可否簡短的敘述一下為什麼會產生問題,
謝謝您.. :D
※ 編輯: BIAO (140.124.42.70), 05/06/2014 17:55:48
→ bitlife:以strcpy為例,你copy一段不是「0結尾字串」的資料(例如二 05/06 17:59
→ bitlife:進位資料),strcpy函數就會一直copy到遇到0,萬一讀到非你能 05/06 17:59
→ bitlife:讀取的address前都碰不到0,會讀進無權讀取區,就SIGSEGV了 05/06 18:00
→ bitlife:你是接手維護嗎?能寫出這個程式,應該懂上述這基本概念 05/06 18:01
謝謝b大的詳細解釋,小弟明白了。
我不是接手維護,而是程式開發者,
是自己看書學,或是需要什麼函式就上網查詢,
由於有時程壓力,所以程式底子並沒有很好。
其實我先前並不了解記憶體管理的重要性,
現在終於自食惡果了... XD
※ 編輯: BIAO (140.124.42.70), 05/06/2014 18:16:35