Release版本的调试
截取自《游戏之旅——我的编程感悟》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版本的调试相关推荐
- Qt Creator release版本进行调试
一.背景: 我们在进行性Qt Creator 进行开发时,想要调试代码,通常是只需要编译 debug 版本的程序.但对于很多大型项目,引用外部第三方库中难免只存在release版本的动态库,所以,当我 ...
- VS的release版本如何调试
问题 由于需要调试项目的release版本,默认的release版本不能进行调试,需要设置项目属性. 解决 1. 右键打开项目属性,切换配置至对应的Release版本 2.在左侧配置属性树中找到 C/ ...
- Linux环境Release版本的符号表剥离及调试方法
Linux环境Release版本符号表剥离及调试方法 目录 Linux环境Release版本符号表剥离及调试方法 前言 1 Release版本剥离符号表 1.1 编译时,进行so库调试信息的剥离 1. ...
- 更简单的调试Release版本Optimize code的.NET程序集
由于JIT的优化在调试Release版本程序集往往没有足够的跟踪信息,比如查看clrstack发现PARAMETERS:= <no data>状态. 在程序运行目录下创建一个[程序集名称] ...
- 【GDB调试-4】调试Release版本程序
文章目录 一.Debug和Release 1.1 Debug版本 1.2 Release版本 1.3 区别 二.使用GDB调试Release 版本程序 一.Debug和Release 1.1 Debu ...
- DirectX11 程序 Release版本非正常显示解决方案及调试
最近系统出现了一个问题:在VS2010中debug模式下纹理混合正常显示,在release模式下显示黑屏(无报错),单独运行release模式的程序仅能显示1层纹理(也无报错).这真是个奇妙的世界啊! ...
- C++ debug和release版本的区别及调试技巧
一.Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程 ...
- GNU 工具链调试信息分离和挂载:支持 GDB 调试 RELEASE 版本程序
GNU 工具链调试信息分离和挂载:支持 GDB 调试 RELEASE 版本程序 一般地,release 版本的程序都不带调试信息,无法使用 gdb 调试. GNU 编译工具链和二进制工具链做法如下: ...
- Release版本崩溃/闪退调试方法之一
一种Release版本崩溃/闪退调试方法 Debug模式调试断点.步进追溯源码都很方便.但是当多个模块发布Release版本,集成应用过程中偶发性闪退或者崩溃.而此时又无法用Debug相关调试信息.. ...
最新文章
- c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
- Python 将视频 截取 成图片 附cv2处理教程
- Fragment的setUserVisibleHint方法实现延时加载
- MongoDB常用操作命令
- centos mysql 新增用户
- storm的并行度的解释--- ( 看完就能理解 )
- Ubuntu20.04配置Java环境
- LINUX系统管理与应用
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)
- 滑铁卢大学计算机科学双录取,滑铁卢大学双录取要求
- 用 TStringList 模拟 将字符串转换为变量的功能 - 回复 flq_00000 和 外来天客 的问题...
- 基础IT必备知识(一)
- 【游戏开发】游戏开发书籍汇总
- 【QT小记】使用QPainter绘制各种基本图形
- vue一维码,二维码生成
- 搞渗透!还不会信息收集的看这里(大佬的秘籍)
- Caused by java.lang.Exception Failed to send data to Kafka Expiring
- html网页的说课稿,网页设计之滚动字幕说课稿
- Android中监听Home键的4种方法总结
- 2022-05-25 postgres中的并发控制的可重复读