sky258  2024-6-14 15:17:07 | 学习教程|
0 344

25

回帖

6274

金币

3364

积分

积分
3364
发表于 2024-6-14 15:17:07 | 显示全部楼层 |阅读模式

马上注册,下载996引擎,与更多游戏开发者交流。

您需要 登录 才可以下载或查看,没有账号?注册

×
相关工具:WinDbg
ollydbg
要求:
有一定的逆向基础
游戏崩溃时会在客户端目录生成dmp文件(内存镜像文件)

1.
使用WinDbg 打开dmp文件
1.png
2.png

首次打开可能要稍微等待一下,因为他要下载一些符号文件
2.
命令处输入.excr 快速定位崩溃位置
3.png
崩溃的模块,和一些寄存器信息
可以看到是lua这里崩溃了,大致应该是在访问了一个不存在的指针,导致崩溃。

3.
输入!analyze -v 让windbg 给我们分析下崩溃原因


返回结果
  1. *******************************************************************************
  2. *                                                                             *
  3. *                        Exception Analysis                                   *
  4. *                                                                             *
  5. *******************************************************************************

  6. *** WARNING: Unable to verify checksum for game.exe
  7. *** WARNING: Unable to verify checksum for libcocos2d.dll
  8. *** WARNING: Unable to verify checksum for OpenAL32.dll

  9. KEY_VALUES_STRING: 1

  10.     Key  : AV.Fault
  11.     Value: Read

  12.     Key  : Analysis.CPU.Sec
  13.     Value: 0

  14.     Key  : Analysis.DebugAnalysisProvider.CPP
  15.     Value: Create: 8007007e on DESKTOP-15R5MQL

  16.     Key  : Analysis.DebugData
  17.     Value: CreateObject

  18.     Key  : Analysis.DebugModel
  19.     Value: CreateObject

  20.     Key  : Analysis.Elapsed.Sec
  21.     Value: 63

  22.     Key  : Analysis.Memory.CommitPeak.Mb
  23.     Value: 169

  24.     Key  : Analysis.System
  25.     Value: CreateObject

  26.     Key  : Timeline.Process.Start.DeltaSec
  27.     Value: 1003


  28. APPLICATION_VERIFIER_FLAGS:  0

  29. CONTEXT:  (.ecxr)
  30. eax=f8b9d2ec ebx=0ad501c8 ecx=1d18b38c edx=1d18ba60 esi=0ad501c8 edi=00000610
  31. eip=622828ee esp=009eec80 ebp=0e6e19c8 iopl=0         nv up ei pl nz na pe nc
  32. cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00210206
  33. lua51!lua_yield+0x1a72e:
  34. 622828ee 8b07            mov     eax,dword ptr [edi]  ds:002b:00000610=????????
  35. Resetting default scope

  36. EXCEPTION_RECORD:  (.exr -1)
  37. ExceptionAddress: 622828ee (lua51!lua_yield+0x0001a72e)
  38.    ExceptionCode: c0000005 (Access violation)
  39.   ExceptionFlags: 00000000
  40. NumberParameters: 2
  41.    Parameter[0]: 00000000
  42.    Parameter[1]: 00000610
  43. Attempt to read from address 00000610

  44. PROCESS_NAME:  game.exe

  45. READ_ADDRESS:  00000610

  46. ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%p            0x%p                    %s

  47. EXCEPTION_CODE_STR:  c0000005

  48. EXCEPTION_PARAMETER1:  00000000

  49. EXCEPTION_PARAMETER2:  00000610

  50. STACK_TEXT:  
  51. WARNING: Stack unwind information not available. Following frames may be wrong.
  52. 009eec88 62282b0f 0ad501c8 7edefed8 009eecfc lua51!lua_yield+0x1a72e
  53. 009eecbc 622832a9 0ad501c8 622baf1d 009eecf8 lua51!lua_yield+0x1a94f
  54. 009eed2c 756c2e6e 005d2261 00000000 00000000 lua51!luaL_traceback+0x169
  55. 009eedbc 76680b82 009eedc8 e24c4a02 00000001 shell32!CMergedFldrNamespace::GetDropFolder+0x7f
  56. 00000000 00000000 00000000 00000000 00000000 KERNELBASE!RaiseException+0x62


  57. SYMBOL_NAME:  lua51!lua_yield+1a72e

  58. MODULE_NAME: lua51

  59. IMAGE_NAME:  lua51.dll

  60. STACK_COMMAND:  ~0s ; .ecxr ; kb

  61. FAILURE_BUCKET_ID:  NULL_CLASS_PTR_READ_c0000005_lua51.dll!lua_yield

  62. OS_VERSION:  10.0.19041.1

  63. BUILDLAB_STR:  vb_release

  64. OSPLATFORM_TYPE:  x86

  65. OSNAME:  Windows 10

  66. FAILURE_ID_HASH:  {b7ee08a3-73c5-e01f-6723-47799b22f4eb}

  67. Followup:     MachineOwner
  68. ---------
复制代码
看下给出堆栈信息使用了lua的traceback函数,这时候肯定是会有lua报错的,我们可以到客户端的dbug窗口查看错误信息
4.定位到出错的位置打开ollydbg附加到进程 查看模块信息 4.png 可执行模块, 条目 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定位到详细的位置

5.png

以上只是举一个简单的例子
我们查看堆栈信息的时候已经执行过了traceback,那么lua绝对会抛出错误信息,我们根据错误信息解决崩溃问题就可以了
如果没有错误信息,我们就要慢慢分析调试了...
回复

使用道具 举报