位置: 编程技术 - 正文

Windbg调试Unity3d 卡死 无响应等问题测试(windbg调试驱动)

编辑:rootadmin

推荐整理分享Windbg调试Unity3d 卡死 无响应等问题测试(windbg调试驱动),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:windbg调试无响应程序,windbg调试exe文件,windbg调试命令,windbg调试会话无法启动,windbg调试应用程序,windbg调试dump,windbg调试驱动,windbg调试应用程序,内容如对您有帮助,希望把文章链接给更多的朋友!

如果你平时玩转u3d,却没有碰到过一些奇怪的bug,导致u3d无响应,那么你是幸运的。

引起u3d卡死的bug是非常恶心的一件事。首先你无法获得任何引起bug的信息,包括控制台,日志,不会有任何信息。u3d在无响应的那一刻,就停止了工作。如果你用任务管理器直接结束掉进程,那么恭喜你,你真的再也没有机会去了解这个原因。除非这个bug非常好重现,假设是难以重现的bug,那么你将会非常苦恼。明明自己都是好的,突然有人告诉你卡死了,你会觉得是不是u3d自己的问题(基本没可能),然后终于有一天,你在自己电脑上也出现了卡死的问题,你才不得不思考。ok,那么接下来我就简单说下怎么在无响应的时候利用windbg来看看有用的信息。

首先要安装Windbg,这个大家自己去下载一个。

然后我写了个死循环的函数,放在update函数中,那么一旦运行,unity3d就会无响应。

打开windbg, attach到unity3d。

首先我们要找到的是正确的线程,因为u3d本身是一个很大的程序,有很多线程,所以你要先找到运行你自己写的游戏的线程。

运行!runaway

一般第一个就是了,你看,远远的大于其他Time.

那么就切到0号线程。

~0 s

切换成功后,接下来首先要做的就是查看堆栈信息。毕竟你最想知道的就是哪个函数导致挂掉了

Windbg调试Unity3d 卡死 无响应等问题测试(windbg调试驱动)

kv

不幸的是,你会发现压根就不会你认识的函数名。不过你要知道能有堆栈信息就已经是很幸运的了。从下往上看,你可以看到熟悉的WinMain, PlayerLoop, 然后你看到了Update,哈哈,确实是Upate里的死循环,但是你要知道Update是成千上万个,所以你需要继续看,发现了ScriptingInvocatinNoArgs,没错,就是一个无参的函数

那么接下来就要看实际情况来找信息了。

按一下u吧,看下反编译出来的结果。

这个需要一定的汇编知识。

ebp和esp是位的SP,BP esp是堆栈指针 ebp是基址指针 ESP与SP的关系就象AX与AL,AH的关系.位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。位CPU有4个位的通用寄存器EAX、EBX、ECX和EDX。对低位数据的存取,不会影响高位的数据。这些低位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。在位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在位CPU中,其位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些位寄存器更具有通用性。2、变址寄存器位CPU有2个位通用寄存器ESI和EDI。其低位对应先前CPU中的SI和DI,对低位数据的存取,不影响高位的数据。寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。3、指针寄存器位CPU有2个位通用寄存器EBP和ESP。其低位对应先前CPU中的SBP和SP,对低位数据的存取,不影响高位的数据。寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们主要用于访问堆栈内的存储单元,并且规定:BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。4、段寄存器段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的&#;和一个偏移量组合而成的,这样可用两个较少位数的&#;组合成一个可访问较大物理空间的内存地址。CPU内部的段寄存器:CS——代码段寄存器(Code Segment Register),其&#;为代码段的段&#;;DS——数据段寄存器(Data Segment Register),其&#;为数据段的段&#;;ES——附加段寄存器(Extra Segment Register),其&#;为附加数据段的段&#;;SS——堆栈段寄存器(Stack Segment Register),其&#;为堆栈段的段&#;;FS——附加段寄存器(Extra Segment Register),其&#;为附加数据段的段&#;;GS——附加段寄存器(Extra Segment Register),其&#;为附加数据段的段&#;。在位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段&#;:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段&#;,而是称为“选择子”(Selector)的某个&#;。。5、指令指针寄存器位CPU把指令指针扩展到位,并记作EIP,EIP的低位与先前CPU中的IP作用相同。指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能时,不考虑存在指令队列的情况。在实方式下,由于每个段的最大范围为K,所以,EIP中的高位肯定都为0,此时,相当于只用其低位的IP来反映程序中指令的执行次序。6、标志寄存器一、运算结果标志位1、进位标志CF(Carry Flag)进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其&#;为1,否则其&#;为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF&#;的指令等。2、奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的&#;为1,否则其&#;为0。利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。3、辅助进位标志AF(Auxiliary Carry Flag)在发生下列情况时,辅助进位标志AF的&#;被置为1,否则其&#;为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。4、零标志ZF(Zero Flag)零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其&#;为1,否则其&#;为0。在判断运算结果是否为0时,可使用此标志位。5、符号标志SF(Sign Flag)符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的&#;为0,否则其&#;为1。6、溢出标志OF(Overflow Flag)溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的&#;被置为1,否则,OF的&#;被清为0。“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。二、状态控制标志位状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。1、追踪标志TF(Trap Flag)当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。指令系统中没有专门的指令来改变标志位TF的&#;,但程序员可用其它办法来改变其&#;。2、中断允许标志IF(Interrupt-enable Flag)中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何&#;,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。CPU的指令系统中也有专门的指令来改变标志位IF的&#;。3、方向标志DF(Direction Flag)方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的&#;。三、位标志寄存器增加的标志位1、I/O特权标志IOPL(I/O Privilege Level)I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。如果当前的特权级别在数&#;上小于等于IOPL的&#;,那么,该I/O指令可执行,否则将发生一个保护异常。2、嵌套任务标志NT(Nested Task)嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:(1)、当NT=0,用堆栈中保存的&#;恢复EFLAGS、CS和EIP,执行常规的中断返回操作;(2)、当NT=1,通过任务转换实现中断返回。3、重启动标志RF(Restart Flag)重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示“接受”调试故障,否则拒绝之。在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。4、虚拟方式标志VM(Virtual Mode)如果该标志的&#;为1,则表示处理机处于虚拟的方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。

cmp是比较命令,那么我们就要看下eax和ecx寄存器中的&#;。

按一下r,你就会看到所有的寄存器,然后你会看到eax是0, ecx是1,刚好和i < 1相对应。

接下来就是jl命令,到了一个地址,那么怎么去看这个地址的信息呢。

继续u &#; 地址吧,果然是可以的。

比较的是eax,eax是0,后面是啥呢

ok,到了这里基本看到是一个死循环了。

当然这个情况很简单,所以分析起来算快的,真正的函数会异常复杂,调试个几天几夜都不过分。。。

学习Unity3D Shader篇 - 从GLSL到Unity3D Shader(一) 一直在用OpenGLGLSL开发,也用过Unity3D自己开发过一些小玩意。但是一直涉及过U3D的Shader方面。今天开始,有时间就要学习一下。如果有GLSL的开发经验,

Unity之一天一个技术点(十三)---以指定对象为中心,根据鼠标位置旋转照相机 vartarget:Transform;vardistance=.0;varxSpeed=.0;varySpeed=.0;varyMinLimit=-;varyMaxLimit=;privatevarx=0.0;privatevary=0.0;@AddComponentMenu(Camera-Control/MouseOrbit)partialclassMouseOrbit

unity手游<少侠历险记>(4)背包系统 前言本文由作者@zx一路飞奔出品,转载请注明出处文章地址:

标签: windbg调试驱动

本文链接地址:https://www.jiuchutong.com/biancheng/378857.html 转载请保留说明!

上一篇:Unity3D Vuforia Android 相机调焦

下一篇:学习Unity3D Shader篇 - 从GLSL到Unity3D Shader(一)(学习雷锋好榜样)

  • 税控盘280怎么变398了
  • 个税汇算清缴怎么把全年一次性奖金并入综合所得
  • 弃置费用的财务费用可以税前扣除吗
  • 个体户怎么网上报税流程
  • 利润表的上期金额是指全年吗
  • 境外签署合同的效力
  • 机械租赁费怎么算
  • 换货补差价怎么补给商家
  • 工程结算与工程施工如何结转
  • 短期负债包括哪些债务
  • 出差出了事故怎么处理
  • 员工罚款如何入账
  • 劳保用品增值税税率是多少
  • 小规模增值税缴纳怎么算
  • 财税〔2017〕39号
  • 购买房产,税费怎么计算
  • 金融行业小规模纳税人税率
  • 13个点的发票实际交多少钱
  • 修理时换下的废品配件怎么处理?
  • 发票分票怎么处理违章
  • 测试账户收入怎么做
  • 小规模纳税人附加税减半征收政策2023
  • 发票认证的三种方式
  • 核定征收的小规模企业优惠
  • 商品进销差价主营业务收入
  • 会计上金融资产包括哪些
  • 怎样调整以前年度多计的收入
  • 电脑开机时进入bios界面快捷键
  • mom.exe是什么进程
  • win101903怎么查看
  • php axios
  • 专利权的期限是指专利权的实际有效期限
  • 一亩地是多少平方?
  • 清包劳务有措施费吗
  • 软件服务费应计入什么
  • 文本生成图像前景怎么样
  • vget命令
  • trap指令在用户态执行
  • mysql分区语句
  • 出租人经营租赁会计分录
  • 固定资产多少可以一次摊销
  • 年报和汇算清缴不一致怎么处理
  • sQlite常用语句以及sQlite developer的使用与注册
  • 研发增值税税率怎么算
  • 综合所得年度自行申报怎么操作
  • 一般纳税人什么情况可以开3%的发票
  • 增值税附表一填写
  • 小规模未开票收入按1%还是3%
  • 对公账户转到个人账户怎么做账
  • 员工工资扣工作服押金怎么做账呢
  • 老板让我做分公司负责人能接受么
  • 住房公积金是怎么来的?
  • 存单丢失了,去哪里挂失
  • 收到红票账务处理
  • 增值税减免附加税用计提吗
  • 目标考核奖金做什么科目
  • win10预览版21390
  • server2003定时任务
  • 进程死锁原因
  • ubuntu rhythmbox乱码解决方法
  • windows u盘不识别
  • 介绍两个很常用的成语
  • xp双系统怎么切换系统
  • 64位下无法运行32位程序的解决方法 提示未指定提供程序,也没有指派的默认提供程序
  • 怎么设置永久禁止下载拼多多
  • win8.1使用技巧
  • 家用电脑是什么机型
  • excel表限制
  • 教你如何使用玻璃胶
  • js继承怎么实现
  • jquery自定义事件
  • 深入理解计算机系统
  • jQuery ajax MD5实现用户注册即时验证功能
  • javascript主要学什么
  • 按钮控件有几种类型
  • 工具类的作用
  • javascript 接口
  • 选择排序图解过程
  • 北京市税务总局官网
  • 苏州税务所电话是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设