使用Windbg解析dump文件
第一章 常用的Windbg指令
①!analyze -v ②kP 可以看函数的入参 ③!for_each_frame dv /t 可以看函数中的局部变量 ④dc , db 产看某一内存中的值 可以直接接变量名 不过可能需要回溯栈 ⑤!threads 显示所有线程 ⑥~0s , ~1s 进入某个线程 |
第二章 Symbol的设置方法
2.1 将远程的系统函数的PDB文件拷贝到本地「D:\mysymbol」目录下 SRV*D:\mysymbol*http://msdl.microsoft.com/download/symbols 2.2 加载设置的符号文件 |
第三章 实例
实例1 如何调查堆被破坏问题。 错误代码:0xc0000374 第一步、先用「!analyze -v」分析出错误的地方以及由于什么原因导致程序Dump掉的。 0:009> !analyze -v FAULTING_IP: EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) PROCESS_NAME: ProcessA.exe ERROR_CODE: (NTSTATUS) 0xc0000374 - <Unable to get error code text> EXCEPTION_CODE: (NTSTATUS) 0xc0000374 - <Unable to get error code text> EXCEPTION_PARAMETER1: 000000007782b4b0 MOD_LIST: <ANALYSIS/> NTGLOBALFLAG: 0 APPLICATION_VERIFIER_FLAGS: 0 FAULTING_THREAD: 0000000000002f8c DEFAULT_BUCKET_ID: ACTIONABLE_HEAP_CORRUPTION_heap_failure_buffer_overrun PRIMARY_PROBLEM_CLASS: ACTIONABLE_HEAP_CORRUPTION_heap_failure_buffer_overrun BUGCHECK_STR: APPLICATION_FAULT_ACTIONABLE_HEAP_CORRUPTION_heap_failure_buffer_overrun LAST_CONTROL_TRANSFER: from 00000000777b4746 to 00000000777b4102 STACK_TEXT: STACK_COMMAND: !heap ; ~9s; .ecxr ; kb FOLLOWUP_IP: SYMBOL_STACK_INDEX: 9 SYMBOL_NAME: msvcr80!realloc+6f FOLLOWUP_NAME: MachineOwner MODULE_NAME: msvcr80 IMAGE_NAME: msvcr80.dll DEBUG_FLR_IMAGE_TIMESTAMP: 4ec3407e FAILURE_BUCKET_ID: ACTIONABLE_HEAP_CORRUPTION_heap_failure_buffer_overrun_c0000374_msvcr80.dll!realloc BUCKET_ID: X64_APPLICATION_FAULT_ACTIONABLE_HEAP_CORRUPTION_heap_failure_buffer_overrun_msvcr80!realloc+6f WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/ProcessA_exe/1_0_0_1/5134aefd/ntdll_dll/6_1_7601_18229/51fb164a/c0000374/000c4102.htm?Retriage=1 Followup: MachineOwner 第二步、使用「!heap」找出出错的堆。分析出错的原因。 0000000000c59c80 大家应该有这样的常识,在使用malloc()或者realloc()分配出来的空间的前面都有 从这里很自然的猜想到,在写往0000000000c59c80里面写数据的时候写过了, 0:009> !heap Error address: 0000000000c59e50 第三步、使用「!for_each_frame dv /t」打印出错函数的局部变量,找出元凶。 char * pData_n = 0x00000000`00c59c90 "SE:Security: ???" ※注意如果变量值指针的指针需要先用dc看一下该指针指向的地址。 之后看代码知道,程序在读取pData_n的数据的时候如果遇到是0a(Windos换行符)就自动在后面加上 0:009> !for_each_frame dv /t |
实例2 无效参数(STATUS_INVALID_PARAMETER)。 错误代码:0xc000000d 第一步、先用「!analyze -v」分析出错误的地方以及由于什么原因导致程序Dump掉的。 0:000> !analyze -v *** ERROR: Symbol file could not be found. Defaulted to export symbols for user32.dll - FAULTING_IP: EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) PROCESS_NAME: ProcessB.exe ERROR_CODE: (NTSTATUS) 0xc000000d - <Unable to get error code text> EXCEPTION_CODE: (NTSTATUS) 0xc000000d - <Unable to get error code text> MOD_LIST: <ANALYSIS/> NTGLOBALFLAG: 0 APPLICATION_VERIFIER_FLAGS: 0 LAST_CONTROL_TRANSFER: from 0000000000124250 to 0000000074e5b0ec FAULTING_THREAD: ffffffffffffffff DEFAULT_BUCKET_ID: STATUS_INVALID_PARAMETER PRIMARY_PROBLEM_CLASS: STATUS_INVALID_PARAMETER BUGCHECK_STR: APPLICATION_FAULT_STATUS_INVALID_PARAMETER IP_ON_STACK: FRAME_ONE_INVALID: 1 STACK_TEXT: STACK_COMMAND: ~0s; .ecxr ; kb FOLLOWUP_IP: FAULTING_SOURCE_CODE: SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: msvcr80!strncpy_s+10a FOLLOWUP_NAME: MachineOwner MODULE_NAME: msvcr80 IMAGE_NAME: msvcr80.dll DEBUG_FLR_IMAGE_TIMESTAMP: 4dcdd833 FAILURE_BUCKET_ID: STATUS_INVALID_PARAMETER_c000000d_msvcr80.dll!strncpy_s BUCKET_ID: X64_APPLICATION_FAULT_STATUS_INVALID_PARAMETER_msvcr80!strncpy_s+10a WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/ProcessB_exe/1_0_0_1/4e362265/msvcr80_dll/8_0_50727_6195/4dcdd833/c000000d/0001d5fa.htm?Retriage=1 Followup: MachineOwner 这的确很伤脑筋,就针对这个我可是花了3个星期一行行的解析栈里面的内容 才解决的。 第二步、先用「!teb」看一下这个程序的栈是从哪里到哪里的。 0:000>!teb 第三步、先用「dps」看一下这个程序的栈中的内存的内容。 下面截取其中比较重要的一段。 ------------------------------------------------------------------------------------------------------------------------------- 00000000`001247f8 00000000`005782c0 ProcessB2!trcData 00000000`00124800 00000000`00000000 00000000`00124818 00000000`00455b65 ProcessB2!List::testB+0x55 [e:\ProcessB\Listset.cpp @ 719] 首先strncpy 这个函数在使用的时候只要有个宏定义(默认是有的)在编译的时候就会使用strncpy_s这个安全函数。 其次说明一下为什么会dmp掉。strncpy在使用的时候如果转化成strncpy_s的时候是这样一种形式。 而这样就会到时报STATUS_INVALID_PARAMETER这个错误这是strncpy_s的特性。具体使用方法可以参考下面的文档。 节选: |
详细的ACTIONABLE_HEAP_CORRUPTION_heap_failure_buffer_overrun方法还可以参考以下的例子:
http://blogs.msdn.com/b/jiangyue/archive/2010/03/16/windows-heap-overrun-monitoring.aspx