new失败跟踪函数_WinDbg预览时间线:调试器中的时间线可以允许用户记录跟踪

a9a5a1791ced83c3b3756cb01c4da15b.gif

时间旅行调试(TTD)允许用户记录跟踪,这些跟踪是对程序执行的记录。时间线是执行过程中发生的事件的直观表示,这些事件可以是包括断点,内存读/写,函数调用和返回以及异常。

340e95b1dd9afe055c56cc76a112a54e.png

使用时间线窗口可以快速查看重要事件,了解相对位置并轻松跳转到它们在TTD跟踪文件中的位置,使用多个时间线以可视方式探索时间旅行轨迹中的事件并发现事件相关性。

打开TTD跟踪文件时将显示时间线窗口,并显示关键事件,而无需手动创建数据模型查询。同时,所有时间旅行对象均可用,以允许进行更复杂的数据查询。有关创建和使用时间旅行跟踪文件的更多信息,请点此查看。

cad7390fe2ab2c21593f220026688120.png时间线类型

时间线窗口可以显示以下事件:

1.异常(你可以进一步过滤特定的异常代码);

2.断点(添加断点时也会自动添加断点的时间线);

3.函数调用(以module!function形式搜索);

4.内存访问(在两个内存地址之间进行读/写/执行);

将鼠标停在每个事件上,通过工具提示获取更多信息。点击事件将运行事件查询并显示更多信息,双击事件将跳至TTD跟踪文件中的该位置。

cad7390fe2ab2c21593f220026688120.png异常

当你加载跟踪文件并且时间线处于活动状态时,它将自动显示记录中的任何异常。当你将鼠标悬停在断点上时,将显示诸如异常类型和异常代码之类的信息。

ba05f37f2a5b3316a63085c2ec6645f2.png

你可以使用可选的异常代码字段进一步过滤特定的异常代码:

c7cb48295c57d2dd5a81c668d6aa1acf.png

你还可以为特定的异常类型添加新的时间线。

cad7390fe2ab2c21593f220026688120.png断点

添加断点后,会将断点的时间线自动添加到时间线。例如,可以使用bp Set Breakpoint命令完成此操作。当你将鼠标悬停在断点上时,将显示地址和与断点关联的指令指针。

3529aa64391aa50f84dac93da5d9e756.png

清除断点后,关联的断点时间线将自动删除。

cad7390fe2ab2c21593f220026688120.png函数调用

你可以在时间线上显示函数调用的位置。为此,就要以module!function的形式提供搜索,例如TimelineTestCode!multiplyTwo。你还可以指定通配符,例如TimelineTestCode!m*。

0a371cdad3b2cd04c7c7c6d19cdc67c1.png

将鼠标悬停在函数上时,将显示函数名称、输入参数及其值和返回值。此示例显示缓冲区和大小,因为这些是DisplayGreeting!GetCppConGreeting的参数。

3d04c08277b23d96bb7b3dd25cf15117.png

cad7390fe2ab2c21593f220026688120.png内存访问

使用内存访问时间线显示何时已读取或写入特定范围的内存,或在何处执行了代码。起始地址和终止地址用于定义两个存储器地址之间的范围。

4c62016d0e6e1281c3577a79c84863c2.png

将鼠标悬停在内存访问项上时,将显示值和指令指针。

b577ea12b161b77ad0b69a5a7925b734.png

cad7390fe2ab2c21593f220026688120.png使用时间线

当将鼠标悬停在时间线上时,一条垂直的灰色线将跟随鼠标,蓝色竖线表示跟踪中的当前位置,点击放大镜图标可放大和缩小时间线。

在顶部时间线控制区域中,使用矩形来平移时间线的视图。拖动矩形的外部定界符以调整当前时间线视图的大小。

f4090f2e6efaa4204b0ba25d4311e665.png

cad7390fe2ab2c21593f220026688120.png鼠标移动

使用Ctrl +滚轮放大和缩小,使用Shift +滚轮可左右滚动。

cad7390fe2ab2c21593f220026688120.png时间线调试技术

为了演示调试时间线技术,此处重用了“时间旅行调试演练(Time Travel Debugging Walkthrough)”。本演示假设你已经完成了构建样例代码的前两个步骤,并使用前面描述的前两个步骤创建了TTD记录。

第1部分:构建示例代码;

第二部分:记录“DisplayGreeting”示例的踪迹;

在本示例中,第一步是在时间旅行跟踪中查找异常,这可以通过双击时间线上唯一的异常来实现。

在命令窗口中,我们看到点击异常时发出了以下命令。

(2dcc.6600): Break instruction exception - code 80000003 (first/second chance not available)

Time Travel Position: CC:0

@$curprocess.TTD.Events.Where(t => t.Type == "Exception")[0x0].Position.SeekTo()

选择查看>>寄存器以在时间线上显示寄存器,开始我们的调查。

fa234e6cd98da803a822b8c2bcb57803.png

在命令输出中,请注意堆栈(esp)和基本指针(ebp)指向两个截然不同的地址。这可能表明堆栈已损坏,可能是返回的函数损坏了堆栈。为了验证这一点,我们需要返回到CPU状态被损坏之前的状态,并查看是否可以确定何时发生堆栈损坏。在此过程中,我们将检查局部变量和堆栈的值。选择查看>>当地,以显示本地值,选择查看>>堆栈以显示代码执行堆栈。

在跟踪失败时,通常会在错误处理代码的真正原因之后结束几个步骤。通过时间旅行,我们可以一次返回一条指令,找出真正的根本原因。

从主页功能区中,使用“后退一步”命令后退三步指令。执行此操作时,请继续检查堆栈,本地变量和注册窗口。

当你使用“后退一步”命令后,命令窗口将显示时间行进位置和寄存器。

0:000> t-

Time Travel Position: CB:41

eax=00000000 ebx=00564000 ecx=c0d21d62 edx=7a1e4a6c esi=00061299 edi=00061299

eip=00540020 esp=003cf7d0 ebp=00520055 iopl=0         nv up ei pl zr na pe nc

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246

00540020 ??              ???

0:000> t-

Time Travel Position: CB:40

eax=00000000 ebx=00564000 ecx=c0d21d62 edx=7a1e4a6c esi=00061299 edi=00061299

eip=00061767 esp=003cf7cc ebp=00520055 iopl=0         nv up ei pl zr na pe nc

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246

DisplayGreeting!main+0x57:

00061767 c3              ret

0:000> t-

Time Travel Position: CB:3A

eax=0000004c ebx=00564000 ecx=c0d21d62 edx=7a1e4a6c esi=00061299 edi=00061299

eip=0006175f esp=003cf718 ebp=003cf7c8 iopl=0         nv up ei pl nz na pe nc

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000206

DisplayGreeting!main+0x4f:

0006175f 33c0            xor     eax,eax

在跟踪时,我们的堆栈和基本指针具有更有意义的值,因此看来我们越来越接近代码中发生损坏的位置。

esp=003cf718 ebp=003cf7c8

另一个有趣的地方是,本地窗口包含来自我们的目标应用程序的值,而源代码窗口则高亮显示在跟踪中的源代码中准备执行的代码行。

为了进一步研究,我们可以打开一个内存窗口来查看堆栈指针(esp)内存地址附近的内容。在此示例中,其值为003cf7c8。选择内存>>文本>> ASCII以显示存储在该地址的ASCII文本。

68019dc562e8b05cd1ab2f906197039b.png

cad7390fe2ab2c21593f220026688120.png内存访问时间线

确定了感兴趣的内存位置后,使用该值添加内存访问时间线。点击+添加时间线,然后填写起始地址。我们将查看4个字节,因此将其添加到003cf7c8的起始地址中,即得到003cf7cb。默认设置是查看所有内存写入,但是你也可以仅查看该地址处的写入或代码执行。

f9e739f86702166c5d3f33cc9e562836.png

现在,我们可以反向遍历时间线,以检查这段时间在此行的跟踪记录的哪一点被写入,以查看可以找到的内容。点击时间线上的此位置,我们看到本地人为要复制的字符串取不同的值。目标值似乎不完整,好像我们的字符串长度不正确。

d4090e40a8d6c4af78ef6b730d7d46b3.png

cad7390fe2ab2c21593f220026688120.png断点时间线

使用断点是在某些情况下暂停代码执行的常用方法,TTD允许你设置一个断点并及时返回,直到在记录跟踪之后找到该断点为止。在问题发生后检查过程状态,确定断点的最佳位置的能力启用了TTD特有的其他调试工作流。

要探索替代的时间线调试技术,请点击时间线中的异常,然后使用Home功能区上的“后退一步”命令再次前进三步。

在这个示例中,仅查看代码将非常容易,但是如果有数百行代码和数十个子例程,则可以使用此处描述的技术来减少定位问题所需的时间。

如前所述,基本指针(esp)并非指向指令,而是指向我们的消息文本。

使用ba命令在内存访问上设置断点,我们将设置一个w - write断点,以查看何时写入此内存区域。

0:000> ba w4 003cf7c8

尽管我们将使用简单的内存访问断点,但可以将断点构造为更复杂的条件语句。有关更多信息,请参见bp,bu,bm(设置断点)。

从“主页”菜单中,选择“返回”以返回到断点之前的时间。此时,我们可以检查程序堆栈以查看哪些代码处于活动状态。

896e8b5e9191a8bd45f5e310f5b83f3a.png

由于Microsoft提供的wscpy_s()函数不太可能出现这样的代码错误,因此我们在堆栈中进行了进一步的研究。堆栈显示Greeting!main调用Greeting!GetCppConGreeting。在这个非常小的代码示例中,我们可以在此时打开代码,并且很容易发现错误。但是,为了说明可以用于更大、更复杂的程序的技术,为此我们将设置添加一个函数调用时间线。

cad7390fe2ab2c21593f220026688120.png        函数调用时间线

点击+添加时间线,然后填写DisplayGreeting!GetCppConGreeting作为函数搜索字符串。

“开始”和“结束位置”复选框表示跟踪中函数调用的开始和结束位置。

我们可以使用dx命令显示函数调用对象,以查看关联的TimeStart和TimeEnd字段,它们与函数调用的“开始位置”和“结束位置”相对应。

dx @$cursession.TTD.Calls("DisplayGreeting!GetCppConGreeting")[0x0]

    EventType        : 0x0

    ThreadId         : 0x6600

    UniqueThreadId   : 0x2

    TimeStart        : 6D:BD [Time Travel]

    SystemTimeStart  : Thursday, October 31, 2019 23:36:05

    TimeEnd          : 6D:742 [Time Travel]

    SystemTimeEnd    : Thursday, October 31, 2019 23:36:05

    Function         : DisplayGreeting!GetCppConGreeting

    FunctionAddress  : 0x615a0

    ReturnAddress    : 0x61746

    Parameters

必须选中“开始”或“结束”,或者同时选中“开始”和“结束”位置框。

19f17f773a8a8e3c9fbbcbdf7eff86cf.png

由于我们的代码既不是递归代码也不是可重入代码,因此调用GetCppConGreeting方法时,很容易在时间线上定位。对GetCppConGreeting的调用也与我们的断点以及我们定义的内存访问事件同时发生。因此,似乎我们已经缩小了代码范围,仔细研究了导致应用程序崩溃的根本原因。

ce979bb970360129566e55b3bf8fce9e.png

cad7390fe2ab2c21593f220026688120.png通过查看多个时间线来探索代码执行

尽管我们的代码示例很小,但是使用多个时间线的技术可以对时间旅行轨迹进行可视化探索。你可以查看跟踪文件以询问问题,例如“何时在命中断点之前访问内存区域?”。

4baebadd8e00ad05ec69dacecd723f9d.png

本文翻译自:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/windbg-timeline-preview

6d9b90acbe4dfbd2c147c3be70258519.png

fdab5be2850cb60afa4b483376fa4bf9.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 进程的执行时间,Linux 获取进程执行时间

Linux 获取进程执行时间1 前言测试一个程序的执行时间, 时间包括用户 CPU 时间系统 CPU 时间时钟时间之前获取之前时间都是在程序的 main 函数用 time 函数实现, 这个只能粗略的计算程序的执行时间, 不能准确的获取其他时间在看 APUE 时, 书中有关程序时间测试程序, 非常正规, …

Java环境变量的设置

1.计算机->属性->高级系统设置->环境变量 2.设置JAVA_HOME和path,1.5之后的JDK可以不设置classpath 3.JAVA_HOME的路径是JDK的安装路径 4.在系统变量里面找到path,然后点击修改,在最后面添加%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 5…

华为抢购助手_华为荣耀20系列手机采用的五项新科技,科普简介

5月底荣耀20系列在上海发布,荣耀20系列旗舰手机拥有五项荣耀自主研发的新科技,包括LinkTurbo网络聚合加速、超级NFC、方舟编译器、人性化YOYO智慧生命体,超级蓝牙。下面分别介绍一下这五项新科技。LinkTurbo网络聚合加速先来科普一下LinkTurb…

Flex弹性布局

1 Flex: 弹性布局 (转) 任何一个容器都可以指定为 Flex 布局。 1 .box {2  display: flex;3 } 行内元素也可以使用 Flex 布局。 1 .box{2 display: inline-flex;3 } 注意,设为 Flex 布局以后,子元素的 float、 clear 和 vertical-align 属性将失效…

firewallD卸载Linux,在Ubuntu 18.04/16.04系统上安装和使用Firewalld的方法

本文介绍Firewalld在Ubuntu 18.04或Ubuntu 16.04发行版上的安装方法及基本用法。简介Firewalld是Linux防火墙管理工具,支持IPv4、IPv6、以太网桥和IPSet防火墙设置,它充当Linux内核的netfilter框架的前端,同时Firewalld是RHEL 7系列上的默认防…

PCGen的垃圾收集分析

介绍 我决定结合我的两个软件爱好,并在PCGen上进行一些分析, PCGen是一种流行的基于Java的开放源代码角色生成器,用于角色扮演游戏。 我用Censum ,我们( jClarity的)新的垃圾收集日志分析工具来进行分析。 …

springboot不会运行gc_SpringBoot 和JVM 调优(深度好文,建议收藏)

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件 application.p…

3dobject用什么打开_第一次用开塞露是什么感觉?网友:像打开了新世界的大门

第一次用开塞露是什么感觉?网友:像打开了新世界的大门我妈说我小时候便秘去医院,医生给开了支开塞露,然后在医院的公厕里使用的,我妈的描述是:“要不是我手挪走的快点,就直接喷我手了”。。。。。。。。。。。。。。。…

Java 7中对String.substring的更改

众所周知,在您生成相同源字符串的许多子字符串的情况下,Java会优化子字符串操作。 它通过使用(value, offset, count)存储信息的方式来做到这一点。 请参阅以下示例: 在上图中,您会看到字符串“ Hello”和“ World!”…

原生js创建模态框

1.效果图如下&#xff1a; 2.代码如下&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Test</title><style>#pageMask {visibility: hidden; position: absolute;left: 0px; top: 0px;width:…

CSS节选——选择器

CSS&#xff0c;cascading style sheet&#xff0c;层叠样式表&#xff0c;请留意层叠概念。 css3为了区分伪类和伪元素&#xff0c;伪元素采用双冒号写法。 常见伪类——:hover,:link,:active,:target,:not(),:focus。 常见伪元素——::first-letter,::first-line,::before…

vue.js基础知识篇(7):表单校验详解

目录 网盘 第12章:表单校验 1.npm安装vue-validator $ npm install vue-validator 代码示例: var Vuerequire("vue"); var VueValidatorrequire("vue-validator"); Vue.use(VueValidator); 2.直接使用script标签引入vue.js 要下载vue-validator&#xff0c…

SQL数据库中临时表、临时变量和WITH AS关键词创建“临时表”的区别

原文链接&#xff1a;https://www.cnblogs.com/zhaowei303/articles/4204805.html SQL数据库中数据处理时&#xff0c;有时候需要建立临时表&#xff0c;将查询后的结果集放到临时表中&#xff0c;然后在针对这个数据进行操作。 创建“临时表”&#xff08;逻辑上的临时表&…

zbb20170626 myeclipse 2017 ci 构建 spring hibernate struts jar

转载于:https://www.cnblogs.com/super-admin/p/7081209.html

Java线程:保留的内存分析

本文将为您提供一个教程&#xff0c;使您可以确定活动应用程序Java线程保留Java堆空间的数量和位置。 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究&#xff0c;以使您更好地理解分析过程。 我们还将尝试证明过多的垃圾回收或Java堆空间的内存占用问题通常不是由真正…

软件测试白皮书-等价类

设有一个档案管理系统&#xff0c;要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月&#xff0c;并规定日期由6位数字字符组成&#xff0c;前4位表示年&#xff0c;后2位表示月。现用等价类划分法设计测试用例&#xff0c;来测试程序的"日期检查功能&qu…

深入css布局 (1) — 盒模型 元素分类

深入css布局&#xff08;1&#xff09;—— 盒模型 & 元素分类 “ 在css知识体系中&#xff0c;除了css选择器&#xff0c;样式属性等基础知识外&#xff0c;css布局相关的知识才是css比较核心和重要的点。今天我们来深入学习一下css布局相关的知识。” 首先来列下大纲 盒模…

批改网禁止粘贴怎么破_教育部对家长批改作业表态了,明令禁止!你怎么看?...

互联网的发展&#xff0c;的确方便了现代人生活。视频电话、出去买东西你都不用带钱带卡&#xff0c;手机一扫就可以完成支付。很多中小学的家长都会建一个家长群&#xff0c;方便老师和家长的沟通。这个群可以说是家长和学校的桥梁和纽带&#xff0c;家长们为了支持老师的工作…

MapReduce算法–顺序反转

这篇文章是介绍MapReduce算法的系列文章的另一部分&#xff0c;该书在使用MapReduce进行数据密集型文本处理中找到。 先前的文章是Local Aggregation &#xff0c; Local Aggregation PartII和创建共现矩阵 。 这次我们将讨论阶数反转模式。 顺序反转模式利用的MapReduce来计算…

液压支架销轴力学计算分析研究_基于RFID射频精准定位的智能开采研究与应用...

一、项目背景近年来随着智能开采技术的不断发展&#xff0c;装备和新工艺不断更新换代,在智能开采中&#xff0c;对采煤机位置的精准定位是能否实现智能开采的关键&#xff0c;只有准确无误地获取煤机的准确位置&#xff0c;才能实现工作面的智能化开采&#xff0c;进而提高生产…