2015-02-06 13 views
0

請看看我最近的問題在這裏:Deadlock with no user code如何分辨當調試是騙你

,你如何知道當調試是騙你的這種方式?當然,除了表明它告訴你的是不可能的?

,因爲我已經在實際上是一些細微的或深奧的問題發生因程序見過這麼多的「不可能」的狀態,我不喜歡依靠這一點。

+0

請不要一個問題(外[元])是指在鏈路的另一個問題。在這裏複製相關文字。 – 2015-02-06 23:32:17

+0

出於好奇,爲什麼?是否擔心另一個問題被刪除/修改? – Bwmat 2015-02-07 01:04:28

回答

1

是的,那些是相當古怪的堆棧跟蹤,特別是一日一。很難理解發生的情況。除非您調試優化的代碼,否則它通常不會被搞砸。

這是提示#1,永遠不要相信調試器告訴你什麼時候你的調試發佈構建的代碼。強烈避免它,但是當你需要解決僵局時,你並不總是有奢侈的。

強烈暗示#2關注的代碼流。在Call Stack窗口中從底部到頂部的阻塞線程的正常情況是yourcode => runtime(msvr120)=> winapi層(kernel32 et al)=> native api(ntdll.dll)。這通常是這種情況,在這種情況下,有些情況下這個流程是相反的,OS從你的代碼中回調到窗口通知,線程啓動(總是在堆棧的最底部),I/O完成。

這是什麼古怪,沒有現實的場景,像ZwWaitForSingleObject一個低級別的原生API函數()都不能直接調用C運行時庫。這是假的,只有頂部條目(塊)可能是準確的。是的,這種方式很難調試。

+0

是的,它是在發佈模式下編譯的代碼。我希望調試器會告訴我,它不確定(儘管這可能不可行,或者導致太多的誤報,我猜) – Bwmat 2015-02-06 22:38:25