TN3270 失敗並且出現存取違規 ntdll !RtlFreeHeap


狀況


Microsoft SNA 伺服器 3.0 TN3270 伺服器可能會意外地失敗,存取違規的訊息。如果 DRWTSN32。EXE 已被設定為預設的 Windows NT 偵錯工具、 項目將會記錄在 < ntroot > \DRWTSN32。請記錄檔,如下所示:



Application exception occurred:
App: exe\tn3servr.DBG <process ID>
When: <date / time >
Exception number: c0000005 (access violation)
以下是 ntdll 的各種常式與可能的堆疊追蹤的範例指示何時會發生這個問題 (請注意所有的失敗事件代表呼叫的常式 !RtlFreeHeap):


function: RtlpCoalesceFreeBlocks
FAULT ->77f7cf1b 8908 mov [eax],ecx

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0c09ff14 77f64c12 01450000 0099a2e8 0c09ff40 00000000 ntdll!RtlpCoalesceFreeBlocks
0c09ff44 10201ba4 01450000 00000000 0099a2f0 762b1da9 ntdll!RtlFreeHeap
* 或 *

function: RtlDestroyHeap
FAULT ->77f7d0d8 8908 mov [eax],ecx

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0bfaff14 77f64c12 01450000 00a71638 0bfaff40 00000000 ntdll!RtlDestroyHeap
0bfaff44 10201ba4 01450000 00000000 00a71640 762b1da9 ntdll!RtlFreeHeap
* 或 *

function: RtlpInsertUnCommittedPages
FAULT ->77f642fb 8b4d00 mov ecx,[ebp]

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
00e5fcac 77f64ea7 00000000 00ec4000 00066000 00c50000 ntdll!RtlpInsertUnCommittedPages
00e5fcec 77f64c3a 00c50000 00ec3370 0000cf00 001425f8 ntdll!RtlpDeCommitFreeBlock
00e5fd18 0041ad47 00c50000 00000000 00ec3378 0041b22a ntdll!RtlFreeHeap
NTSD 偵錯工具附加,堆疊追蹤可能表示時發生以下錯誤:


NTSD: access violation
eax=00000000 ebx=00000000 ecx=0ce83040 edx=01450548 esi=0099fea0 edi=01450000
eip=77f64cfe esp=0c09ff2c ebp=0c09ff44 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00010246 ntdll!RtlFreeHeap+0x168:
77f64cfe 8908 mov [eax],ecx ds:0023:00000000=????????

0:013> kb
ChildEBP RetAddr Args to Child
0c09ff44 10201ba4 01450000 00000000 0099fec0 ntdll!RtlFreeHeap+0x168
0c09ffec 00000000 0101b2c0 00000000 00000000 Image@10200000!free+0x17

原因


這個問題被造成不相符的版本的 MSVCRT40。TN3270 伺服器執行 Windows NT 的電腦上安裝的 DLL。MSVCRT40。DLL 支援 'C' 執行階段程式庫函式可能會用在程式碼中且發行者是使用 Microsoft Visual C++ 開發的協力廠商 Windows NT 應用程式。如果協力廠商應用程式剛好安裝 MSVCRT40。DLL 和取代 Windows NT 4.0 (或 SNA 伺服器 3.0) 來安裝的版本,這可能會導致上述 TN3270 存取違規。


下列 Microsoft VC + + DLL 的運送 Windows NT 4.0 (以及 SNA 伺服器 3.0)。「 基本 」 和 「 檔案版本 」 可以使用 「 相依 」 程式,來檢視,或以滑鼠右鍵按一下每個 DLL 中使用 Windows NT 4.0 上 「 我的電腦 」 程式:


Module Date Time Size Base File Version

MSVCRT.DLL 10/14/96 02:38a 267,536 0x779F0000 4.20.0.6201
MSVCRT40.DLL 10/14/96 02:38a 65,024 0x779D0000 4.2000.0.6172
MFC40.DLL 10/14/96 02:38a 924,432 0x762B0000 4.1.0.6139
MSVCIRT.DLL 10/14/96 02:38a 74,752 0x780A0000 4.20.0.6201
TN3270 伺服器的存取違規觀察到的時機下列的 MSVCRT40。DLL 是在系統上安裝協力廠商應用程式 (與其他 DLL 進行比對以上所列的版本):


Module Date Time Size Base File Version

MSVCRT40.DLL 9/16/96 07:50a 312,832 0x10200000 4.0.0.5270

解決方案


如果較舊版本的 MSVCRT40。DLL 位於系統路徑,應該重新命名此版本,應該重新套用 Windows NT 4.0 所隨附的標準版本。以下是用來解決這個問題的程序:
  1. 執行 [路徑] 指令,來檢查目前的系統路徑。
  2. 系統路徑 (請注意系統路徑可以跨越多個磁碟機) 中,找出上述 DLL 的存在的所有執行個體。
  3. 執行 [相依依靠這些 DLL,並檢查其版本,根據清單記載上方 (它會列出 Windows NT 4.0 所附的版本)
  4. 重新命名任何 「 舊 」 的版本可能會存在於電腦上,並套用在其位置的 Windows NT 4.0 版本。 如果同一個 DLL 的多份位於系統路徑,請重新命名所有重複的複本,並保留 < ntroot > \system32 目錄中的單一執行個體。

狀態


Microsoft 已確認這是本文開頭所列的 Microsoft 產品的問題。