none
請問一個 Unknown exception 的問題 RRS feed

  • 問題

  •  

    請問有沒有人遇過這樣的情形,
    我的程式執行的時候, 大概有 100 多個 threads,
    除了幾個個別處理一些 data 的 thread 外,
    其他都是一個在處理 socket 的 class 的實體,
    平常運作都正常, 但有的時候, 當我插上 USB 裝置(可能是 mouse , 可能是隨身碟)
    程式就會彈出錯誤視窗(microsoft 那個有[回報][不回報]的視窗),
    點進去看 info , 裡頭寫 unknown.....超頭痛....
    然後程式照常執行, 所以應該是其中一個 thread 錯誤離開了,
    這種情形大概都在程式跑一段時間(約 20 分鐘以上)後產生,

    後來用 debug mode 去跑, 程式錯誤時, 並不會造成中斷,
    而是彈出 JIT 的偵錯視窗, 上面寫著 appname.vshost.exe 錯誤[xxxx],
    xxxx 是個四位數字, 不知道是不是就是死掉的那個 thread 的 id,
    這時候程式照常執行, 然後回去開發環境把程式暫停,
    執行緒 list 裡沒有那個編號的執行緒, 所以, 如果 xxxx 真的是 threadID ,
    那應該是那個 thread 死掉(這些都是猜測, 因為我不確定那四位數字到底是什麼)
    接下來, 我程式繼續執行, 回到 JIT 的視窗, 選 vs2005 新的個體去偵錯,
    結果開出一個新的 vs2005 後, 彈出一個 msgbox 說沒辦法攔截已經毀損的處理序,
    按下確定後, 原本在跑的 vs2005 也停掉在 run 的 vshost.exe 回到開發環境了.
    後來發現這種情形並不只是在插拔 usb device 會發生, 我連把 vga 線拔掉再插回去也回,
    有的時候去開個別的 ap 也會, (如 IE, 檔案總管)

    感覺好像系統有什麼 msg 之的時候, 會造成程式的錯誤,
    但我的程式裡頭並沒有覆寫 WndProc 去處理任何 msg....

    又不是十分容易發生, 但總在想不到的時候就彈一個出來.....
    完全不知道該如何 debug.....

    有人有遇過類似的情形嗎?

    另外, 請問 vb2005 的編譯裡頭的偵錯的 full 跟 pdb-only 有什麼差別?
    還有 pdb 檔的內容該怎麼應用?
    是否有比較完整的文件可以查?

    謝謝各位大大...
    2008年9月4日 上午 09:09

解答

所有回覆

  • HI,

     

    執行緒的偵錯可以經由執行[偵錯 | 視窗 | 執行緒]功能, 開啟執行緒視窗, 右鍵點選欲偵錯的執行緒, 選擇[切換至執行緒]功能, 對指定的執行緒進行偵錯

     

    debug information的說明可以參考:

    http://vanryswyckjan.blogspot.com/2005/09/pdb-only-debug-information-option.html

     

    tihs

    2008年9月5日 上午 01:50
  •  

    您好,

     

    彈出 .vshost.exe 錯誤視窗的時候,

    程式依然照常運作, 這時候應該是那個執行緒已經因為錯誤而不正常結束了,

    所以暫停程式後, 已經看不到那個執行緒了....

    我的 100 多個 threads 都是 socket 非同步 receive 的委派, 所以跑完也會正常結束....

    但應該不是這個 function 的問題,因為每個 socket 還是會正常收 data, 然後由 main 表單 invoke 顯示收 data 的狀況,

    因為重新 beginreceive 我是放在這個委派 function 的最後面, 如果是 receive callback function 掛了,

    應該不會再進下一次的 receivecallback.

     

    另外, 謝謝大大提供的網址, 我會再去研究一下

     

    謝謝.

    2008年9月5日 上午 02:47
  • 檢查所有背景執行緒之函式
    要全部加上Try...Catch  攔截錯誤 
    看是要寫Log  還是忽略
    有了Try...Catch  就不會有UnHandled Exception



    2008年9月5日 上午 07:55
  • 感謝大大的回覆,

     

    我剛剛試的結果, 我把由我程式產生的 threads, 在最外層都加上一個 try catch , 然後寫 log.

    結果錯誤還是出來了.....log 是空的....

    看來那個 thread 不是我的程式產生的, 可能是用到的 lib 去產生出來的....

    不知道有沒有辦法可以 trace 是哪個 lib 所產生的, 因為我看到的錯誤訊息都只有 unknown,

     

    另外, 我在另一台跑 release 執行檔看到 unknown 錯誤時, 點詳細資料進去看,

    Module1 的 Image Base 是 0x00400000, 這個東西不知道有沒有用....

    2008年9月5日 上午 09:45
  • 你說的 xxxx 是 PID (ProcessId)

     

    我比較偏向是有東西的獨佔權被破壞~

     

    也有可能是 Driver 本身問題,建議你先針對網卡檢討是否有更新程式,若是內建網卡最好是大廠的晶片,比如說 Intel 的,小廠的晶片 Driver 出問題更新很慢...

    2008年9月5日 上午 11:37
  • 在  Delegate, Event, Callback, Walker, Handler, Timer, Thread, ThreadPool

    都有可能發生 Unknown exception, 建議你看一下這篇文章:

    http://www.eggheadcafe.com/articles/20060305.asp

    2008年10月16日 上午 01:01