memcpy造成的dump

本文介绍了一次因memcpy操作导致的程序崩溃案例。通过重现问题并采用输出日志的方法,最终定位到了内存越界的根源。文章强调了在遇到仅有单一内存地址调用栈的崩溃时,应考虑内存越界的可能性。

memcpy造成的崩溃

最近拿到一个dump,调用栈只有一个内存地址,当时就懵逼了。幸亏这个崩溃可以重现(由于内存越界造成的崩溃,还不是每次必现哭)。

但重现了也不是就ok了,就算在windbg里面调试,崩溃的时候也是跟不了调用栈,可能与vs的release优化有关。最后还是用最古老的“输出日志调试法”才定位到问题:由于内存越界,memcpy的长度超过了buffer的大小,然后造成崩溃。

写下来主要是为了记住,万一遇到这种调用栈只有一个内存的崩溃,可以考虑一下内存越界的原因,以及memcpy这种操作。

### 如何使用 WinDbg 创建和捕获 Dump 文件 当需要诊断应用程序中的问题时,创建 dump 文件是一个非常有用的工具。通过这些文件可以在不重现错误的情况下分析程序的状态。 #### 方法一:手动触发 Mini-Dump 或 Full-Dump 的生成 对于正在运行的应用程序,在 Windbg 中可以通过命令行来强制生成 dump 文件: ```plaintext .dump /ma c:\path\to\save\file.dmp ``` 这条指令将会保存一个完整的内存映像到指定路径下[^2]。 #### 方法二:配置 Windows 自动创建 Dump 文件 为了确保即使 Windbg 没有及时捕捉到异常也能获得 dump 数据,可以设置操作系统自动为崩溃的应用程序生成 mini-dumps。这通常是在系统属性->高级系统设置->启动和恢复选项里完成的。也可以利用注册表编辑器修改 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Error Reporting` 下的相关键值[^3]。 #### 方法三:编写代码模拟特定条件下的 Crash 并生成 Dump 作为开发者还可以主动控制何时生成 dump 文件。例如下面这段 C++ 测试代码展示了怎样故意制造一次访问冲突从而引发 crash,并最终由系统或调试器处理此事件并记录相应的 dump 信息: ```cpp void myfunc(){ printf("join to myfunc...\n"); // 故意造成空指针解引用导致crash char* p = NULL; memcpy(p, "hello word", strlen("hello word")); } ``` 一旦上述函数被执行,则会产生未处理的异常状况,进而促使操作环境按照预设策略响应——比如调用调试器或者写入 minidump 到磁盘上等待后续审查。 #### 方法四:使用 ADPlus 工具自动化收集 Debugging Information ADPlus 是一款附带于 Debugging Tools for Windows 套件内的实用程序,专门用来监控目标应用并在其遭遇严重错误时自动生成详细的 debug 报告连同关联的日志与 dumps。执行 adplus.vbs 脚本即可开始监视选定的服务或进程实例[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值