[問題] linux socket程式會造成死當

看板C_and_CPP (C/C++)作者 (Neko)時間12年前 (2014/05/16 10:18), 12年前編輯推噓1(109)
留言10則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux Redhat + GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 都是常見的socket函式 問題(Question): 這問題從去年困擾到現在 不過過去比較忙沒專心處理 現在要解決這個問題 問題就是這個程式運作下去後 會無預期的死當 死當的情況是螢幕畫面停留在最後一刻 不再更新 滑鼠游標無反映 用別台電腦ping不到這台死當的host 可能跟我用sudo有關 希望能找出為什麼讓電腦死當的原因(linux會死當讓我覺得很奇怪) 我寫的這個linux程式 用途是做為中繼站轉送資料 像這樣: A--my--B A會一直產生資料(A不只一個) my是我寫的socket程式 B是轉送的目的地(B不只一個) 主要用select讓單執行緒完成這些工作 我的程式沒有用到memory allocate 陣列都是靜態的 這邊列出所有會用到的function跟用途 socket 建構socket setsockopt 設定socket的reuse bind socket綁定port listen 監聽socket accept 接收新連線 inet_ntop 得到新連線的IP跟port close 關閉連線 send 轉送data (有使用MSG_NOSIGNAL的flag) read 讀取data ioctl 取得socket的buffer大小 做流量控制用 select 檢查每個socket是否有動靜 FD_ZERO 輔助select機制 FD_SET 輔助select機制 FD_ISSET 輔助select機制 FD_CLR 輔助select機制 整隻程式約600多行 也沒有很大 也有用Valgrind檢查是否有memory leak 結果是沒有 警告數0 因為其中一個綁定的port是1023以下 所以執行的時候需要用sudo 我看了很多遍了 看不出哪個function會讓linux整個死當 或是我有什麼更好的debug方法呢 請有經驗的前輩提供意見了 預期的正確結果(Expected Output): 預期運作下去是不會當機的 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.118.127.111 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1400206709.A.E09.html ※ 編輯: neko0624 (140.118.127.111), 05/16/2014 10:20:24

05/16 13:07, , 1F
最笨的方法,插入 trace code @@?
05/16 13:07, 1F

05/16 13:16, , 2F
樓上大大能不能解釋更清楚一點? 這樣聽不太懂
05/16 13:16, 2F

05/16 16:03, , 3F
他的意思大概是多印一些 debug log 來夾擊出問題點吧
05/16 16:03, 3F

05/16 16:05, , 4F
也許你的 select 在某些情況會造成 busy loop 而沒處理
05/16 16:05, 4F

05/16 16:05, , 5F
當然這樣就會死當也很怪,建議改用 epoll_wait 效能較佳
05/16 16:05, 5F

05/17 00:11, , 6F
有沒有ignore Sigpipe?
05/17 00:11, 6F

05/17 05:50, , 7F
真的跟這程式有關嗎o_O 我開synergy也會死當,是顯卡過熱
05/17 05:50, 7F

05/19 12:48, , 8F
re:asoedarren send函式有用MSG_NOSIGNAL 目的就是ignore
05/19 12:48, 8F

05/19 12:48, , 9F
ignore SIGPIPE, 大大認為是這個的原因嗎
05/19 12:48, 9F

05/19 20:09, , 10F
如果願意提供程式碼會更好debug
05/19 20:09, 10F
文章代碼(AID): #1JTNLru9 (C_and_CPP)
文章代碼(AID): #1JTNLru9 (C_and_CPP)