对于 64 位进程,kb 显示什么?

2023-11-23

我最近在分析调用堆栈时犯了一个错误,因为我没想到该应用程序是 64 位的。我使用了WinDbg命令kb显示调用堆栈和传递给方法的参数。

在 64 位上,参数不是通过堆栈传递,而是通过寄存器(RCX、RDX、R8 和 R9)传递。看来WinDbg还没有或者没有完全实现这一点。部分我认为这几乎是不可能的,因为寄存器值可能同时发生了变化。

然而,WinDbg帮助仍然列出了kb作为有效命令User-Mode, x64 Processor。因此我的问题是:

什么是kb显示 64 位用户模式进程?该输出何时/如何有用?


WinDbg 中 kb 和 kv 中显示的“Args to Child”输出始终非常可疑,即使在 x86 上,这些列也不一定会显示函数的参数。

在 x86 上,“Args to Child”只是 [EBP+0x08]、[EBP+0x0C] 和 [EBP+0x10](kv 显示四个参数,因此最后一列是 [EBP+0x14])。只有在以下情况下,这些才是函数的参数:

  1. 该函数使用EBP帧
  2. 该函数具有堆栈传递参数(取决于调用约定)
  3. 优化器没有将这些位置重新用于其他用途

在 x64 上,正如您所指出的,函数的前四个参数是通过寄存器传递的。但是,作为调用约定的一部分,调用者需要在堆栈上为每个参数分配“Home”(或“Spill”)空间。这个空间是always已分配,即使被调用函数采用的参数少于四个。然后,被调用的函数可以以任何它选择的方式自由使用这个 Home Space,它可以:

  1. 忽略它
  2. 在那里保存非易失性寄存器
  3. “Home”寄存器将参数传递到堆栈上

kb 和 kv 输出按顺序显示主空间(RCX Home、RDX Home、R8 Home、R9 Home)。最常见的是,这个空间将用于上面的 1 或 2,因此它实际上与传入的参数没有任何关系。但是,在调试版本中,编译器会立即将传入的参数归入本地,以使调试更容易。

例如,下面是一个带有两个参数的函数的序言,该函数编译为 Debug。请注意参数的归位作为第一个指令:

0:000> u DriverEntry
mov     qword ptr [rsp+10h],rdx
mov     qword ptr [rsp+8],rcx
push    rdi
sub     rsp,0C0h

并将相同的代码编译成Release,使用Home Space进行非易失性寄存器保存:

0:000> u DriverEntry
mov     qword ptr [rsp+8],rbx
mov     qword ptr [rsp+10h],rdi
push    rbp
lea     rbp,[rsp-57h]
sub     rsp,0B0h

这意味着主空间在获取函数参数方面通常毫无用处。但是,它仍然可以用作调试辅助工具,在函数入口处重建非易失性寄存器值(即我可以通过查看 Home Space 告诉您上面的 RBX 或 RDI 的值)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于 64 位进程,kb 显示什么? 的相关文章

  • 如何让 ipdb 在调试时显示更多行上下文?

    默认情况下 在 IPython 中调试期间 ipdb http pypi python org pypi ipdb显示代码中当前位置的上方一行和下方一行 有没有简单的方法可以让显示的区域更大一点 我认为它是可配置的 但一直无法找到它 您可以
  • 调试 Littler/Rscripts

    我该如何调试Rscripts从命令行运行 我目前正在使用getopt包来传递命令行选项 但当出现错误时 我很难 看看到底出了什么问题 交互式调试R 因为脚本需要命令行选项 有人有示例代码并愿意分享吗 您可以使用 args 将命令行参数传递到
  • 如何在没有 IDP 会员资格的情况下直接将 iPhone 应用程序部署/调试到 iPhone 设备?

    你能告诉我如何使用 xcode 部署 调试 iphone 应用程序 但无需支付 99 美元 我这样做是为了学习目的 我看过一个指南 可以帮助将 iphone 应用程序部署到 iPhone 设备 例如 http www vinodlive c
  • Chrome控制台网络中的“发起者其他”是什么?

    当有人在我们的网站上进行转化以进行报告和分析时 我会触发图像标签 img src https example evyy net conv somechannel cats cid 3790 oid 123 cat1 premium sku1
  • CLion 中的 GDB 监视器命令

    我正在尝试使用远程 GDB 调试嵌入式项目 我的系统 目标 ARM Cortex M0 SEGGER J Link GDB Server V6 10 命令行版本 臂 无 eabi gdb 7 10 1 20160616 cvs CLion
  • 使用 eclipse 调试 OpenJDK 源代码

    在我的项目中 我想使用 eclipse 调试 OpenJDK 版本 8 的 C C 源代码 为此 我做了以下工作 编译了 OpenJDK8 with debug level slowdebug使用这个readme http hg openj
  • 从 gdb 设置 std::string 变量值?

    是否有可能 当调试器在断点处停止时 修改 std string 变量的值 而不需要采取诸如调整当前缓冲区的内存映像之类的黑客手段 例如类似于 set var mystring hello world 试试这个 经过测试并且对我有用 call
  • Xcode 在调试版本中是否有自动设置的宏?

    所以我可以写这样的代码 ifdef whatever do stuff that will never show up in the production version endif 默认情况下没有什么用处 但您可以设置DEBUG用于调试构
  • 启动时暂停 Windows 10 应用商店应用程序

    我正在用 C 编写一个工具来帮助调试和测试已部署的 Windows 10 应用商店应用程序 我遇到的问题之一是我需要一种方法来启动处于挂起状态的商店应用程序 以便我可以在应用程序初始化之前附加调试器 我知道执行此类操作的通常方法是在父进程中
  • iOS 中的胖二进制文件

    是否有可能为 iOS 构建 32 位和 64 位 胖 二进制文件 我的理解是 这即将到来 但我在 Xcode 的最新更新中看不到明显的方法来做到这一点 我希望我的应用程序在 5S 上以 64 位模式运行 在 5 及以下版本上以 32 位模式
  • 如何在 Ubuntu x64 中使用 ptrace 插入 int3?

    我正在努力追随本指南 http eli thegreenplace net 2011 01 27 how debuggers work part 2 breakpoints 通过设置断点达到相同的结果 唯一的区别是我在 x64 系统上 所以
  • 该模块的调试信息中缺少源信息 - PDB 已成功加载

    Visual Studio 加载正确的 PDB 文件 但无法找到解决方案中任何内容的源信息 我尝试过的事情 清理 重新启动 重新生成项目 CMake 重建 检查模块窗口以确保 PDB 已加载 确实如此 解决方案属性下的 调试源文件 设置混乱
  • 如何调试 MySQL 存储过程?

    我当前的调试存储过程的过程非常简单 我创建一个名为 debug 的表 在存储过程运行时从其中插入变量值 这允许我查看脚本中给定点的任何变量的值 但是有没有更好的方法来调试 MySQL 存储过程 下列debug msg可以调用过程来简单地将调
  • static_assert 有什么作用,你会用它做什么?

    你能举个例子吗static assert C 11 会优雅地解决手头的问题吗 我熟悉运行时assert 我应该选择什么时候static assert 超过常规assert 另外 在boost有一种东西叫做BOOST STATIC ASSER
  • 如何调试 EF5 在运行时生成的 SQL?

    所以我对 EntityFramework 还很陌生 实际上现在处于 POC 阶段 我试图回答的问题之一是如何通过调试器或其他进程可附加工具可视化 EF 生成的查询 我试图解决的情况是 在尝试调试 QA 或生产问题时 开发人员需要能够通过远程
  • 如何在 vb.net 中使用 Stacktrace 返回错误行号

    我正在尝试创建某种错误捕获方法来返回错误行号 当进程中止时 我们会发送一封中止电子邮件 该电子邮件为我们提供了错误号 and 错误描述但我想知道实际上哪里出了错误 我知道你可以执行以下操作 1 code here 2 code here 3
  • iPhone——是否可以在 Xcode 调试器中检查 UIView 的框架?

    当调试器在断点处停止时 我在那里找不到任何 UIView 的框架 是否有可能做到这一点 编辑 由于缺乏回应而开始赏金 需要明确的是 我正在寻找一种在不添加额外调试代码的情况下查看框架的方法 另外 如果答案是 不 你不能这样做 赏金将用于解释
  • Visual Studio:如何正确构建和指定 x64 和 x86 的配置和平台

    使用 Visual Studio 2012 Professional 和 Ultimate 以及所有最新更新 如何正确指定配置和平台以正确构建 x86 和 x64 当您第一次创建 Winforms 应用程序时 Visual Studio 会
  • 在调试模式下单步执行时跳过方法的属性

    是否有一个属性可以在方法上使用 以便在调试模式下单步执行某些代码时 调试器保持在方法的外部 DebuggerStepThrough docs https learn microsoft com en us dotnet api system
  • 我如何解释这个 JVM 错误?

    我有一个使用一些本机代码的 Java 应用程序 但它出现了错误 我想知道where它有错误 但我不确定如何读取 hs err pid 转储文件 Native frames J compiled Java code j interpreted

随机推荐

  • iOS 11 禁用密码自动填充附件视图选项?

    截至目前 我想选择退出 iOS 11 提供的新选项 即在应用程序中建议密码 当我在 iOS 11 上运行该应用程序时 我在键盘顶部看到自动填充选项 但我的用户名和密码文本字段甚至不显示 所以 我的问题是 如何一起禁用新密码自动填充功能 以便
  • WPF 中的 DialogResult 与FolderBrowserDialog

    我第一次在 WPF 中实现FolderBrowserDialog 但我一点也不喜欢它 除了我发现我的项目中没有引用 Windows Forms 的问题之外 现在我在尝试查看 DialogResult 返回值是什么时遇到了麻烦 对于 Open
  • MSBuild如何找到Delphi搜索路径?

    如果我启动 RAD Studio 命令提示符并运行 msbuild t Rebuild 在项目目录中 msbuild 将显示调用 dcc32 的完整命令行 包括所有路径设置 MSBuild 使用哪种魔法来根据 IDE 设置 存储在注册表中
  • 多次加密(MD5)可以提高安全性吗?

    我看到有人用 MD5 对用户密码进行多次加密以提高安全性 我不确定这是否有效 但看起来不太好 那么 这有意义吗 我们假设您使用的哈希函数是一个完美的单向函数 然后你可以像查看它的输出一样查看它的输出 随机神谕 其输出值在有限的值范围内 MD
  • Titanium appcelerator 是否值得在 ipad、iphone 和 android 上开发基于相机的应用程序? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我想构建一个手机 平板电脑应用程序 其核心功能是用相机拍照 查看图片和接收通知 我还想针对 iphone ipad 和 android 平台 Titanium appcelerator 因
  • 如何使用 boto3 在 2 个不同帐户的 S3 存储桶之间复制文件

    我正在尝试使用 boto3 将文件从供应商 S3 存储桶传输到我的 S3 存储桶 我正在使用 sts 服务来承担访问供应商 s3 存储桶的角色 我能够连接到供应商存储桶并获取存储桶的列表 我遇到CopyObject operation Ac
  • form.reset() 是如何工作的?

    我知道form reset 会将所有表单字段重置为其默认值 但这是如何工作的呢 是浏览器的DOM实现吗 即浏览器知道上次回发 获取中从服务器发送的最后一个值是什么以及何时reset 称为浏览器重置这些值 DOM 规范tells us它 执行
  • 如何将 Magento 库存设置更改为网站范围而不是全局范围?

    我们有一个多商店设置 magento 跨多个域运行 其中一些网站是批发 B2B 网站 一些是零售 B2C 网站 我们对每个零售和批发网站有不同的价格 这在 magento 配置中很容易做到 我们这样做是因为我们强制批发客户使用购物车中允许的
  • “cout<<(char*)NULL”在这里执行“close(1)”吗? [复制]

    这个问题在这里已经有答案了 在下面的代码中我使用了cout lt lt char NULL 在这一行之后 我的程序没有在输出屏幕上打印任何内容 这是否意味着我已经做到了close 1 with cout这里 这里到底发生了什么 这是一个错误
  • 数据表更改界面语言

    我目前正在使用角度数据表 如何查看其他语言的表格界面 我的意思是西班牙语中的 显示条目 搜索 显示 20 个条目中的 1 到 10 个 文字 您需要定义这样的语言结构 丹麦实现 我在我的角度数据表应用程序中使用的 var language
  • 自动禁用特定主要模式的全局次要模式

    我已全局激活居中光标模式 如下所示 require centered cursor mode global centered cursor mode 1 它工作正常 但有一些主要模式我想自动禁用它 例如 slime repl 和 shell
  • 谷歌地图 API;禁止地图平移以启用页面滚动

    我有一个移动网页 客户可以通过表单提交或当前位置弹出窗口输入邮政编码 然后查找附近的中心 响应包括这些中心的列表以及显示其位置的谷歌地图插入以及指示列表中指示的中心的图钉 问题是地图占用了页面上的大量空间 向下滚动到地图正下方的列表很困难
  • 如何使用批处理脚本对目录中的每个文件执行多项操作

    这是这个问题的直接延伸 如何使用批处理脚本对目录中的每个文件执行某些操作 从上面我学习了如何对文件夹中的每个文件执行命令 如何对每个文件执行多个命令 我想先使用lame压缩文件 然后将原始文件移动到不同的目录 这是我到目前为止所拥有的 FO
  • 颤动 || W/DynamiteModule(4887):未找到 com.google.android.gms.providerinstaller.dynamite 的本地模块描述符类

    当我从 Firebase Firestore 获取数据时 不显示数据 这给了我这个问题 它与Firebase或其他什么有关吗 W DynamiteModule 4887 Local module descriptor class for c
  • initializer_list 不可变性质导致过度复制

    为什么可以访问std initializer list不允许我们更改其内容 这是一个很大的缺点std initializer list当将它用于其主要目的 初始化容器 时 因为它的使用会导致过多的复制构造 复制赋值 而不是移动构造 移动赋值
  • 将图形导出为 PDF 时,可以导出绘图标签中的特殊符号/西里尔字母吗?

    我正在尝试将图形列表导出为 PDF 格式的单独帧 以便随后借助外部实用程序 例如 pdf2swf 编译矢量 SWF 动画 不幸的是 导出的 PDF 文件中的一些特殊字符 例如度数符号或三点 被损坏 这也是所有俄语字母的命运 请注意 当直接从
  • 如何让线条动画更流畅?

    我正在用 Java 制作一个简单的动画 并试图使其尽可能流畅 我仅使用每个 Shape 对象的 Double 内部类 并在 Graphics2D 对象中设置抗锯齿功能 只要我只使用 fill 方法 这一切都有效 但如果我还使用 draw 方
  • 致命错误:无法将 User 类型的对象用作数组

    应用程序上的用户通过电子邮件登录 此电子邮件处于会话中 通过此会话 我尝试获取该用户的更多信息 以打印出该用户的 姓氏 姓名和头像 当我在导航栏中执行此操作时 他做得很好 但在页面本身上却出现以下错误 致命错误 无法将 User 类型的对象
  • 如何重新安装 base-R 软件包(例如统计数据、图形、实用程序等)?

    我一直在 R 3 0 1 中使用 stats 包 没有任何问题 但今天我从 R 库位置删除了 stats 文件夹 现在我无法再安装它了 我尝试对其他软件包执行相同的操作 但我可以安装除 stats 之外的所有内容 install packa
  • 对于 64 位进程,kb 显示什么?

    我最近在分析调用堆栈时犯了一个错误 因为我没想到该应用程序是 64 位的 我使用了WinDbg命令kb显示调用堆栈和传递给方法的参数 在 64 位上 参数不是通过堆栈传递 而是通过寄存器 RCX RDX R8 和 R9 传递 看来WinDb