2015-07-28 261 views
0

我們有一箇舊的代碼庫,我們在Windows XP SP3下使用C++ Qt框架(v4.6.3)開發。使用該代碼庫構建的應用程序在Windows XP下無問題。32位Qt應用程序隨機在Windows 7 x64上崩潰

根據客戶要求,我們將應用程序部署到Windows 7 x64機器上。之後,當我們嘗試啓動應用程序時,我們在發佈版本中遇到了隨機崩潰問題。應用程序在崩潰時會消耗近2GB的內存。如果我們將應用程序兼容性更改爲Windows XP SP3,崩潰問題就會消失。在調試模式下也不會發生崩潰。

我們收集了一些關於崩潰問題的日誌。以下日誌給出:
1.應用程序崩潰後的Windows日誌。

Problem signature: 
    Problem Event Name: APPCRASH 
    Application Name: kmclient3.exe 
    Application Version: 0.0.0.0 
    Application Timestamp: 55b72d4f 
    Fault Module Name: KERNELBASE.dll 
    Fault Module Version: 6.1.7601.18409 
    Fault Module Timestamp: 53159a86 
    Exception Code: e06d7363 
    Exception Offset: 0000c42d 
    OS Version: 6.1.7601.2.1.0.256.48 
    Locale ID: 1055 
    Additional Information 1: 9c29 
    Additional Information 2: 9c2952f45ffd526b51f7caf2e8b92e02 
    Additional Information 3: e72c 
    Additional Information 4: e72c8eab1d594c6991d297d4615a53d6 

2.WinDbg日誌,當我們附加調試器後,應用程序崩潰。

** wait with pending attach 

Symbol search path is: E:\Symbols 
Executable search path is: 
ModLoad: 01220000 014f7000  E:\YERLISINYAL09\YAZILIM\build\TKM_crash_test\kmclient3.exe 
ModLoad: 76dd0000 76f79000 C:\Windows\SYSTEM32\ntdll.dll 
ModLoad: 76fb0000 77130000 ntdll.dll 
ModLoad: 00000000`748f0000 00000000`7492f000 C:\Windows\SYSTEM32\wow64.dll 
ModLoad: 00000000`74890000 00000000`748ec000 C:\Windows\SYSTEM32\wow64win.dll 
ModLoad: 00000000`74880000 00000000`74888000 C:\Windows\SYSTEM32\wow64cpu.dll 
ModLoad: 00000000`769f0000 00000000`76b00000 KERNEL32.dll 
ModLoad: 00000000`74c30000 00000000`74c77000 KERNELBASE.dll 
ModLoad: 00000000`596e0000 00000000`5971e000 UMEngx86.dll 
ModLoad: 00000000`67000000 00000000`67211000 QtCore4.dll 
ModLoad: 00000000`74ad0000 00000000`74bd0000 USER32.dll 
ModLoad: 00000000`75310000 00000000`753a0000 GDI32.dll 
ModLoad: 00000000`75100000 00000000`7510a000 LPK.dll 
ModLoad: 00000000`75a60000 00000000`75afd000 USP10.dll 
ModLoad: 00000000`76920000 00000000`769cc000 msvcrt.dll 
ModLoad: 00000000`74c90000 00000000`74d30000 ADVAPI32.dll 
ModLoad: 00000000`76760000 00000000`76779000 SECHOST.dll 
ModLoad: 00000000`75220000 00000000`75310000 RPCRT4.dll 
ModLoad: 00000000`74950000 00000000`749b0000 SspiCli.dll 
ModLoad: 00000000`74940000 00000000`7494c000 CRYPTBASE.dll 
ModLoad: 00000000`754c0000 00000000`7561c000 ole32.dll 
ModLoad: 00000000`757b0000 00000000`757e5000 WS2_32.dll 
ModLoad: 00000000`74c80000 00000000`74c86000 NSI.dll 
ModLoad: 00000000`5a5a0000 00000000`5a62e000 MSVCP90.dll 
ModLoad: 00000000`737f0000 00000000`73893000 MSVCR90.dll 
ModLoad: 00000000`65000000 00000000`657a7000 QtGui4.dll 
ModLoad: 00000000`749b0000 00000000`74a2b000 COMDLG32.dll 
ModLoad: 00000000`757f0000 00000000`75847000 SHLWAPI.dll 
ModLoad: 00000000`5ce00000 00000000`5ce84000 COMCTL32.dll 
ModLoad: 00000000`75b00000 00000000`7674a000 SHELL32.dll 
ModLoad: 00000000`76b10000 00000000`76b9f000 OLEAUT32.dll 
ModLoad: 00000000`74bd0000 00000000`74c30000 IMM32.dll 
ModLoad: 00000000`75120000 00000000`751ec000 MSCTF.dll 
ModLoad: 00000000`5a560000 00000000`5a592000 WINMM.dll 
ModLoad: 00000000`74810000 00000000`74861000 WINSPOOL.DRV 
ModLoad: 00000000`61000000 00000000`61055000 QtXml4.dll 
ModLoad: 00000000`66000000 00000000`66045000 QtSvg4.dll 
ModLoad: 00000000`64000000 00000000`640ea000 QtNetwork4.dll 
ModLoad: 00000000`62000000 00000000`62031000 QtSql4.dll 
ModLoad: 00000000`70c40000 00000000`70cc0000 UxTheme.dll 
ModLoad: 00000000`70c20000 00000000`70c33000 dwmapi.dll 
ModLoad: 00000000`753a0000 00000000`75423000 CLBCatQ.DLL 
ModLoad: 00000000`59540000 00000000`5969d000 inkobj.dll 
ModLoad: 00000000`72110000 00000000`72124000 ATL.DLL 
ModLoad: 00000000`00e90000 00000000`01020000 gdiplus.dll 
ModLoad: 00000000`732c0000 00000000`732d6000 CRYPTSP.dll 
ModLoad: 00000000`73270000 00000000`732ab000 RSAENH.dll 
ModLoad: 00000000`72f30000 00000000`72f3e000 RpcRtRemote.dll 
ModLoad: 00000000`59530000 00000000`5953d000 TpcPS.DLL 
ModLoad: 00000000`10000000 00000000`10011000 qsqlmysql4.dll 
ModLoad: 00000000`550e0000 00000000`55677000 libmysql.dll 
ModLoad: 00000000`735f0000 00000000`735f8000 Secur32.dll 
ModLoad: 00000000`72f90000 00000000`72fa0000 nlaapi.dll 
ModLoad: 00000000`72f60000 00000000`72f70000 NAPINSP.dll 
ModLoad: 00000000`72f40000 00000000`72f52000 PNRPNSP.dll 
ModLoad: 00000000`734c0000 00000000`734fc000 MSWSOCK.dll 
ModLoad: 00000000`72ee0000 00000000`72f24000 DNSAPI.dll 
ModLoad: 00000000`72ed0000 00000000`72ed8000 WINRNR.dll 
ModLoad: 00000000`6de50000 00000000`6de56000 rasadhlp.dll 
ModLoad: 00000000`734b0000 00000000`734b5000 WSHTCPIP.dll 
Break-in sent, waiting 30 seconds... 
WARNING: Break-in timed out, suspending. 
     This is usually caused by another thread holding the loader lock 
(1a2c.106c): Wake debugger - code 80000007 (first chance) 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for KERNELBASE.dll - 
KERNELBASE!RaiseException+0x58: 
74c3c42d c9    leave 
0:000:x86> g 
** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\ntdll.dll - 
ntdll!NtWaitForWorkViaWorkerFactory+0xa: 
00000000`76e22bba c3    ret 
0:004> g 
    ^No runnable debuggees error in 'g' 

3.WinDbg日誌當我們打開崩潰轉儲。

Loading Dump File [C:\Users\onur.ozcelik.BILISIM\Desktop\kmclient3.DMP] 
User Mini Dump File with Full Memory: Only application data is available 

Symbol search path is: E:\Symbols 
Executable search path is: 
Windows 7 Version 7601 (Service Pack 1) MP (12 procs) Free x86 compatible 
Product: WinNt, suite: SingleUserTS 
Machine Name: 
Debug session time: Tue Jul 28 10:46:30.000 2015 (GMT+3) 
System Uptime: 0 days 2:42:56.184 
Process Uptime: 0 days 0:02:46.000 
........................................................ 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - 
eax=00000002 ebx=0000000b ecx=00000000 edx=00000000 esi=00000002 edi=00407c58 
eip=76fd1f46 esp=036ffac4 ebp=036ffc24 iopl=0   nv up ei pl zr na pe nc 
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b    efl=00000246 
ntdll!NtWaitForWorkViaWorkerFactory+0x12: 
76fd1f46 83c404   add  esp,4 
0:000> g 
    ^No runnable debuggees error in 'g' 

什麼導致崩潰問題? 任何想法或建議嗎?

+0

日誌似乎沒有很多信息。你能想象爲什麼你的程序可能會消耗2GB的內存,我認爲這是不正常的?可能你可以在這些情況下添加更多日誌記錄? – demonplus

+0

在發佈版本上查找問題的可重複步驟。然後爲發佈版本生成pdb文件,並將調試器附加到運行發佈過程並執行上述步驟。 (如果使用Visual Studio,則不提)另外,如果應用程序在調試版本中工作,但在發佈版本中失敗,則其中一種編譯器優化可能會暴露源代碼中的缺陷。 – ManuelH

+0

這可能是這個舊版Qt中的一個bug,這是不可想象的。也許你可以試試最新的版本 - Qt 4.8.7。即使您沒有獲得許可,您也可以嘗試,如果它解決了問題,則可以開始將更改等分爲零,以解決修正問題。最後,你真的需要在帶有符號的調試器中運行它,並且必須檢查調用堆棧以查看它在崩潰時的功能。 –

回答

1

這只是意味着您的程序中存在一個錯誤。沒有看到代碼很難說清楚。我建議使用coutprintfqDebug()來檢測代碼運行良好的最後一行。這會給你發生錯誤的地方。這就是我解決多線程程序中的錯誤的方法。我也建議你閱讀this

+0

我接受錯誤的可能性。但是爲什麼這個bug在Windows XP兼容模式下消失了。 – onurozcelik

+0

與在調試模式下運行良好並在發佈模式下崩潰的原因相同。內存分配在兩種模式下都非常不同,在調試模式下,內存也會初始化爲0。在Windows XP中,最有可能的內存分配就像Windows 7中的調試版本(沒有人知道,它是封閉的源代碼)。整個內存分配在兩個窗口中都非常不同。 –

+0

最好的爲什麼使用'cout'或'qDebug()'來檢測它。請閱讀鏈接中的文章。 –

相關問題