Çok kafam karıştı ve debugger'ın bana yalan söylediğini düşünüyorum. Benim kodunda aşağıdaki döngü var:Sıfırla ne zaman bir bölme sıfır değil mi? Hata ayıklayıcısında bir bulmaca (statik değişken sorunları)
MyClass::UploadFile(CString strFile)
{
...
static DWORD dwLockWaitTime = EngKey::GetDWORD(DNENG_SERVER_UPLOAD_LOCK_WAIT_TIME, DNENG_SERVER_UPLOAD_LOCK_WAIT_TIME_DEFAULT);
static DWORD dwLockPollInterval = EngKey::GetDWORD(DNENG_SERVER_UPLOAD_LOCK_POLL_INTERVAL, DNENG_SERVER_UPLOAD_LOCK_POLL_INTERVAL_DEFAULT);
LONGLONG llReturnedOffset(0LL);
BOOL bLocked(FALSE);
for (DWORD sanity = 0; (sanity == 0 || status == RESUMABLE_FILE_LOCKED) && sanity < (dwLockWaitTime/dwLockPollInterval); sanity++)
{
...
Bu döngü benim program süresince yüzlerce kez idam edilmiş ve iki statik değişkenler kodunda yerde değişmez, onlar sadece bir kez yazılır ediyoruz Statik olarak başlatıldığında ve döngü koşullarında ve başka bir yerde okunduğunda. Windows kayıt defterinden okunan kullanıcı ayarları oldukları için, neredeyse her zaman dwLockWaitTime = 60 ve dwLockPollInterval = 5 değerlerine sahip olurlar. Yani döngü her zaman 60/5 yapıyor.
Çok nadiren, çökme yaşıyorum Bu kod satırının sıfır hatasıyla bir bölümü attığını gösteren dökümü. WinDbg ne diyor ben kontrol ettik ve gösterir:
FAULTING_IP:
procname!CServerAgent::ResumableUpload+54a [serveragent.cpp @ 725]
00000001`3f72d74a f73570151c00 div eax,dword ptr [proc!dwLockPollInterval (00000001`3f8eecc0)]
EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 000000013f72d74a (proc!CServerAgent::ResumableUpload+0x000000000000054a)
ExceptionCode: c0000094 (Integer divide-by-zero)
ExceptionFlags: 00000000
NumberParameters: 0
ERROR_CODE: (NTSTATUS) 0xc0000094 - {EXCEPTION} Integer division by zero.
ben montajcı kodunu kontrol ettik ve çarpışma bu div talimatı üzerine gerçekleştiğini gösterir.
00000001`3f72d744 8b0572151c00 mov eax,dword ptr [dwLockWaitTime (00000001`3f8eecbc)]
00000001`3f72d74a f73570151c00 div eax,dword ptr [dwLockPollInterval (00000001`3f8eecc0)]
Yani 000000013f8eecbc
de değer eax
içine taşındı ve daha sonra eax
000000013f8eecc0
de değeri ile bölünmüştür görebilirsiniz.
Sorduğunuz iki değer nedir? Ben beklediğiniz tam olarak
0:048> dd 00000001`3f8eecbc
00000001`3f8eecbc 0000003c 00000005 00000001 00000000
00000001`3f8eeccc 00000000 00000002 00000000 00000000
00000001`3f8eecdc 00000000 7fffffff a9ad25cf 7fffffff
00000001`3f8eecec a9ad25cf 00000000 00000000 00000000
00000001`3f8eecfc 00000000 00000000 00000000 00000000
00000001`3f8eed0c 00000000 00000000 00000000 00000000
00000001`3f8eed1c 00000000 00000000 00000000 00000000
00000001`3f8eed2c 00000000 00000000 00000000 00000000
0:048> dd 000000013f8eecc0
00000001`3f8eecc0 00000005 00000001 00000000 00000000
00000001`3f8eecd0 00000002 00000000 00000000 00000000
00000001`3f8eece0 7fffffff a9ad25cf 7fffffff a9ad25cf
00000001`3f8eecf0 00000000 00000000 00000000 00000000
00000001`3f8eed00 00000000 00000000 00000000 00000000
00000001`3f8eed10 00000000 00000000 00000000 00000000
00000001`3f8eed20 00000000 00000000 00000000 00000000
00000001`3f8eed30 00000000 00000000 00000000 00000000
sabitleri 60
ve 5
. Yani sıfıra göre nerede ??? Hata ayıklayıcım yalan mı? Elbette sıfıra bölme donanım tarafından atılmış, bu yüzden bu konuda bir hata yapamaz mı? Ve eğer kodumda farklı bir yerde sıfıra bölünmüş olsaydı, hata ayıklayıcının yönerge göstergesini tam olarak bu yerde gösterme ihtimali nedir? İtiraf ediyorum, güvendeyim ..
Minidump'ta beklenen değeri görmeniz, yönerge çalıştırıldığında beklenen değerin olduğunu kanıtlamaz. Örneğin, bir iplik geçirme yarışının oldukça klasik davranışı, bir minidump, istisnanın atıldığı anda kaydedilen anlık bir anlık görüntü değildir. Yumuşak RAM hataları, bu tür açıklanamayan aksiliklerin başka bir kaynağıdır. Dolayısıyla, iş parçacığının bir faktör olmadığından eminseniz, müşteriye verilecek en iyi tavsiye, RAM modüllerini değiştirmektir. –
Döngüyü, çağrılabilen bazı küresel kurucunun bir parçası olarak çağırırsanız, iki değişkenin gerekli değere (ve muhtemelen varsayılan olarak çalıştırılabilir yürütülebilir yükleyici tarafından varsayılan olarak "0" olarak başlatılana) bölünmesiyle sonuçlanabilir. derleyicinizin önyükleme koduna "ana()' den önce ihtiyaç duyulur. – inetknght
Yani bu düşünce çizgisi ile ilgili iki nokta. Çöpte ne varsa (miniden ziyade tam bir çöplük) doğru değilse, diğer yoldan ziyade idam edilene göre tarih dışı kalmalıdır. Yani, eğer bu iki değer bozulursa, bir şey onları daha sonra beklenen değerlere geri götürmek zorunda kalırdı ... – Benj