在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 ...
随机推荐
- Codeforces Round #588 (Div. 1)
Contest Page 因为一些特殊的原因所以更得不是很及时-- A sol 不难发现当某个人diss其他所有人的时候就一定要被删掉. 维护一下每个人会diss多少个人,当diss的人数等于剩余人数 ...
- 近3年常考的Spring面试题及答案
1. 一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? Version Feature Spring 2.5 发布于 2007 年.这是第一个支持注解的版本. Spr ...
- Linux学习笔记之Centos7 自定义systemctl服务脚本
0x00 概述 之前工作环境一直使用Centos6版本,脚本一直在使用/etc/init.d/xxx:系统升级到Cento7后,虽然之前的启动脚本也可以使用,但一直没有使用systemctl 的自定义 ...
- WebApi自定义全局异常过滤器及返回数据格式化
WebApi在这里就不多说了,一种轻量级的服务,应用非常广泛.我这这里主要记录下有关 WebApi的相关知识,以便日后使用. 当WebApi应用程序出现异常时,我们都会使用到异常过滤器进行日志记录,并 ...
- 第一次Git上传本地项目到github上 的命令
1.下载Git软件:https://git-scm.com/downloads, 2.下载之后安装就很简单了, 3.邮箱注册 在git bash界面输入如下内容即可完成邮箱的注册: $ git con ...
- 巧记 In/hasOwnProperty/for…in/for…of/forEach区别
写在前面 上面提到的这些东西,反复的记忆,反复的忘记.现分享一种巧记方法,有需要,请参考,希望你也过目不忘. 仅提供巧记思路.仅提供巧记思路.仅提供巧记思路. 1. in 用于判断属性是否在对象上(包 ...
- rem适配移动端
一.屏幕宽度 / 设计稿宽度 *100 来设置根元素的 font-size 10px = 0.10rem (function (doc, win) { var docEl = doc.docume ...
- mybatis 批量添加数据的两种实现方式
做开发的这几年期间经常遇到类似处理这种形式数据的问题,也遇到很多刚刚入行的新同学,发现他们做处理这块,经验不够,今天特地整理了一下,大家都会遇到的几种情况,代码也都粘贴出来了,拿去不谢,有时间大家还是 ...
- Mac 提示错误”xcrun: error“
错误现象: Mac 安装python模块时出现异常错误 xcrun: error: invalid active developer path (/Library/Developer/CommandL ...
- sqlserver语句随笔
替换数据:update 表名 set 列=replace(列,'要替换的数据','替换成的数据'),例子:update kers set KeyConn=replace(KeyConn,'-','/' ...