windbg相关内容

LOH 碎片化 - 2015 更新

有很多关于 .NET LOH 的信息,并且已经在多篇文章中进行了解释.不过,好像有些文章不够严谨. 过时的信息 在 Brian Rasmussen 的回答 (2009) 中,Microsoft 的程序经理,他说限制是 85000 字节.他还让我们知道还有一个更奇怪的 double[] 案例,其大小为 1000 个元素.相同的 85000 限制由 Maoni Stephens(MSDN, ..
发布时间:2021-12-14 08:47:11 C#/.NET

什么是“异步固定句柄"?

我正在尝试调查一个非常严重的软件崩溃,它可能与托管堆损坏有关(因为它发生在垃圾收集期间).将 WinDbg 与 (SOS) !gchandles 命令一起使用,我得到类似 0:000>!gchandlesGC 处理统计:强力把手:259固定手柄:137异步固定句柄:1参考计数句柄:79弱长柄:197弱短柄:650其他手柄:0统计数据: 我只是好奇,“正常"和“正常"之间有什么区别?固定句柄和“ ..
发布时间:2021-12-14 08:46:18 C#/.NET

如何在 WinDbg 中设置符号?

我正在使用 Windows 调试工具,但出现以下错误启动 WinDbg/cdb 或 ntsd 时的消息: 符号搜索路径为:***无效**************************************************************************************** 没有符号搜索路径,符号加载可能不可靠.** 使用 .symfix 让调试器选择一个符号路 ..
发布时间:2021-12-14 08:04:57 其他开发

如何为 .NET 进行良好的故障转储?

我捕获了在 64 位 Windows 操作系统上运行的 32 位 .NET 应用程序的故障转储.在分析过程中,有人发现我有一个 64 位转储,并告诉我由于位错误,无法分析此转储. 当使用 Windows 任务管理器创建转储时,我没有意识到我做错了什么.这始终适用于 32 位操作系统. 如何为 .NET 进行良好的转储,尤其是正确的位数? 解决方案 为什么 bitness 与此相 ..
发布时间:2021-12-02 13:25:01 C#/.NET

在内存中固定一个 DLL(增加引用计数)

我正在尝试运行一个应用程序,但该应用程序由于访问冲突而退出.在调试器中运行应用程序我可以看到这是由卸载的库引起的.我迫不及待地等待应用程序的下一个版本,所以我正在尝试解决这个问题. 我想知道 WinDbg 是否提供了一种增加加载模块的引用计数的方法,类似于 C++ LoadLibrary() 调用.然后我可以中断模块加载并增加受影响的 DLL 的引用计数,看看我是否可以使用该应用程序. ..
发布时间:2021-11-26 20:12:02 其他开发

如何调试托管堆中的损坏

我的程序抛出了一个catch(Exception e)块无法处理的错误,然后它崩溃了: 访问冲突损坏状态异常. 这很奇怪,因为据我所知,非托管代码会抛出损坏的状态异常,而在这里我在调用 StringBuilder 方法. 代码在后台线程中运行,并且不时崩溃,无法轻松重现.所以我将 WinDbg 附加到进程中,并有以下异常堆栈: 000000001dabd8c8 000007fe ..
发布时间:2021-11-26 10:50:39 C#/.NET

无法在 WinDbg 中加载 SOS

背景:我是 WinDbg 的新手,并试图让它第一次运行.我想检查从托管在 Windows Server 2008 (x86) 上的 IIS 7 中的正在运行的 ASP.NET 4 站点获取并下载到我的本地计算机的内存转储. 我安装了调试工具并首次启动了 WinDbg,打开故障转储.我去了文件|符号文件路径并将路径设置为 *srv*c:\symbols*http://msdl.microsof ..
发布时间:2021-11-26 10:42:06 其他开发

.Net 内存转储中的大量死线程

在分析 .Net4.5 WCF w3wp 进程的内存转储过程中,我遇到了许多标识为死的线程.!threads 显示 107 个线程中有 68 个已死,这似乎相当高.我想知道这些线程是否可以容纳大量内存,因为进程最终会高达 20GB+ 并且似乎永远不会停止. 我如何检查这些线程并查看这些线程持有的对象/内存?有这么多正常吗? 0:000>!threads线程数:107未启动线程:0背景主题: ..
发布时间:2021-11-25 07:18:45 C#

在 64 位机器上捕获的 32 位进程的调试转储

我最近收到了来自客户的 64 位故障转储. 我们的进程都是 32 位的,但客户的机器运行的是 x64 Server 2008. Visual Studio(2008 和 2010 Express)告诉我必须使用 MSVSMON.EXE 的 64 位版本,我不能,因为我没有 64-位机. 我很确定在 WinDbg 中有一种方法可以做到这一点,但我发现 WinDbg 具有敌意. 有 ..
发布时间:2021-11-25 06:19:30 C#

kb 为 64 位进程显示什么?

我最近在分析调用堆栈时犯了一个错误,因为我没想到应用程序是 64 位的.我使用了 WinDbg 命令 kb 来显示调用堆栈和传递给方法的参数. 在 64 位上,参数不是通过堆栈传递,而是在寄存器(RCX、RDX、R8 和 R9)中传递.似乎 WinDbg 没有或没有完全实现这一点.部分我猜这几乎是不可能的,因为寄存器值可能同时发生了变化. 但是,WinDbg 帮助仍将 kb 列为 Us ..
发布时间:2021-11-25 06:00:18 C#

我可以在 x64 WIN7 上同时安装 x86/x64 windbg 吗?

我需要分析一些 x86 转储文件,所以我想在我的电脑上安装 x86 windbg. 或者我是否可以使用 x64 windbg 来分析 x86 转储文件? 解决方案 是的,这样做是个好主意,因为您需要 32 位版本来调试 32 位应用程序/转储.所有文件都位于安装目录中,因此您可以并排安装任意数量的安装. 另外,请记住,如果您使用 64 位工具创建转储,您将获得 64 位转储 - ..
发布时间:2021-11-25 05:54:18 C#

.Net 内存转储中的大量死线程

在分析 .Net4.5 WCF w3wp 进程的内存转储过程中,我遇到了许多标识为死的线程.!threads 显示 107 个线程中有 68 个已死,这似乎相当高.我想知道这些线程是否可以容纳大量内存,因为进程最终会高达 20GB+ 并且似乎永远不会停止. 我如何检查这些线程并查看这些线程持有的对象/内存?有这么多正常吗? 0:000>!threads线程数:107未启动线程:0背景主题: ..
发布时间:2021-11-24 10:31:15 C#

Windbg 命令的每个结果作为脚本中的参数

我打算在进程转储的特定内存区域中搜索操作码. 我想在搜索时有一些条件. 喜欢:$$>script.wds #call 00400000 L?01000000 for(00400000 ~ 01000000){//这个条件是如果参数的操作码是地址不在这个区域.if(arg1 的操作码 !in 00400000 ~ 01000000).打印 arg1} 解决方案 您可以组合使用 ..
发布时间:2021-09-25 19:32:35 其他开发

Microsoft 调试符号不起作用

我尝试分析一些内存转储.但我堆叠了一些 Microsoft dll (sechost.dll) 的调试符号.我做什么: 1) !sym 嘈杂 2) .symfix 3) .sympath 我的 .sympath 是: 符号搜索路径为:srv*扩展符号搜索路径为:cache*;SRV*http://msdl.microsoft.com/download/symbols 4 ..
发布时间:2021-09-25 19:32:33 C#/.NET

windows - 我如何访问总的“用户模式堆栈跟踪数据库(ust)"?

如何访问由“gflags.exe"创建的全部“用户模式堆栈跟踪数据库",如 sql DB?否则,你能告诉我一些关于 ust DB 的 API 文档吗? 我使用“gflags.exe"调整了 +ust 标志,因此我可以获得创建内存块的堆栈跟踪. 但我想通过调用堆栈(如umdh或leakdiag)编译统计内存分配组,仅供研究.我想有一些查询 ust DB 的接口,但我找不到..有什么方法可 ..
发布时间:2021-09-25 19:32:29 C/C++开发

从符号中部分删除类型信息

正如我们最近了解到的,微软已经从ntdll 某些版本中的符号. 假设我有一个库的源代码,我想发布公共符号,但从该 PDB 中删除了一些类型定义,我将如何在技术上实现这一点,尤其是在不破坏 PDB 身份信息(时间戳和校验和)的情况下? 我在在线文档中找不到编译器开关这将允许我传递要排除的类型列表. 请注意,我不想从私有符号切换到公共符号,而是要减少公共符号. 解决方案 Wi ..
发布时间:2021-09-25 19:32:26 其他开发