在WinDbg中显示和搜索std::vector内容
WinDbg从来都不擅长可视化。尽管Visual Studio一直都有autoexp.dat,而且最近还出现了本机调试器可视化工具,但WinDbg用户不得不满足于转储内存区域和搜索内存来识别模式。
另一方面,如果希望简化调试过程,Visual Studio目前没有提供任何自动化机会。从Visual Studio 2012开始,不能再编写宏。WinDbg继续提供脚本支持,因此可以自动执行遇到的任何日常调试任务。如果通过了初始学习曲线并掌握了WinDbg脚本,几乎可以保证比在Visual Studio中手动遍历对象的同事获得更好更快的结果。
有一些不错的在线教程可以指导了解WinDbg脚本的基本知识,而且内置文档(debugger.chm)也有一些不错的场景。在这篇文章中,我想写一个简单的脚本,它搜索std::vector实例中匹配特定条件的对象,然后显示它们。
下面是如何使用这个脚本。假设有一个点类型的复杂对象向量。反过来,点类型有一个字段数据,该字段有一个类型为int的名为z的字段。正在查找其data.z字段等于0的点。如下:
0:000> $$>a< traverse_vector.script my_points ".block { .if (@@(@$t0->data.z) == 0) { ?? @$t0 } }"
struct point * 0x0129e4d0
+0x000 x : 0n0
+0x004 y : 0n0
+0x008 data : extra_data
脚本将$t0伪寄存器传递给向量的每个元素的命令块。在上面的命令块中,if语句将提供的表达式作为C++表达式求值(@ @运算符强制C++表达式求值器),如果它是真的,则使用“??”运算符来显示当前元素。这个??运算符只显示一个C++表达式。
以下是脚本和一些注释:
$$ save pointer to first element (current element)
r? $t0=${$arg1}._Myfirst
$$ save pointer to last element
r? $t1=${$arg1}._Mylast
$$ save first forever
r? $t2=@$t0
.while (@$t0 != @$t1)
{
.if (${/d:$arg2} == 0) {
$$ display element, no command provided
.printf "index %d, address %p\n", @@(@$t0 – @$t2), @$t2
?? @$t0
} .else {
${$arg2}
}
$$ advance current element
r? $t0=@$t0 + 1
}
最初的挑战是如何处理所有的向量元素。这依赖于向量有Myfirst和Mylast成员这一事实。完成后,可以对向量内容运行任意命令、打印元素、筛选元素、将它们存储在文件中,等等。
在WinDbg中显示和搜索std::vector内容的更多相关文章
- 在WinDbg中显示和搜索std::map内容
我们希望在WinDbg中自动显示.搜索和过滤std::map对象.std::vectors的脚本相对简单,因为vectors中数据的平面结构:map是更复杂的野兽.具体地说,Visual C++ ST ...
- 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)
string.vector 互转 string 转 vector vector vcBuf;string stBuf("Hello DaMao!!!");----- ...
- 在Linux的Terminal中显示文本文件特定行的内容
假设要操纵的文本文件的文件名是 textFile现在想做的事情是在不以编辑模式打开文件的情况下在终端直接提取并输出指定文本文件的指定行的内容 在终端提取指定文本文件的指定行的内容 Tool Comma ...
- scrapy爬虫,cmd中执行日志中显示了爬取的内容,但是运行时隐藏日志后(运行命令后添加--nolog),就没有输出结果了
cmd下执行scrapy爬虫程序,不报错也没有输出,解决方案 想要执行parse能够在cmd看到parse函数的执行结果: 解决方法: settings.py 中设置 ROBOTSTXT_OBEY ...
- C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案
介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...
- 使用std::vector优化点云动画显示一例
1. 准备 使用std::vector应该知道几点: (1)内存连续的容器,有点像数组 (2)与std::list相比,插入和删除元素比较慢- 因为数据迁移 (3)添加元素可能会引发内存分配和数据迁移 ...
- C++ 中的std::vector介绍(转)
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- 在指定的div中搜索内容,并滚动显示到当前搜索到的内容处
我想要的是页面中有个带滚动条的div对象,里面有很多内容,想要用js搜索到div中的某个字符串内容,然后将div的滚动条滚动到搜索到的内容处显示,自动定位.先是查找页面中的内容,然后将找到的内容创建t ...
- 【opencv】cv::Mat转std::vector<cv::Point2d> (注意两容器中数据类型的一致性)
获取cv::Mat大小: mymat.size() 获取cv::Mat指定位置的值:需指定数据类型,且注意数据类型应与存入时的数据类型一致,否则会导致不抛出异常的数据错误 mymat.at<,i ...
随机推荐
- MATLAB datenum日期转换为Python日期
摘要 MATLAB datenum时间格式参数众多,本文只简单关注 units 参数,即基准年份和计时度量(天.小时). 命令行演示在 ipython 和 Octave 中进行. 示例1:小时制,基准 ...
- K8S学习笔记之Kubernetes 配置管理 ConfigMap
0x00 概述 很多情况下我们为某一应用做好镜像,当我们想修改其中的一些参数的时候,就变得比较麻烦,又要重新制作镜像,我们是不是有一种方式,让镜像根据不同的场景调用我们不同的配置文件呢,那我们就需要用 ...
- Nginx深入详解之upstream分配方式
一.分配方式 Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式: 1.轮询 轮询是upstream的默认分配方式 ...
- 简要介绍Linux网络服务的种类
如果有人问你Linux最强大的功能是什么,你大概会回答“是网络功能”.Lmux操作系统的优势之一就是网络功能了,这包含比较稳定的系统资源分配,以及较为安全的网络防护能力,所以许多人都喜欢用它来进行网络 ...
- js计算得来的属性
计算得来的属性 如果需要使用表达式来创建属性键,那么需要使用方括号.否则属性名称不会进行计算: var obj = { 'b'+'ar': 'foo' }; // SyntaxError: missi ...
- 全面了解Cookie
一.Cookie的出现 浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的实现. 针对上述 ...
- Go语言入门——interface
1.Go如何定义interface Go通过type声明一个接口,形如 type geometry interface { area() float64 perim() float64 } 和声明一个 ...
- jsp 获取后端配置文件.properties的某个配置内容
如后端有个叫做config.properties的配置文件: sys.img=st_sp jsp中引用的方式是: <%@ page language="java" impor ...
- OSPF 高级配置
这是一个综合的实验,包含了静态路由.默认路由.RIP.OSPF四种路由.通过配置,最终实现全网互通. 实验拓扑 如图所示连接,地址规划如下: 名称 接口 IP地址 R1 f0/0 192.168.10 ...
- ElasticSearch(十三):Spring Data ElasticSearch 的使用(三)——NativeSearchQuery 高亮查询
在Elasticsearch的实际应用中,经常需要将匹配到的结果字符进行高亮显示,此处采取NativeSearchQuery原生查询的方法,实现查询结果的高亮显示. /** * 高亮查询 */ @Te ...