前一遍說到了為什麼訪問記憶體會越界,以及我們是如何找到根本原因的。
查閱了msdn一下。如果在呼叫mapviewoffile()的時候,dwnumberofbytestomap如果大於檔案的size,那麼該call就會失敗,並且error code是access denied。
這個解釋貌似和我們發生的很貼切。因為第一次size太大了,第一次就會失敗。但是如果第二次我們指明map到檔案末尾,那麼就會成功。
但是,我們審閱了我們的**後,覺得不會發生這樣的情況。size是根據檔案資訊讀出來的,因而不會有錯。
那會是什麼引起的了?
會不會是message reader這邊用錯了handle了?
看一下handle的information。
0:000> !handle 0x00000cb0 f
handle 00000cb0
type section
attributes 0
grantedaccess 0x4:
none
mapread
handlecount 2
pointercount 4
name \basenamedobjects\3835699d-d3ce-4847-bfca-a50791df408d_log_filemap10
最後的數字,10,是writer新取的instance number。這個數字很蹊蹺,因為應該不會這麼大。
看一下實際上應該是多少。
我們看到,writer那邊的instance number才是2。而reader那邊居然用的是10。這才是導致mapviewoffile失敗的真正原因。
又重新看了遍code。發現**那邊有check number change scenario。但是,**是這麼寫的:
if<//remap the mmf
}
這個地方用的是比較大小來決定需不需要重新mapviewoffile。這個才是真真正正的root cause! 應該用「!=」來判斷!
把這個地方改為"!="後,這個問題再也沒有重現過。
引起的故障
linux 中的!可以快速執行history中的歷史命令,很多時候確實是很便利。昨天因為!引起了一次線上環境的關機,因此我們禁止使用!history 1001 22 30 00 2016 12 30 shutdown h now 1002 00 01 25 2017 01 12 su mysql 如...
syslog可能引起得問題 引起脹氣的原因有哪些?
肚子裡有脹氣,在日常生活中,並不不少見。總是感覺肚子脹脹的,坐也不是,站也不是,就覺得很難受,偶爾發生,對生活和身體都沒什麼太大影響。若是經常發生脹氣,可不能大意,問題也許並不簡單,需要早點了解原因,也能趁早改善問題。到底引起脹氣的原因有哪些?下面就來好好帶你了解一下。引起脹氣的原因究竟是什麼?脹氣...
spring hibernate引起的延遲載入
在hibernate中,延遲載入是1個非常大的優點,但有時候卻給我們帶來一些小麻煩,在後台查詢結束 後,session已經關閉,但在前台顯示的時候,如果存在關聯關係就會產生延遲載入異常。解決辦法是客戶端每次請求就分配1個session,將請求結果返回給客戶端,並完成展現後關閉session 實現這個...