[問題] Exit code為139(segmentation violation)

看板C_and_CPP作者 (超越自己)時間10年前 (2014/05/05 20:53), 10年前編輯推噓10(10039)
留言49則, 8人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux C ----------------- 板上的先進大家好, 小弟有一無窮迴圈C語言程式在Linux下執行, 執行一小時後自動異常終止,出現代碼為139, 請問可能的原因是什麼呢!? 還請板上先進不吝賜教,謝謝大家.. 另可有建議的除錯方法呢!? -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.124.42.70 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1399294386.A.C81.html ※ 編輯: BIAO (140.124.42.70), 05/05/2014 20:58:37

05/05 21:06, , 1F
檢查malloc,free
05/05 21:06, 1F
謝謝t大, 不過整個程式我並沒有使用動態記憶體, 真要說有free的地方就是存取資料庫後的..mysql_free_result(result); 抑或和字串實字有關呢!? 由於不停的迴圈,而重覆一直宣告字串實字.. 程式內的副程式也有多個宣告字元陣列的地方.. 我以為區域變數在離開副程式後,便會釋放掉記憶體空間, 難道不是這樣嘛.. XD 參閱網上此文件http://blog.sina.com.cn/s/blog_75bf554501019cvt.html 一、的確有使用strcpy、sprintf...等指令, 但如果前一小時程式執行沒出錯,一小時後怎麼會出錯呢!? 二、有使用一個執行緒(thread),卻沒加上mutex, 在程序執行過程,小弟刻意不對該執行緒輸入指令, 該執行緒也是無窮迴圈,不停的等候client端送命令進來。 ※ 編輯: BIAO (140.124.42.70), 05/05/2014 21:37:54 附上完整程式碼,還請板上高手指點,謝謝大家..>//< https://www.dropbox.com/sh/tbnn6f0qv3eyalu/F0wfudQZzq ※ 編輯: BIAO (140.124.42.70), 05/05/2014 21:43:25

05/05 22:57, , 2F
105行=> write(sock, "Error Code1", 10);
05/05 22:57, 2F

05/05 22:58, , 3F
是不是要改成11? 我不知道這會不會有影響...
05/05 22:58, 3F

05/06 12:58, , 4F
謝謝k大的指錯..應該是12
05/06 12:58, 4F

05/06 15:53, , 5F
先看看 info_insert() 和 cost_power() 最後是不是少了什麼事.
05/06 15:53, 5F
謝謝y大,目前已將程式碼更改,重新上傳!! 使用valgrind --leak-check=full ./modbus+MySQL+Control26 得到以下結果..(截取片段) ==1411== LEAK SUMMARY: ==1411== definitely lost: 0 bytes in 0 blocks ==1411== indirectly lost: 0 bytes in 0 blocks ==1411== possibly lost: 136 bytes in 1 blocks ==1411== still reachable: 132,438 bytes in 40 blocks ==1411== suppressed: 0 bytes in 0 blocks ==1411== Reachable blocks (those to which a pointer was found) are not shown. ==1411== To see them, rerun with: --leak-check=full --show-reachable=yes ==1411== ==1411== For counts of detected and suppressed errors, rerun with: -v ==1411== Use --track-origins=yes to see where uninitialised values come from ==1411== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 1 from 1) Killed -------------------- 目前打算先找出這5個錯誤,謝謝大家,會再上來回報^^ ※ 編輯: BIAO (140.124.42.70), 05/06/2014 16:11:19

05/06 16:34, , 6F
新版的做過頭, 兩函式中的 res 反而是多做的事了 XD
05/06 16:34, 6F

05/06 16:55, , 7F
不好意思,新版已更正上傳!!
05/06 16:55, 7F

05/06 16:55, , 8F
不過換valgrind跑很慢了.. 遲遲跑不出結果!按了ctrl+C後,
05/06 16:55, 8F

05/06 16:55, , 9F
只出現2個錯誤.. XD
05/06 16:55, 9F

05/07 00:12, , 10F
valgrind 慢是正常的, 一般平均會慢個數倍至十數倍
05/07 00:12, 10F

05/07 07:29, , 11F
139其實就是所謂的萬用錯誤sig 11吧
05/07 07:29, 11F

05/07 07:29, , 12F
你的code有stack堆積的問題嗎?在某些特殊情況下
05/07 07:29, 12F

05/07 07:30, , 13F
stack炸掉是回sig 11(不過我忘了其他情況回的是啥)
05/07 07:30, 13F

05/07 13:23, , 14F
sig 11 => SIGSEGV, SEGV => segmentation violation. 見標題.
05/07 13:23, 14F

05/07 13:33, , 15F
去 wikipedia 查一下, 會有相關說明.
05/07 13:33, 15F

05/07 17:31, , 16F
我不認為查Sig11有幫助。這錯誤其實含擴大多數記憶體
05/07 17:31, 16F

05/07 17:31, , 17F
讀寫的疑難雜症(所以我才說叫做萬用錯誤 因為大概錯誤
05/07 17:31, 17F

05/07 17:32, , 18F
裡面95%都會丟Sig.11). 這範圍太大了,不過我還是建議
05/07 17:32, 18F

05/07 17:32, , 19F
看一下是不是stack炸掉,這是少數valgrind看不出的問題
05/07 17:32, 19F

05/07 18:26, , 20F
樓上所述 stack炸掉 是指 stack overflow 或是什麼?
05/07 18:26, 20F

05/07 18:28, , 21F
原PO有附程式碼,要不要幫忙看看,哪裏可能發生怎樣的問題?
05/07 18:28, 21F

05/07 18:43, , 22F
若是 stack overflow 而 segfault, 我使用valgrind測試的結果,
05/07 18:43, 22F

05/07 18:45, , 23F
會得到一句 Stack overflow in... can't grow stack... 的訊息
05/07 18:45, 23F

05/07 18:46, , 24F
上述測試使用 ubuntu 12.04.2 LTS, valgrind-3.7.0 .
05/07 18:46, 24F

05/08 02:19, , 25F
謝謝y大和K大的熱心協助,目前我已將原程式和執行緒有關的部
05/08 02:19, 25F

05/08 02:21, , 26F
份都先拿掉了,打算用core dump搭配gdb看看結果,今日下午會
05/08 02:21, 26F

05/08 02:22, , 27F
再將精簡的程式碼附上,並將測試結果PO上來,謝謝大家:D
05/08 02:22, 27F

05/08 09:19, , 28F
那就是stack炸掉沒錯。簡單的說,最常見的原因是local
05/08 09:19, 28F

05/08 09:20, , 29F
變數開太多 超出stack的範圍。另外還有一個隱含的可能性
05/08 09:20, 29F

05/08 09:21, , 30F
就是濫用alloc()。我很樂意幫忙debug 但是我現在手邊沒
05/08 09:21, 30F

05/08 09:22, , 31F
linux機器 XD... 只能從大家的feedback, code跟sig 11
05/08 09:22, 31F

05/08 09:22, , 32F
去猜是不是stack用盡造成overflow而已
05/08 09:22, 32F

05/08 09:23, , 33F
喔你是刻意產生stack overflow去看結果喔 我誤會了 =P
05/08 09:23, 33F

05/08 09:28, , 34F
發現少打一個字...是alloca()
05/08 09:28, 34F

05/08 13:41, , 35F
看到原PO上一段的推文, 忽然想到 mysql client library 也可能
05/08 13:41, 35F

05/08 13:42, , 36F
不是編成thread-safe. 可以試著叫用 mysql_thread_safe() 看看
05/08 13:42, 36F

05/08 13:45, , 37F
當然原PO程式很多error-handling都沒做完整,也可能因此出問題.
05/08 13:45, 37F

05/08 13:51, , 38F
另外gdb也是可以處理thread.之前若有core dump情況又是如何?
05/08 13:51, 38F
K大及y大好, 昨天晚上執行程式,資料庫的資料顯示到凌晨4點就結束了, 不過並無產生core dump文件。(有使用ulimit -c unlimited) 現階段再執行一次~~~ (SSH伺服器斷線一次後,系統便無法再登入,要重開機才可以, 這不曉得是哪裡的問題,putty和SSH server都有設逾時) 目前用valgrind跑新版code,沒有完全執行完,直接按Ctrl+C, 出現了一個錯誤,heap釋放不足,不過並沒有說明是哪一行程式碼有問題。 新增了只剩MySQL連線版本的程式,放在雲端硬碟, 請各位幫忙、協助,小弟感激不禁..>///< ※ 編輯: BIAO (140.124.42.70), 05/08/2014 17:32:54

05/08 17:34, , 39F
之前的程式沒有用core dump,並不曉得結果 XD
05/08 17:34, 39F

05/08 17:36, , 40F
K大您好,local變數設定太多!? 不過函數內的變數用完不是就釋
05/08 17:36, 40F

05/08 17:37, , 41F
放了嘛...
05/08 17:37, 41F

05/08 17:37, , 42F
以小弟的程式來說..local變數數量應當是還行吧!? 不過我也的
05/08 17:37, 42F

05/08 17:38, , 43F
確不曉得stack的容量應該不能超過多少XD
05/08 17:38, 43F

05/09 00:04, , 44F
stack上限容量可以用編譯器設定,一般預設大概是1~20MB左右
05/09 00:04, 44F

05/09 18:22, , 45F
謝謝E大 明白了 :D
05/09 18:22, 45F

05/10 22:07, , 46F
執行過一段時間,可能是too many file, 或 no memory
05/10 22:07, 46F

05/12 15:16, , 47F
謝謝大家,問題已找到,估計是程式邏輯不好。沒做例外處理。
05/12 15:16, 47F

05/12 15:16, , 48F
^^
05/12 15:16, 48F

05/12 20:59, , 49F
前面我有提到error-handling不完整.正想問你debug的情況如何:P
05/12 20:59, 49F
回y大的話, 目前(加上執行緒)程式已經不會出現自己中斷了, 不過加上執行緒valgrind會出現possibly lost, 目前還想找出這個原因。 網上有些資訊,有的人是說不用理會possibly lost.. http://www.ptt.cc/bbs/EE_DSnP/M.1384248273.A.E73.html 有的是有說明理由.. http://ppt.cc/DzPE ※ 編輯: BIAO (140.124.42.70), 05/13/2014 15:53:55 使用網上範例,也都有possibly lost.. XD http://www.itkee.com/developer/detail-1b23.html http://blog.csdn.net/feixiaoxing/article/details/7243664 ※ 編輯: BIAO (140.124.42.70), 05/13/2014 17:03:04
文章代碼(AID): #1JPucoo1 (C_and_CPP)