截取自《游戏之旅——我的编程感悟》P311, 作者:云风

PS:

最近在项目中正好遇到一个release版本在测试部门崩溃了,正好拿来练手。由于是第一次,折腾了一个多小时才定位到问题。这里去把一些心得写下来。

1、崩溃时,windows会弹出一个对话框,告诉你哪个地址发生了什么样的错误。通常这还不够,dump文件更有用。dump文件生成的方法有很多,可以用代码,xp下有Dr.Watson(drwtsn32),win7更方便,任务管理器就可以了。如果那台机器正好有装vs,直接拿来调试(没有vs也没关系,可以马上用windbg附加上即可,当然最好有符号资源)

2、崩溃的地方是我的一个dll里面的,跳转到栈区看。VS显示的栈的地址是崩溃的位置,不是当前函数的位置。所以正确的函数应该是当前位置往前的第一个。

举个例子:假设崩溃的位置是 0x748c33ef,我的dll映射的范围是0x74c8c000-0x748c9000,那么实际偏移是0x748c33ef-0x748c000 = 0x33ef。我的map文件里有下面的记录

0001:000023dd _atexit 100033dd f MSVCRT:atonexit.obj

0001:000023f4  _XXXX 100033f4  f MSVCRT:XXXXX.obj

那么可以断定它是在_atexit里面出问题不。

3、下一步是准确找到准确的位置。如果你熟悉汇编,当然可以直接阅读即可。这里在开发机上直接调试发行版的dll,可以看到汇编和源代码的对应关系。

这里调试的目标的版本很重要,如果现有的工程环境已变,那么对应的map和目标码肯定也不一样了。我的做法是在发行的dll的版本号标记为svn上的版本号,到时候只有checkout对应的版本即可精确重现。

Release版本的调试相关推荐

  1. Qt Creator release版本进行调试

    一.背景: 我们在进行性Qt Creator 进行开发时,想要调试代码,通常是只需要编译 debug 版本的程序.但对于很多大型项目,引用外部第三方库中难免只存在release版本的动态库,所以,当我 ...

  2. VS的release版本如何调试

    问题 由于需要调试项目的release版本,默认的release版本不能进行调试,需要设置项目属性. 解决 1. 右键打开项目属性,切换配置至对应的Release版本 2.在左侧配置属性树中找到 C/ ...

  3. Linux环境Release版本的符号表剥离及调试方法

    Linux环境Release版本符号表剥离及调试方法 目录 Linux环境Release版本符号表剥离及调试方法 前言 1 Release版本剥离符号表 1.1 编译时,进行so库调试信息的剥离 1. ...

  4. 更简单的调试Release版本Optimize code的.NET程序集

    由于JIT的优化在调试Release版本程序集往往没有足够的跟踪信息,比如查看clrstack发现PARAMETERS:= <no data>状态. 在程序运行目录下创建一个[程序集名称] ...

  5. 【GDB调试-4】调试Release版本程序

    文章目录 一.Debug和Release 1.1 Debug版本 1.2 Release版本 1.3 区别 二.使用GDB调试Release 版本程序 一.Debug和Release 1.1 Debu ...

  6. DirectX11 程序 Release版本非正常显示解决方案及调试

    最近系统出现了一个问题:在VS2010中debug模式下纹理混合正常显示,在release模式下显示黑屏(无报错),单独运行release模式的程序仅能显示1层纹理(也无报错).这真是个奇妙的世界啊! ...

  7. C++ debug和release版本的区别及调试技巧

    一.Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程 ...

  8. GNU 工具链调试信息分离和挂载:支持 GDB 调试 RELEASE 版本程序

    GNU 工具链调试信息分离和挂载:支持 GDB 调试 RELEASE 版本程序 一般地,release 版本的程序都不带调试信息,无法使用 gdb 调试. GNU 编译工具链和二进制工具链做法如下: ...

  9. Release版本崩溃/闪退调试方法之一

    一种Release版本崩溃/闪退调试方法 Debug模式调试断点.步进追溯源码都很方便.但是当多个模块发布Release版本,集成应用过程中偶发性闪退或者崩溃.而此时又无法用Debug相关调试信息.. ...

最新文章

  1. c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
  2. Python 将视频 截取 成图片 附cv2处理教程
  3. Fragment的setUserVisibleHint方法实现延时加载
  4. MongoDB常用操作命令
  5. centos mysql 新增用户
  6. storm的并行度的解释--- ( 看完就能理解 )
  7. Ubuntu20.04配置Java环境
  8. LINUX系统管理与应用
  9. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)
  10. 滑铁卢大学计算机科学双录取,滑铁卢大学双录取要求
  11. 用 TStringList 模拟 将字符串转换为变量的功能 - 回复 flq_00000 和 外来天客 的问题...
  12. 基础IT必备知识(一)
  13. 【游戏开发】游戏开发书籍汇总
  14. 【QT小记】使用QPainter绘制各种基本图形
  15. vue一维码,二维码生成
  16. 搞渗透!还不会信息收集的看这里(大佬的秘籍)
  17. Caused by java.lang.Exception Failed to send data to Kafka Expiring
  18. html网页的说课稿,网页设计之滚动字幕说课稿
  19. Android中监听Home键的4种方法总结
  20. 2022-05-25 postgres中的并发控制的可重复读

热门文章

  1. 常量的定义与使用与变量的定义与使用
  2. 【物联网中间件平台-05】YFIOs策略开发指南
  3. 内部DNS服务器搭建
  4. 浙大PAT甲级-1017
  5. 山东省中小企业数字化转型论坛成功举办,九州云赋能中小企业数智升级
  6. mysql 重命名库_MySQL 库名重命名
  7. 解决NameError: name ‘xxx‘ is not defined
  8. Windows Subsystem for Android™ 安装教程
  9. 2020年第十一届蓝桥杯A组省赛
  10. 进程平均周转时间的计算