Ò»¡¢ÎªÊ²Ã´Õâ¸ö´íÎóÈÃÔËάץ¿ñ£¿
´«ÆæGEE·þÎñ¶ËµÄ ExternalException C000001D ±»Íæ¼ÒÃdzÆÎª“ÓÄÁé´íÎó”——Ëü¿ÉÄÜÔÚÁ賿3µãͻȻ³öÏÖ£¬Ò²¿ÉÄÜÔÚÍæ¼Ò¸ß·åÆÚºÁÎÞÕ÷Õ׵رÀÀ£·þÎñ¶Ë¡£¸üÍ·ÌÛµÄÊÇ£¬ËüµÄ´¥·¢Ìõ¼þ¸´ÔÓ£¬ÉõÖÁͬһÌ×ÅäÖÃÔÚ²»Í¬·þÎñÆ÷ÉϱíÏÖ¿ÉÄÜÍêÈ«²»Í¬¡£±¾ÎĽ«Í¨¹ýÕæÊµ°¸Àý²ð½â£¬´øÄãÓÓÍâ¿ÆÊÖÊõ¼¶”·½·¨¶¨Î»ÎÊÌâ¸ùÔ´¡£
¶þ¡¢×îм¼Êõ¶¯Ì¬£ºÎ¢Èí2025ÄêQ2²¹¶¡µÄÓ°Ïì
2025Äê6Ô£¬Î¢Èí·¢²¼µÄ.NET Framework 4.8.1²¹¶¡ÒýÈëÁËÄÚ´æ¹ÜÀí»úÖÆÉý¼¶£¬µ«²¿·ÖµÚÈý·½²å¼þ¿ª·¢Õßδ¼°Ê±ÊÊÅ䣬µ¼ÖÂÓëGEE·þÎñ¶ËµÄ¼æÈÝÐÔ³åÍ»¼¤Ôö¡£
• ÊÜÓ°Ïì²å¼þÌØÕ÷£º
• »ùÓÚ.NET 4.0¿ª·¢µÄ¾É°æ²å¼þ£¨ÈçÀϰ汾·À×÷±×Ä£¿é£©
• δ¾·â×°Ö±½Óµ÷ÓÃWin32 APIµÄC++À©Õ¹×é¼þ
• ¹Ù·½ÁÙʱ½â¾ö·½°¸£º
»Ø¹öÖÁ.NET 4.8.0²¢½ûÓòå¼þ×Ô¶¯¸üУº
# ÐÞ¸Ä×¢²á±íÇ¿ÖÆËø¶¨.NET°æ±¾
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" -Name Release -Value 528040
Èý¡¢ÕæÊµ°¸Àý£ºÄ³Íø°ÉÁ¬ÐøÈýÌì±ÀÀ£µÄ½Ìѵ
¹ÊÕÏÏÖÏó£º
• ·þÎñ¶ËÿÌìÔËÐÐ6Сʱºó±Ø±ÀÀ££¬ÈÕÖ¾ÏÔʾ 0x80004005£¨Í¨ÓÃȨÏÞ´íÎó£©Óë C000001D ½»Ìæ³öÏÖ¡£
• ¿Í»§¶ËƵ·±Ìáʾ“Êý¾Ý¿âÁ¬½Ó³¬Ê±”¡£
ÅŲé¹ý³Ì£º
1. ÈÕÖ¾½»²æ·ÖÎö£º
• ·þÎñ¶ËÈÕÖ¾£º·¢ÏÖ MySql.Data.dll ÔÚ QueryPlayerLogin ·½·¨ÖÐÅ׳öÒì³£¡£
• Windowsʼþ²é¿´Æ÷£º¶¨Î»µ½ EventID 1000£¨Ó¦ÓóÌÐò±ÀÀ££©£¬¹ØÁªÄ£¿éΪ vcruntime140.dll¡£
• ½áÂÛ£ºMySQLÁ¬½ÓÆ÷ÓëVC++ÔËÐÐʱ¿â°æ±¾³åÍ»¡£
2. ÄÚ´æÈ¡Ö¤£º
ʹÓÃWinDbg·ÖÎö GEE_crash.dmp Îļþ£¬·¢ÏÖ£º
*** Stack trace for last set context - .thread /r
teb ffff8801a1a1f000 VAD 0 ffff8801a1a1e000 ...
ntdll!ZwWaitForSingleObject+0x14 (00007ffd`a3b3d420)
KERNELBASE!WaitForSingleObjectEx+0x98 (00007ffd`9f8d88b4)
> MySql.Data.MySqlClient.MySqlConnection.Open() +0x1d5
¹Ø¼üÏßË÷£ºÊý¾Ý¿âÁ¬½Ó³ØÎ´ÕýÈ·ÊÍ·Å£¬µ¼Ö·ÇÍйÜÄÚ´æÐ¹Â©¡£
3. Ó²¼þÑéÖ¤£º
• MemTest86¼ì²â£º·¢ÏÖµÚ3¸ùÄÚ´æÌõ´æÔÚ4´¦ECC´íÎó£¨Ðè¸ü»»Ó²¼þ£©¡£
• ´ÅÅÌSMART״̬£ºÏµÍ³ÅÌÊ£ÓàÊÙÃü½ö12%£¬I/OÑÓ³ÙÍ»Ôöµ¼ÖÂÏß³Ì×èÈû¡£
×îÖÕÐÞ¸´·½°¸£º
• Éý¼¶ MySql.Data.dll ÖÁ8.0.33°æ±¾
• ½ûÓÃSQLÁ¬½Ó³Ø£¨ÐÞ¸Ä DatabaseConfig.ini£©£º
[Database]
ConnectionPooling=false
MaxPoolSize=100
• ¸ü»»¹ÊÕÏÄÚ´æÌõ²¢Ç¨ÒÆÖÁRAID 1ÕóÁÐ
ËÄ¡¢½ø½×ÅŲ鹤¾ß°ü
1. ProcDumpʵʱ²¶»ñ±ÀÀ£Ë²¼ä
procdump -ma -e 1 -f "" GameServer.exe
Éú³ÉÍêÕûÄÚ´æ×ª´¢Îļþ¹©ÄæÏò·ÖÎö¡£
2. WinHexÊÖ¶¯ÐÞ¸´Ë𻵵ÄDLL
Èô¹Ø¼üÎļþ²¿·ÖË𻵣¨Èç GameLogic.dll£©£¬¿ÉÓÃWinHex¶Ô±È¹Ù·½Îļþ£¬ÊÖ¶¯ÐÞ¸´Í·²¿Ð£ÑéÖµ¡£
3. Wireshark×¥°ü·ÖÎöÍøÂçÒì³£
¹ýÂË tcp.port == 3306 ¹Û²ìÊý¾Ý¿â½»»¥ÊÇ·ñ¶ª°ü£¬Õë¶ÔÐÔÓÅ»¯·À»ðǽ¹æÔò¡£
Îå¡¢ÔËάÈËÔ±±ØÐëÖªµÀµÄÐÐÒµÃØ¼®
• ²å¼þ¼æÈÝÐÔ¾ØÕ󣺽¨Á¢²å¼þÓëGEE°æ±¾µÄÊÊÅä±í£¨Ê¾Àý£©£º
²å¼þÃû³Æ ¼æÈÝGEE 8.5 Ðè.NET°æ±¾
·ÀÍâ¹ÒProPlus ❌ 4.7.2
¾¼ÃϵͳÀ©Õ¹°ü ✅ 4.8.0
• ·þÎñ¶Ë»·¾³“Èý¸ôÀë”ÔÔò£º
1. ÓÎÏ·Âß¼½ø³ÌÓëÊý¾Ý¿â½ø³Ì¸ôÀë
2. ²å¼þÔËÐÐÔÚɳÏä»·¾³ÖÐ
3. ÈÕÖ¾Îļþ´æ´¢¶ÀÁ¢·ÖÇø
• ×Ô¶¯»¯Ñ²¼ì½Å±¾£º
ÿÈÕÁ賿ִÐÐÄÚ´æ/CPU/´ÅÅ̽¡¿µ¼ì²é£º
$log = Get-WinEvent -LogName Application -MaxEvents 100 | Where-Object {$_.ProviderName -eq "Application Error"}
if ($log.Message -match "C000001D") {
Send-MailMessage -To "admin@xxx.com" -Subject "GEE·þÎñ¶ËÒì³£¾¯±¨"
}
Áù¡¢ÖÕ¼«Ô¤·À²ßÂÔ£º´Ó¸ùÔ´¶óɱ´íÎó
1. ÈÝÆ÷»¯²¿Êð
ʹÓÃDocker·â×°GEE·þÎñ¶Ë£¬ÊµÏÖ»·¾³Ò»ÖÂÐÔ£º
FROM mcr.microsoft.com/dotnet/runtime:4.8-windowsservercore-ltsc2019
COPY GEE_Service /app
WORKDIR /app
ENTRYPOINT ["GameServer.exe"]
2. Ó²¼þ¼¶·À»¤
• ²¿ÊðiDRAC/IPMIÔ¶³Ì¹ÜÀí¿¨£¬ÊµÊ±¼à¿Ø·þÎñÆ÷½¡¿µ×´Ì¬
• ÆôÓÃEDACÄÚ´æ¾À´í¹¦ÄÜ£¨ÐèÖ÷°åÖ§³Ö£©
3. ÉçÇøÐ×÷»úÖÆ
¼ÓÈëGEE¿ª·¢ÕßSlackƵµÀ£¬»ñÈ¡ÆäËûÔËάÍŶӵÄʵʱ¹ÊÕϱ¨¸æ£¨Èç½üÆÚ¶àÆð°¸ÀýÖ¸ÏòÄ³ÔÆ·þÎñÉ̵ÄÐéÄ⻯²ãBUG£©¡£
Æß¡¢¼¼Êõ²Êµ°£ºÄæÏò¹¤³Ì½ÒʾÒþ²ØÂ©¶´
ͨ¹ýIDA Pro·´±àÒë GameCore.dll£¬·¢ÏÖij¶Î»ã±à´úÂë´æÔÚ¾ºÕùÌõ¼þ©¶´£º
mov eax, [ebp+var_4] ; δ¼ì²éÖ¸ÕëÓÐЧÐÔ
cmp eax, 0
jne short loc_10001234
call eax ; ¿ÉÄÜ´¥·¢NullÖ¸Õë½âÒýÓÃ
ÁÙʱ»º½â·½°¸£ºÍ¨¹ýµ÷ÊÔÆ÷Ç¿ÖÆÐÞ¸ÄÄÚ´æ±£»¤ÊôÐÔ£¬Ìø¹ý·çÏÕ´úÂë¶Î£¨½öÏÞ½ô¼±Çé¿ö£©¡£
´«ÆæGEE·þÎñ¶ËµÄ ExternalException C000001D ±»Íæ¼ÒÃdzÆÎª“ÓÄÁé´íÎó”——Ëü¿ÉÄÜÔÚÁ賿3µãͻȻ³öÏÖ£¬Ò²¿ÉÄÜÔÚÍæ¼Ò¸ß·åÆÚºÁÎÞÕ÷Õ׵رÀÀ£·þÎñ¶Ë¡£¸üÍ·ÌÛµÄÊÇ£¬ËüµÄ´¥·¢Ìõ¼þ¸´ÔÓ£¬ÉõÖÁͬһÌ×ÅäÖÃÔÚ²»Í¬·þÎñÆ÷ÉϱíÏÖ¿ÉÄÜÍêÈ«²»Í¬¡£±¾ÎĽ«Í¨¹ýÕæÊµ°¸Àý²ð½â£¬´øÄãÓÓÍâ¿ÆÊÖÊõ¼¶”·½·¨¶¨Î»ÎÊÌâ¸ùÔ´¡£
¶þ¡¢×îм¼Êõ¶¯Ì¬£ºÎ¢Èí2025ÄêQ2²¹¶¡µÄÓ°Ïì
2025Äê6Ô£¬Î¢Èí·¢²¼µÄ.NET Framework 4.8.1²¹¶¡ÒýÈëÁËÄÚ´æ¹ÜÀí»úÖÆÉý¼¶£¬µ«²¿·ÖµÚÈý·½²å¼þ¿ª·¢Õßδ¼°Ê±ÊÊÅ䣬µ¼ÖÂÓëGEE·þÎñ¶ËµÄ¼æÈÝÐÔ³åÍ»¼¤Ôö¡£
• ÊÜÓ°Ïì²å¼þÌØÕ÷£º
• »ùÓÚ.NET 4.0¿ª·¢µÄ¾É°æ²å¼þ£¨ÈçÀϰ汾·À×÷±×Ä£¿é£©
• δ¾·â×°Ö±½Óµ÷ÓÃWin32 APIµÄC++À©Õ¹×é¼þ
• ¹Ù·½ÁÙʱ½â¾ö·½°¸£º
»Ø¹öÖÁ.NET 4.8.0²¢½ûÓòå¼þ×Ô¶¯¸üУº
# ÐÞ¸Ä×¢²á±íÇ¿ÖÆËø¶¨.NET°æ±¾
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" -Name Release -Value 528040
Èý¡¢ÕæÊµ°¸Àý£ºÄ³Íø°ÉÁ¬ÐøÈýÌì±ÀÀ£µÄ½Ìѵ
¹ÊÕÏÏÖÏó£º
• ·þÎñ¶ËÿÌìÔËÐÐ6Сʱºó±Ø±ÀÀ££¬ÈÕÖ¾ÏÔʾ 0x80004005£¨Í¨ÓÃȨÏÞ´íÎó£©Óë C000001D ½»Ìæ³öÏÖ¡£
• ¿Í»§¶ËƵ·±Ìáʾ“Êý¾Ý¿âÁ¬½Ó³¬Ê±”¡£
ÅŲé¹ý³Ì£º
1. ÈÕÖ¾½»²æ·ÖÎö£º
• ·þÎñ¶ËÈÕÖ¾£º·¢ÏÖ MySql.Data.dll ÔÚ QueryPlayerLogin ·½·¨ÖÐÅ׳öÒì³£¡£
• Windowsʼþ²é¿´Æ÷£º¶¨Î»µ½ EventID 1000£¨Ó¦ÓóÌÐò±ÀÀ££©£¬¹ØÁªÄ£¿éΪ vcruntime140.dll¡£
• ½áÂÛ£ºMySQLÁ¬½ÓÆ÷ÓëVC++ÔËÐÐʱ¿â°æ±¾³åÍ»¡£
2. ÄÚ´æÈ¡Ö¤£º
ʹÓÃWinDbg·ÖÎö GEE_crash.dmp Îļþ£¬·¢ÏÖ£º
*** Stack trace for last set context - .thread /r
teb ffff8801a1a1f000 VAD 0 ffff8801a1a1e000 ...
ntdll!ZwWaitForSingleObject+0x14 (00007ffd`a3b3d420)
KERNELBASE!WaitForSingleObjectEx+0x98 (00007ffd`9f8d88b4)
> MySql.Data.MySqlClient.MySqlConnection.Open() +0x1d5
¹Ø¼üÏßË÷£ºÊý¾Ý¿âÁ¬½Ó³ØÎ´ÕýÈ·ÊÍ·Å£¬µ¼Ö·ÇÍйÜÄÚ´æÐ¹Â©¡£
3. Ó²¼þÑéÖ¤£º
• MemTest86¼ì²â£º·¢ÏÖµÚ3¸ùÄÚ´æÌõ´æÔÚ4´¦ECC´íÎó£¨Ðè¸ü»»Ó²¼þ£©¡£
• ´ÅÅÌSMART״̬£ºÏµÍ³ÅÌÊ£ÓàÊÙÃü½ö12%£¬I/OÑÓ³ÙÍ»Ôöµ¼ÖÂÏß³Ì×èÈû¡£
×îÖÕÐÞ¸´·½°¸£º
• Éý¼¶ MySql.Data.dll ÖÁ8.0.33°æ±¾
• ½ûÓÃSQLÁ¬½Ó³Ø£¨ÐÞ¸Ä DatabaseConfig.ini£©£º
[Database]
ConnectionPooling=false
MaxPoolSize=100
• ¸ü»»¹ÊÕÏÄÚ´æÌõ²¢Ç¨ÒÆÖÁRAID 1ÕóÁÐ
ËÄ¡¢½ø½×ÅŲ鹤¾ß°ü
1. ProcDumpʵʱ²¶»ñ±ÀÀ£Ë²¼ä
procdump -ma -e 1 -f "" GameServer.exe
Éú³ÉÍêÕûÄÚ´æ×ª´¢Îļþ¹©ÄæÏò·ÖÎö¡£
2. WinHexÊÖ¶¯ÐÞ¸´Ë𻵵ÄDLL
Èô¹Ø¼üÎļþ²¿·ÖË𻵣¨Èç GameLogic.dll£©£¬¿ÉÓÃWinHex¶Ô±È¹Ù·½Îļþ£¬ÊÖ¶¯ÐÞ¸´Í·²¿Ð£ÑéÖµ¡£
3. Wireshark×¥°ü·ÖÎöÍøÂçÒì³£
¹ýÂË tcp.port == 3306 ¹Û²ìÊý¾Ý¿â½»»¥ÊÇ·ñ¶ª°ü£¬Õë¶ÔÐÔÓÅ»¯·À»ðǽ¹æÔò¡£
Îå¡¢ÔËάÈËÔ±±ØÐëÖªµÀµÄÐÐÒµÃØ¼®
• ²å¼þ¼æÈÝÐÔ¾ØÕ󣺽¨Á¢²å¼þÓëGEE°æ±¾µÄÊÊÅä±í£¨Ê¾Àý£©£º
²å¼þÃû³Æ ¼æÈÝGEE 8.5 Ðè.NET°æ±¾
·ÀÍâ¹ÒProPlus ❌ 4.7.2
¾¼ÃϵͳÀ©Õ¹°ü ✅ 4.8.0
• ·þÎñ¶Ë»·¾³“Èý¸ôÀë”ÔÔò£º
1. ÓÎÏ·Âß¼½ø³ÌÓëÊý¾Ý¿â½ø³Ì¸ôÀë
2. ²å¼þÔËÐÐÔÚɳÏä»·¾³ÖÐ
3. ÈÕÖ¾Îļþ´æ´¢¶ÀÁ¢·ÖÇø
• ×Ô¶¯»¯Ñ²¼ì½Å±¾£º
ÿÈÕÁ賿ִÐÐÄÚ´æ/CPU/´ÅÅ̽¡¿µ¼ì²é£º
$log = Get-WinEvent -LogName Application -MaxEvents 100 | Where-Object {$_.ProviderName -eq "Application Error"}
if ($log.Message -match "C000001D") {
Send-MailMessage -To "admin@xxx.com" -Subject "GEE·þÎñ¶ËÒì³£¾¯±¨"
}
Áù¡¢ÖÕ¼«Ô¤·À²ßÂÔ£º´Ó¸ùÔ´¶óɱ´íÎó
1. ÈÝÆ÷»¯²¿Êð
ʹÓÃDocker·â×°GEE·þÎñ¶Ë£¬ÊµÏÖ»·¾³Ò»ÖÂÐÔ£º
FROM mcr.microsoft.com/dotnet/runtime:4.8-windowsservercore-ltsc2019
COPY GEE_Service /app
WORKDIR /app
ENTRYPOINT ["GameServer.exe"]
2. Ó²¼þ¼¶·À»¤
• ²¿ÊðiDRAC/IPMIÔ¶³Ì¹ÜÀí¿¨£¬ÊµÊ±¼à¿Ø·þÎñÆ÷½¡¿µ×´Ì¬
• ÆôÓÃEDACÄÚ´æ¾À´í¹¦ÄÜ£¨ÐèÖ÷°åÖ§³Ö£©
3. ÉçÇøÐ×÷»úÖÆ
¼ÓÈëGEE¿ª·¢ÕßSlackƵµÀ£¬»ñÈ¡ÆäËûÔËάÍŶӵÄʵʱ¹ÊÕϱ¨¸æ£¨Èç½üÆÚ¶àÆð°¸ÀýÖ¸ÏòÄ³ÔÆ·þÎñÉ̵ÄÐéÄ⻯²ãBUG£©¡£
Æß¡¢¼¼Êõ²Êµ°£ºÄæÏò¹¤³Ì½ÒʾÒþ²ØÂ©¶´
ͨ¹ýIDA Pro·´±àÒë GameCore.dll£¬·¢ÏÖij¶Î»ã±à´úÂë´æÔÚ¾ºÕùÌõ¼þ©¶´£º
mov eax, [ebp+var_4] ; δ¼ì²éÖ¸ÕëÓÐЧÐÔ
cmp eax, 0
jne short loc_10001234
call eax ; ¿ÉÄÜ´¥·¢NullÖ¸Õë½âÒýÓÃ
ÁÙʱ»º½â·½°¸£ºÍ¨¹ýµ÷ÊÔÆ÷Ç¿ÖÆÐÞ¸ÄÄÚ´æ±£»¤ÊôÐÔ£¬Ìø¹ý·çÏÕ´úÂë¶Î£¨½öÏÞ½ô¼±Çé¿ö£©¡£

