windbg :查看局部变量值

news2024/9/24 13:22:20

查看变量有以下几种常用方式:

仍以我们上篇 : 《windbg : x 命令》中的代码作为示例来讲解使用。

源码:

#include <iostream>

using namespace std;

struct JKGirl{
    std::string name;
    int age;
    
    friend ostream& operator <<(ostream& o,const JKGirl& that)
    {
        return o << that.name << " is " << that.age << " years old.";
    }
};


int factorical(unsigned int n){
    
    static int result = 1;
    
    if(n <= 0 ) return result; // 递归结束条件
    
    result *= n;    // 算子
    
    return factorical(--n) ; // 递归
}

int main()
{
    
    int num = 20;
    double f = 30.25;
    
    int result =  factorical(3);
    
    cout << result << endl;
    
    
    JKGirl girl = {"Anna",18};
    cout << girl << endl;
    
    
    return 0;
}


一、通过windbg “局部变量”窗口查看

“局部变量”窗口显示有关当前范围内所有局部变量的信息。

若要打开或切换到“局部变量”窗口,请在“WinDbg”窗口中的“ 视图 ”菜单上,选择“ 局部变量”。 (还可以按 Alt+3 或选择工具栏上的 “局部变量 ”按钮。Alt+SHIFT+3 关闭“局部变量”窗口。)

在这里插入图片描述
忽略左侧乱七八糟的加密字符串,这是博主电脑加密,导致源码显示乱码的问题。(摸鱼被你们发现了~)

在这里插入图片描述

二、通过在“调试器命令”窗口中输入 dv 命令或 dt 命令来查看局部变量和参数

0:000> dv
            num = 0n20
           girl = struct JKGirl
              f = 30.25
         result = 0n6

通过dv指令,查看当前栈上的所有局部变量的值
通过dt 变量指令,查看指定局部变量的数据类型

dv指令貌似直接给我们显示了当前栈上的部分局部变量的信息,为什么是部分呢?这个结构体变量 girl = struct JKGirl 它只告诉了我这是一个结构体,没具体显示每个成员的值啊,咋整?

结构体变量值的查询

我们采用如下指令可以具体查询结构体变量的值:
先通过dt指令获取结构体变量的地址

0:000> dt girl
Local var @ 0xe32d6ffad8 Type JKGirl
   +0x000 name             : std::basic_string<char,std::char_traits<char>,std::allocator<char> >
   +0x028 age              : 0n18

现在我们拿到了girl变量的地址 0xe32d6ffad8,注意往下看,同时显示了girl中两个成员变量的地址偏移。
girl.name 的偏移是 0x000,首地址即首个成员变量的地址
girl.age 的偏移是 0x028,那么girl.age 可以通过地址0xe32d6ffad8+0x028进行访问

拿到了变量的地址,那这件事就好办了。

我们通过dx指令来访问目标地址。

0:000> dx -r1 (*((WD01!JKGirl *)0xe32d6ffad8))
(*((WD01!JKGirl *)0xe32d6ffad8))                 [Type: JKGirl]
    [+0x000] name             : "Anna" [Type: std::basic_string<char,std::char_traits<char>,std::allocator<char> >]
    [+0x028] age              : 18 [Type: int]

这里我们使用了 dx -r1 递归显示变量girl的所有成员。
比较看看,如果使用 dx -r2会怎样?

0:000> dx -r2 (*((WD01!JKGirl *)0xe32d6ffad8))
(*((WD01!JKGirl *)0xe32d6ffad8))                 [Type: JKGirl]
    [+0x000] name             : "Anna" [Type: std::basic_string<char,std::char_traits<char>,std::allocator<char> >]
        [<Raw View>]     [Type: std::basic_string<char,std::char_traits<char>,std::allocator<char> >]
        [size]           : 0x4 [Type: unsigned __int64]
        [capacity]       : 0xf [Type: unsigned __int64]
        [allocator]      : allocator [Type: std::_Compressed_pair<std::allocator<char>,std::_String_val<std::_Simple_types<char> >,1>]
        [0]              : 65 'A' [Type: char]
        [1]              : 110 'n' [Type: char]
        [2]              : 110 'n' [Type: char]
        [3]              : 97 'a' [Type: char]
    [+0x028] age              : 18 [Type: int]

简单说一下,dx -r1是简单打印模式; dx -r[n>1]是详细模式。

如果需要查看指定结构体成员的值,可以通过 dx 变量.成员变量的方式 来查看,如下示例:

0:000> dx girl.name
girl.name                 : "Anna" [Type: std::basic_string<char,std::char_traits<char>,std::allocator<char> >]
    [<Raw View>]     [Type: std::basic_string<char,std::char_traits<char>,std::allocator<char> >]
    [size]           : 0x4 [Type: unsigned __int64]
    [capacity]       : 0xf [Type: unsigned __int64]
    [allocator]      : allocator [Type: std::_Compressed_pair<std::allocator<char>,std::_String_val<std::_Simple_types<char> >,1>]
    [0]              : 65 'A' [Type: char]
    [1]              : 110 'n' [Type: char]
    [2]              : 110 'n' [Type: char]
    [3]              : 97 'a' [Type: char]
0:000> dx girl.age
girl.age         : 18 [Type: int]

ok,到这里就解决了我们在调试过程中查看结构体成员变量的难点


扩展讲讲 dx 指令

windbg中,dx(display expression)是一个非常强大和灵活的命令,用于显示和解析复杂的数据结构和表达式。使用dx命令,可以直接在命令行中执行表达式,并以易于阅读的方式显示结果。

dx命令的基本语法为:

dx [options] expression

以下是dx命令的一些常用选项:

  • /t:指定要显示的数据类型,例如/t MyStruct
  • /r:以递归方式显示对象的所有成员,包括嵌套结构体和指针。
  • /v:显示详细的调试信息,包括成员的偏移量和大小。
  • /g:显示全局符号,例如全局变量和函数。
  • /v:显示详细的调试信息,包括成员的偏移量和大小。
  • /f:根据指定的格式化字符串显示结果。

下面是一些例子,以演示dx命令的用法:

  1. 查看一个变量的值:
dx myVar
  1. 查看一个结构体的成员:
dx myStruct.Member
  1. 以递归方式查看一个结构体的所有成员:
dx /r myStruct
  1. 使用格式化字符串查看一个结构体的成员和其值:
dx /f "Member1: %i, Member2: %s" myStruct
  1. 查看一个数组变量的元素:
dx myArray[0]
  1. 查看一个指针变量的指向的结构体的成员:
dx myPtr->Member

需要注意的是,在使用dx命令之前,需要先加载符号信息,以便能够正确解析表达式和数据类型。可以使用命令.symfix.reload /f来加载符号信息。


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

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

相关文章

【机器学习300问】17、什么是欠拟合和过拟合?怎么解决欠拟合与过拟合?

一个问题出现了&#xff0c;我们首先要描述这个问题&#xff0c;然后分析问题出现的原因&#xff0c;找到原因后提出解决方案。废话不多说&#xff0c;直接上定义&#xff0c;然后通过回归和分类任务的例子来做解释。 一、什么是欠拟合和过拟合&#xff1f; &#xff08;1&am…

面试题:String s = new String(“xyz“) 创建了几个对象?

项目场景&#xff1a; 今天分享一篇基础技术面试题。 这个问题相信每个学习 java 的同学都不陌生&#xff0c;作为一个经典的面试题&#xff0c;到现在工作这么多年了我真是认为挺操蛋的一个问题&#xff0c;在网上到现在你仍然可以看见很多讨论这个问题的人&#xff0c;其中不…

酷开科技 | 酷开系统体育频道燃爆体育赛事,为偶像疯狂打CALL

体育竞技&#xff0c;总会带给我们激情澎湃的感受&#xff0c;兴奋、激动、热血&#xff0c;这些瞬间也许就是竞技体育的魅力&#xff01;酷开科技通过酷开系统的体育频道&#xff0c;为广大体育迷们提供了一个观赛平台。在这个平台上&#xff0c;你可以欣赏到各类体育赛事的精…

用JavaFX写了一个简易的管理系统

文章目录 前言正文一、最终效果1.1 主页面1.2 动物管理页面-初始化1.3 动物管理页面-修改&新增1.4 动物管理页面-删除&批量删除 二、核心代码展示2.1 启动类2.2 数据库配置-db.setting2.3 日志文本域组件2.4 自定义表格视图组件2.5 自定义分页组件2.6 动物管理页面2.7 …

JVM/GC复习1---更新中

JVM/GC JVMGC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器(重点)jdk1.7开始1.9默认的回收器Young GC模式Mixed GCFull GC JVM 待更新中ing GC 垃圾回收:程序运行的时候必…

2024年美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

【JSON2WEB】03 go的模板包html/template的使用

Go text/template 是 Go 语言标准库中的一个模板引擎&#xff0c;用于生成文本输出。它使用类似于 HTML 的模板语言&#xff0c;可以将数据和模板结合起来&#xff0c;生成最终的文本输出。 Go html/template包实现了数据驱动的模板&#xff0c;用于生成可防止代码注入的安全的…

一文掌握Shell

文章目录 Shell概述脚本的常用执行方式Linux中的sh解释器Linux中的/etc 编写sh脚本第一个sh脚本变量1. 系统预定义变量2. 自定义变量3. 变量定义规则单引号和双引号的区别 4. 特殊变量 运算符命令替换条件判断常用判断语句 流程控制if语句case语句while循环 read读取控制台输入…

生产、计划、仓库、质量,一大堆的工厂数据要怎么收集?MES系统替你解决!

随着制造业的发展和进步&#xff0c;工厂运营面临着越来越多的挑战&#xff0c;特别是在数据管理和生产过程控制方面。生产、计划、仓库、质量等方面的数据分散在各个系统和部门中&#xff0c;数据的收集和分析变得复杂而困难。然而&#xff0c;MES系统为工厂提供了一个综合性解…

成功安装DCNv4

最终结果 终于安装成功了。 环境 系统&#xff1a;ubuntu22.04 CUDA&#xff1a;12.1 python&#xff1a;3.11 显卡驱动&#xff1a;545 安装过程 系统、CUDA和python的安装过程忽略&#xff0c;这些都能找到。这里只写不同的地方。 配置CUDAHOME 执行命令“ gedit ~/…

余弦定理是怎么推导的?

余弦定理是怎么推导的? 已知余弦定理(low of cosines)表达如下: A B 2 = B C 2 + A C 2 − 2 B C ∗ A C ∗ cos ⁡ θ AB^2=BC^2+AC^2-2BC*AC*\cos \theta AB2=BC2+AC2−2BC∗AC∗cosθ,其中 A B , B C , A C AB,BC,AC AB,BC,AC和 θ \theta θ的关系如下: 那么这个公式是…

数据库缓存策略

数据库缓存策略 以下是数据库与缓存的五种常见策略。 1缓存旁路 缓存旁路&#xff08;Cache-Aside&#xff09; 在缓存旁路策略中&#xff0c;数据库缓存位于数据库旁边。当应用程序请求数据时&#xff0c;它会首先检查缓存 如果缓存中存在数据&#xff08;缓存命中&#xff…

风速预测 | Python基于CEEMDAN-CNN-Transformer+ARIMA的风速时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CEEMDAN-CNN-TransformerARIMA是一种用于风速时间序列预测的模型&#xff0c;结合了不同的技术和算法。收集风速时间序列数据&#xff0c;并确保数据的质量和完整性。这些数据通常包括风速的观测值和时间戳。CEEMDAN分…

SpringCloudAlibaba系列之Nacos实战

目录 注意事项 参考资源 Nacos配置中心 初始化项目 进行Nacos相关配置 运行 Nacos注册中心 dubbo方式 对外暴露接口dubbo-api 服务提供者dubbo-provider 服务消费者dubbo-consumer 负载均衡客户端方法 服务提供者 服务消费者 注意事项 不管是使用Nacos配置中心&…

使用POI生成word文档的table表格

文章目录 使用POI生成word文档的table表格1. 引入maven依赖2. 生成table的两种方式介绍2.1 生成一行一列的table2.2 生成固定行列的table2.3 table合并列2.4 创建多个table存在的问题 使用POI生成word文档的table表格 1. 引入maven依赖 <dependency><groupId>org.…

智能家居20年,从「动手」到「用脑」

【潮汐商业评论/原创】 正在装修新家的Carro最近陷入了纠结之中&#xff0c;“还没想好要怎么装一套完整的智能家居&#xff0c;家里的基装就已经开始了。” 事实上&#xff0c;Carro对智能家居也不了解&#xff0c;并不知道该如何下手&#xff0c;心想“要是能一次性设计好就…

鸿蒙常用UI效果及一些处理方式总结

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 详细使用介绍 1、Text的一些常用设置 Text(this.message).fontSize(50)//字体大小.fontColor(Color.White)//字体颜色.fontWeight(FontWeight.Bold)//字体加粗.backgroundColor(Color.Black)//背景颜色.fontStyle(…

利用Python实现科学式占卜

一直以来,中式占卜都是基于算命先生手工实现,程序繁琐(往往需要沐浴、计算天时、静心等等流程)。准备工作复杂(通常需要铜钱等道具),计算方法复杂,需要纯手工计算二进制并转换为最终的卦象,为了解决这个问题,笔者基于python实现了一套科学算命工具,用于快速进行占卜…

IDEA导出jar

1、选择导出方式 2、选择Main Class 3、构建jar

数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)七

第五部分、数组和广义表详解 数组和广义表&#xff0c;都用于存储逻辑关系为“一对一”的数据。 数组存储结构&#xff0c;99% 的编程语言都包含的存储结构&#xff0c;用于存储不可再分的单一数据&#xff1b;而广义表不同&#xff0c;它还可以存储子广义表。 本章重点从矩阵…