游戏崩溃后对dmp文件的分析
相关工具:WinDbgollydbg
要求:
有一定的逆向基础
游戏崩溃时会在客户端目录生成dmp文件(内存镜像文件)
1.
使用WinDbg 打开dmp文件
首次打开可能要稍微等待一下,因为他要下载一些符号文件
2.
在命令处输入.excr 快速定位崩溃位置
崩溃的模块,和一些寄存器信息
可以看到是lua这里崩溃了,大致应该是在访问了一个不存在的指针,导致崩溃。
3.
输入!analyze -v 让windbg 给我们分析下崩溃原因
返回结果
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
*** WARNING: Unable to verify checksum for game.exe
*** WARNING: Unable to verify checksum for libcocos2d.dll
*** WARNING: Unable to verify checksum for OpenAL32.dll
KEY_VALUES_STRING: 1
Key: AV.Fault
Value: Read
Key: Analysis.CPU.Sec
Value: 0
Key: Analysis.DebugAnalysisProvider.CPP
Value: Create: 8007007e on DESKTOP-15R5MQL
Key: Analysis.DebugData
Value: CreateObject
Key: Analysis.DebugModel
Value: CreateObject
Key: Analysis.Elapsed.Sec
Value: 63
Key: Analysis.Memory.CommitPeak.Mb
Value: 169
Key: Analysis.System
Value: CreateObject
Key: Timeline.Process.Start.DeltaSec
Value: 1003
APPLICATION_VERIFIER_FLAGS:0
CONTEXT:(.ecxr)
eax=f8b9d2ec ebx=0ad501c8 ecx=1d18b38c edx=1d18ba60 esi=0ad501c8 edi=00000610
eip=622828ee esp=009eec80 ebp=0e6e19c8 iopl=0 nv up ei pl nz na pe nc
cs=0023ss=002bds=002bes=002bfs=0053gs=002b efl=00210206
lua51!lua_yield+0x1a72e:
622828ee 8b07 mov eax,dword ptr ds:002b:00000610=????????
Resetting default scope
EXCEPTION_RECORD:(.exr -1)
ExceptionAddress: 622828ee (lua51!lua_yield+0x0001a72e)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter: 00000000
Parameter: 00000610
Attempt to read from address 00000610
PROCESS_NAME:game.exe
READ_ADDRESS:00000610
ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%p 0x%p %s
EXCEPTION_CODE_STR:c0000005
EXCEPTION_PARAMETER1:00000000
EXCEPTION_PARAMETER2:00000610
STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
009eec88 62282b0f 0ad501c8 7edefed8 009eecfc lua51!lua_yield+0x1a72e
009eecbc 622832a9 0ad501c8 622baf1d 009eecf8 lua51!lua_yield+0x1a94f
009eed2c 756c2e6e 005d2261 00000000 00000000 lua51!luaL_traceback+0x169
009eedbc 76680b82 009eedc8 e24c4a02 00000001 shell32!CMergedFldrNamespace::GetDropFolder+0x7f
00000000 00000000 00000000 00000000 00000000 KERNELBASE!RaiseException+0x62
SYMBOL_NAME:lua51!lua_yield+1a72e
MODULE_NAME: lua51
IMAGE_NAME:lua51.dll
STACK_COMMAND:~0s ; .ecxr ; kb
FAILURE_BUCKET_ID:NULL_CLASS_PTR_READ_c0000005_lua51.dll!lua_yield
OS_VERSION:10.0.19041.1
BUILDLAB_STR:vb_release
OSPLATFORM_TYPE:x86
OSNAME:Windows 10
FAILURE_ID_HASH:{b7ee08a3-73c5-e01f-6723-47799b22f4eb}
Followup: MachineOwner
---------
看下给出堆栈信息使用了lua的traceback函数,这时候肯定是会有lua报错的,我们可以到客户端的dbug窗口查看错误信息
4.定位到出错的位置打开ollydbg附加到进程 查看模块信息可执行模块, 条目 24 基址=62580000 大小=00066000 (417792.) 入口=625D87BA lua51.<ModuleEntryPoint> 名称=lua51 路径=D:\开发\Client\lua51.dll
ctrl+n 找一下lua_yield这个函数的起始地址
625881C0 >56 push esi
然后625881C0 + 偏移地址 1a72e=625A28EE
ctrl+g定位到详细的位置
以上只是举一个简单的例子
我们查看堆栈信息的时候已经执行过了traceback,那么lua绝对会抛出错误信息,我们根据错误信息解决崩溃问题就可以了
如果没有错误信息,我们就要慢慢分析调试了...
页:
[1]