如何使用 dbghelp!StackWalk64 遍历混合模式(托管+本机)堆栈?

2024-01-03

我正在尝试使用 StackWalk64 在 x64 进程上遍历包含托管帧和本机帧的调用堆栈。一切工作正常,直到第一个或第二个托管帧,之后 StackWalk64 无法计算出该帧的返回地址并失败。

我使用 SymFunctionTableAccess64 进行函数表访问回调,并且符号处理程序已使用 SymInitialize() 进行初始化。我需要在 dbghelp 中做一些魔法才能让它正确地遍历托管帧吗?

失败的调用堆栈示例:

UnmanagedFrame1
UnmanagedFrame2
UnmanagedFrame3
ManagedFrame1 <----- (StackWalk64 fails after this frame)
ManagedFrame2
UnmanagedFrame4
UnmanagedFrame5
ntdll!RtlUserThreadStart

注:本题IS NOT关于如何将托管帧解析为符号/方法名称/等,我只想遍历整个堆栈,而不考虑符号解析/等。

此外,IDebugControl4::GetContextStackTrace 工作正常,但 DbgEng 使用自定义函数表回调,而不是简单地委托给 SymFunctionTableAccess64。我怀疑问题在于 CLR 使用 RtlInstallFunctionTableCallback 来安装回调函数表(指向 mscordacwks),而 SymFunctionTableAccess64 不够智能,无法遵循这一点。

我花了一些时间尝试编写一个自定义函数表访问回调来遍历函数表链并在 mscordacwks 中调用回调,但它变得非常粗略并且实际上并没有起作用。


是否SOS 调试器扩展 http://msdn.microsoft.com/en-us/library/bb190764.aspx有帮助吗?它提供了能力,从windbg and Visual Studio完全按照您希望的方式遍历堆栈。

或者.NET Framework 2.0 中的 Profiler 堆栈行走:基础知识及其他知识 http://msdn.microsoft.com/en-us/library/bb264782.aspx可能有一些用处。

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

如何使用 dbghelp!StackWalk64 遍历混合模式(托管+本机)堆栈? 的相关文章

  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐

  • 如何将 BIT2 类型链接到变量?

    In most input cardsBeckhoff 有两个变量 Limit 1 and limit 2 他们有个BIT2datatype 大小为0 2字节 即有两位 如下图所示Limit 1 Bit0 Value smaller equ
  • 如何使用 python 在 Tensorboard 上显示模型的权重和偏差

    我创建了以下模型进行训练 并希望在 Tensorboard 上将其可视化 Basic Cell LSTM tensorflow index in epoch 0 perm array np arange x train shape 0 np
  • 正则表达式在页面上查找两个单词

    我试图找到包含单词 text1 和 text2 的所有页面 我的正则表达式 text1 n text2 it doesn t work 如果您的 IDE 支持s 单线 标志 所以 字符可以匹配换行符 您可以使用以下方式搜索您的项目 text
  • 在VBA中逐像素扫描图像

    这里有一个近乎精确的问题读取图像的像素颜色 https stackoverflow com questions 16528319 read pixel colors of an image 实际上 Op 提出的问题与我所问的问题相同 但接受
  • Android - 用于语音识别的外部 MIC

    我需要知道将麦克风或耳机连接到设备时会触发哪个事件 并且我正在使用语音识别 并且观察到它不会遵循与设备未连接任何设备时相同的流程 我想知道是否有某种解决方案 因为我目前正在创建的应用程序是在智能手机中进行测试的 但将来需要连接麦克风或耳机
  • 使用 Moment,js 获取本月所有星期一日期

    有没有办法使用 moment js 库获取当月的所有星期一日期 我知道我可以通过以下方式得到月底 moment endOf month 但如何获取当前 任何月份的所有星期一日期 我不想要 javascript 默认日期库中的某些函数 请参考
  • 如何在功能组件中更改父组件的子状态组件

    我创建了一个倒计时器组件 我在这个组件附近有一个按钮 我希望当用户单击此按钮时重置计时器 为此我应该改变子状态 我找到了从孩子那里改变父母状态的解决方案 但我找不到解决方案 可以用ref解决吗 我的计时器组件是一个功能组件 React re
  • 同时验证两个字段

    我正在看这篇文档 清理和验证相互依赖的字段 https docs djangoproject com en stable ref forms validation cleaning and validating fields that de
  • 尝试加载 PDFTron Android 库时出错

    当尝试与 PDFTron 即 PDFNet Android SDK 集成时 我遇到了一个奇怪的错误 UnsatisfiedLinkError 无法加载 PDFNetC findLibrary 返回 null 预期为armv7a 发现cpu
  • UITableView:向上滑动时缩小选项卡栏和导航栏

    Scenario 我有一个应用程序 它使用标签栏控制器 屏幕底部 和导航控制器 屏幕顶部 UI 设计 在一个视图控制器上 我有一个 UITableView 其中包含用户将 向上滑动 以滚动表格以查看内容的内容 Need 很像雅虎 和 Ins
  • 在 C++ 代码执行过程中每 t 毫秒执行一次测量

    给定一个 while 循环和函数顺序如下 int k 0 int total 100 while k
  • 使用 Leap Motion 检测滑动手势方向

    我正在尝试使用 javascript API 通过 Leap Motion 简单地获取滑动手势的方向 我的代码是 document ready function controller new Leap Controller ws local
  • 验证Java中golang生成的rsa.SignPKCS1v15签名

    我试图让 Java 验证签名的 SHA 1 哈希值 但它一直返回 false 我在 Go 中有以下代码 它生成 RSA 密钥对并签名并返回到达 sign 端点的任何消息以及十六进制编码的哈希值以及公钥模数和指数 package main i
  • Python 和 PyQt:从另一个类运行函数

    更新3 这是新代码 试图按照你告诉我的去做 但没有结果 我开始认为我在程序中的某个地方做了一些非常愚蠢的事情 有什么新想法吗 程序 py coding utf 8 imports import os import platform impo
  • 如何在 SQL 中截断秒?

    我有时间 选择cast SYSDATETIME AS time 14 59 09 2834595 截断秒的方法是什么 14 59 描述 您可以使用T SQL函数convert Sample PRINT convert varchar 5 S
  • 如何证明两个 HTML 页面看起来相同?

    例如 我有这个 pre sun br nbsp nbsp nbsp nbsp mercury br nbsp nbsp nbsp nbsp venus br nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp e
  • IE8/9 中的 CSS3 动画

    我知道 CSS3 动画在 IE 中不起作用 我只是想知道 JavaScript 是否有解决这个问题的方法 这是我想在 IE 中重新创建的内容的链接 http animation kashoo co uk http animation kas
  • 多处理队列子类问题

    我想子类化 multiprocessing Queue 来实现进程以获取队列的块 唯一的问题是 我收到了一个奇怪的 TypeError usr bin env python whaaaaa from multiprocessing impo
  • Swift Combine - 等待所有发布者

    我正在尝试使用 Swift 组合来运行许多具有相同结果的任务 目前 每个任务都是一个将发出结果的发布者 现在我面临一个问题 我必须等待所有发布者发出该元素然后继续 有点像调度组 我找到了 zip 带有 运算符需要 4 个发布者 https
  • 如何使用 dbghelp!StackWalk64 遍历混合模式(托管+本机)堆栈?

    我正在尝试使用 StackWalk64 在 x64 进程上遍历包含托管帧和本机帧的调用堆栈 一切工作正常 直到第一个或第二个托管帧 之后 StackWalk64 无法计算出该帧的返回地址并失败 我使用 SymFunctionTableAcc