看板 Linux 關於我們 聯絡資訊
板上的先進大家好, 小弟有一無窮迴圈C語言程式在Linux下執行, 執行一小時後自動異常終止,出現代碼為139, 請問可能的原因是什麼呢!? 還請板上先進不吝賜教,謝謝大家.. 另可有建議的除錯方法呢!? -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.124.42.70 ※ 文章網址: http://www.ptt.cc/bbs/Linux/M.1399294309.A.61F.html ※ 編輯: BIAO (140.124.42.70), 05/05/2014 20:58:23
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