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…

merge

merge语句具有按条件获取要更新或插入到表中的数据行&#xff0c;然后从1个或多个源头对表进行更新或向表中插入行两方面的能力。经常用在数据仓库中移动大量数据。 语法: merge<hint> into<table_name> using<table_view_or_query> on<condition> whe…

可以优化同步吗?

总览 有一个常见的误解&#xff0c;因为JIT很智能&#xff0c;并且可以消除对象的同步&#xff0c;而该对象仅存在于不影响性能的方法中。 比较StringBuffer和StringBuilder的测试 这两个类基本上做相同的事情&#xff0c;除了一个是同步的&#xff08;StringBuffer&#xff0…

perl exe执行提示缺少文件解决方法

在项目开发中&#xff0c;使用perl语言编译的exe可执行文件;在项目中使用了XML::LibXML模块&#xff1b;发现exe在本机电脑执行正常&#xff0c;但在其他同事执行时却提示缺少libxml2-2.dll等文件。 问题现象&#xff1a; 无法启动此程序&#xff0c;因为计算机中丢失libxml2-2…

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

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

Flex弹性布局

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

洛谷P3045 [USACO12FEB]牛券Cow Coupons

P3045 [USACO12FEB]牛券Cow Coupons 71通过248提交题目提供者洛谷OnlineJudge标签USACO2012云端难度提高/省选-时空限制1s / 128MB提交 讨论 题解 最新讨论更多讨论 86分求救题目描述 Farmer John needs new cows! There are N cows for sale (1 < N < 50,000), and …

python数据挖掘电影评分分析_Pyhon数据分析项目——男女电影评分差异比较

《用Python玩转数据》数据分析项目一、程序功能基于MovieLens100k数据集中男性女性对电影的评分来判断男性还是女性电影评分的差异性更大。二、数据来源数据集下载&#xff1a;http://files.grouplens.org/datasets/movielens/ml-100k.zip数据含义&#xff1a;u.data表示100k条…

发掘Apache Camel的力量

最近几年&#xff0c;ESB软件越来越受欢迎。 如果大多数人通常知道什么是ESB&#xff0c;那么他们很少会清楚地了解这种体系结构的不同组件的确切作用。 例如&#xff0c;Apache ServiceMix由三个主要组件组成&#xff1a;Apache Karaf&#xff08;OSGI容器&#xff09;&#…

unix/linux系统中文件分为哪些类型?,到底该如何理解 Unix/Linux 的文件系统?看这篇就知道了...

原标题&#xff1a;到底该如何理解 Unix/Linux 的文件系统&#xff1f;看这篇就知道了作者&#xff1a;舠

【Luogu】P1131时态同步(树形DP)

题目链接 甚矣吾衰也&#xff01;这么简单的DP我都不会了 太恐怖了 树形DP&#xff0c;从子树里选出时间最长的来&#xff0c;剩下的调到这个最长时间即可。 #include<cstdio> #include<cctype> #include<algorithm> #include<cstring>using std::max;…

HTML小记

1、页面内跳转 当<a>元素用于页面内的锚点跳转时&#xff0c;应该先为该页面设置一些锚点&#xff0c;而定义锚点有两种办法&#xff1a; 通过<a>元素的name属性来定义&#xff0c;如&#xff1a;<a name"anchor-name">name属性的值就是锚点的名…

python3连接数据库失败_python3使用pymysql连接mysql数据库报Keyerror

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼不好意思Traceback (most recent call last):File "d:\Python\practice2\mydbconn.py", line 5, in conn pymysql.connect(usertestuser, passwdtestpasswd,host192.168.1.3, dbtest,charsetutf8)File "C:\Users\t…

MantisBT 问题分配显示 姓名

MantisBT 在提交问题的时候&#xff0c;系统默认“分配”给备选账号&#xff0c;而不是姓名。这样在使用的时候很不便。能够通过改动配置文件来改变&#xff0c;找到MantisBT根文件夹下文件config_inc.php&#xff0c;用文本编辑器打开。代码例如以下&#xff1a; <?php $g…

使用多种MIME类型测试REST

1.概述 本文将重点介绍测试具有多种媒体类型/表示形式的RESTful服务。 这是关于使用Spring和基于Java的配置的Spring Security设置安全的RESTful Web Service的系列文章的第十篇。 REST with Spring系列&#xff1a; 第1部分 – 使用Spring 3.1和基于Java的配置引导Web应用程序…

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

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

JavaWeb学习中的小问题

1. HttpServletRequest和ServletRequest之间的区别&#xff1f; 再看别人项目的时候突然看到一句&#xff1a; ServletRequest request&#xff1b;HttpServletRequest hsRequest (HttpServletRequest) request;// 获取HttpServletRequest对象瞬间就有一点懵逼 &#xff0c;赶…

python 结构数组_Python数组

数组是一个容器&#xff0c;它可以容纳一定数量的项目&#xff0c;这些项目是相同的类型。 大部分数据结构都使用数组来实现它们的算法。 以下是理解数组(Array)概念的重要术语。元素 - 存储在数组中的每个项目称为元素。索引 - 数组中元素的每个位置都有一个数字索引&#xff…

广播 布局文件代码

<?xml version"1.0" encoding"utf-8"?><RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:app"http://schemas.android.com/apk/res-auto" xmlns:tools"http://schemas.android.com/…