使用 WinDbg 查找异常

Finding execption using WinDbg

我在 windows 2008 服务器机器上使用 visual studio 2010 构建我的 32 位应用程序文件。这个 32 位应用程序将使用 IBM wepshere MQ 客户端(7.5.0.3)。

虽然 运行 在调试模式下出现异常,因此我使用 WinDbg 软件进行了调试

转储信息是

*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files (x86)\IBM\WebSphere MQ\bin\mqe.dll - 


FAULTING_IP: 
ntdll32!RtlpCreateSplitBlock+47b
77d23fcb 8b11            mov     edx,dword ptr [ecx]

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 0000000077d23fcb (ntdll32!RtlpCreateSplitBlock+0x000000000000047b)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: 000000003b9ac9ff
Attempt to read from address 000000003b9ac9ff

CONTEXT:  0000000000000000 -- (.cxr 0x0;r)
eax=0adaff08 ebx=02960000 ecx=3b9ac9ff edx=00100000 esi=0ae2bf90 edi=02960174
eip=77d23fcb esp=079bd490 ebp=079bd4b4 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
ntdll32!RtlpCreateSplitBlock+0x47b:
77d23fcb 8b11            mov     edx,dword ptr [ecx]  ds:002b:3b9ac9ff=????????

FAULTING_THREAD:  000000000000046c

PROCESS_NAME:  MessageBroker.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.

EXCEPTION_PARAMETER1:  0000000000000000

EXCEPTION_PARAMETER2:  000000003b9ac9ff

READ_ADDRESS:  000000003b9ac9ff 

FOLLOWUP_IP: 
ntdll32!RtlpCreateSplitBlock+47b
77d23fcb 8b11            mov     edx,dword ptr [ecx]

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

APP:  messagebroker.exe

ANALYSIS_VERSION: 6.3.9600.17298 (debuggers(dbg).141024-1500) amd64fre

**BUGCHECK_STR:  APPLICATION_FAULT_INVALID_POINTER_READ_ZEROED_STACK**

PRIMARY_PROBLEM_CLASS:  INVALID_POINTER_READ

DEFAULT_BUCKET_ID:  INVALID_POINTER_READ

LAST_CONTROL_TRANSFER:  from 0000000077d23c5a to 0000000077d23fcb

**STACK_TEXT:**  
079bd4b4 77d23c5a 0ae2bf90 0adaff08 02960150 ntdll32!RtlpCreateSplitBlock+0x47b
079bd5a0 77d23cfe 00000840 00000848 0ae2b74a ntdll32!RtlpAllocateHeap+0xb5d
079bd624 74e04d83 02960000 00000000 00000840 ntdll32!RtlAllocateHeap+0x23a
079bd644 008a8894 00000840 00000002 079bd800 MSVCR80!malloc+0x7a
**WARNING: Stack unwind information not available. Following frames may be wrong.
00000000 00000000 00000000 00000000 00000000 mqe+0x68894**


STACK_COMMAND:  .cxr 0x0 ; kb

SYMBOL_STACK_INDEX:  0

SYMBOL_NAME:  ntdll32!RtlpCreateSplitBlock+47b

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: ntdll32

IMAGE_NAME:  ntdll32.dll

DEBUG_FLR_IMAGE_TIMESTAMP:  51fb1072

FAILURE_BUCKET_ID:  INVALID_POINTER_READ_c0000005_ntdll32.dll!RtlpCreateSplitBlock

**BUCKET_ID:  X64_APPLICATION_FAULT_INVALID_POINTER_READ_ZEROED_STACK_ntdll32!RtlpCreateSplitBlock+47b**

ANALYSIS_SOURCE:  UM

FAILURE_ID_HASH_STRING:  um:invalid_pointer_read_c0000005_ntdll32.dll!rtlpcreatesplitblock

FAILURE_ID_HASH:  {c09c2d45-666c-6fbd-b6fd-d9b79ba8c4fa}

以上转储显示 Mqe.dll(IBM WebSphere MQ dll) 正在传递无效指针

根据上面的转储,我找不到问题所在。堆栈调用非常小,所以我无法找到我的应用程序调用 MQ 应用程序的位置 (Mqe.ddl)。

请建议我如何找到问题以及如何调试 Mqe.dll。

MQE.dll很可能是一个无辜的旁观者。它肯定是通过 malloc 分配内存,然后崩溃发生在内存管理器内部。这通常是过去某个时间发生的内存损坏的结果。缓冲区溢出、下溢或释放后使用是堆损坏的典型原因。

有助于追踪问题的选项:

  1. 在 WinDbg 中使用 !heap -v 对小型转储执行堆分析。
  2. 分析内存管理器试图工作的位置周围的内存,您可能会识别出一些已知数据(例如字符串),这些数据可能会提示您是谁破坏了内存。
    • 我会在程序集中向后走,找出读取地址 (0x3b9ac9ff) 的来源。
    • 当前的寄存器也可能包含堆内部的指针,其中有问题,您也可以将它们用作调查的起点。
  3. 使用 PageHeap 重新运行应用程序以尝试在发生溢出时立即捕获它。
  4. 代码检查您对任何堆内存的分配和使用。