Tag: windbg

WinDbg:SOS.dll x86 4.0.30319.237的副本

我正在使用WinDbg来查看进程转储。 转储已在具有.NET 4 SP1(4.0.30319.237)的x86服务器上进行。 我正在尝试使用x86版本的WinDbg在我的x64机器上进行调试,但是我遇到了以下问题。 0:000> !EEVersion The version of SOS does not match the version of CLR you are debugging. Please load the matching version of SOS for the version of CLR you are debugging. CLR Version: 4.0.30319.237 SOS Version: 4.0.30319.239 4.0.30319.237 retail Workstation mode SOS Version: 4.0.30319.239 retail build 由于我的机器已采用最近的安全补丁,SOS DLL文件现在为4.0.30319.239版本,因此我无法在WinDbg中使用任何CLR扩展。 我已连接到Microsoft符号服务器并获得了正确版本的mscordacwks.dll 。 […]

反汇编托管代码问题

我正在使用Windbg使用来自sos.dll的Windbg的!U命令来组装托管代码(用C#编写,控制台应用程序)。 我发现在使用!U来组装托管函数时,反汇编的IL代码只包含我所做的函数调用,对于其余部分(非函数调用C#代码),例如a=a*2 ,以及C#中的foreach循环,只显示本机汇编语言代码,这是正确的预期行为吗? 我的问题是,我想知道是否!U能够将所有代码(除了函数调用代码)反汇编管理代码二进制DLL到IL中吗? 提前谢谢,乔治

Microsoft.NET.CoreRuntime的SOS调试扩展

在尝试使用WinDbg跟踪UWP C#/ XAML存储项目中的致命空指针语言exception(c000027b)时,由于缺少Microsoft.NET.CoreRuntime的SOS调试扩展,我无法访问CLR Exception对象。 我无法找到匹配的sos.dll。 我错过了什么? 注意:应用程序崩溃是可重现的,但仅在未进行调试时才会发生。 因此,遗憾的是,在Visual Studio调试器下运行项目不是这种情况下的解决方案。 […] 0:009> dt -a6 000001c37c6587e0 combase!PSTOWED_EXCEPTION_INFORMATION_V2 [0] @ 000001c3`7c6587e0 ——————————————— 0x000001c3`7a8c8348 +0x000 Header : _STOWED_EXCEPTION_INFORMATION_HEADER +0x008 ResultCode : 80004003 +0x00c ExceptionForm : 0y01 +0x00c ThreadId : 0y000000000000000000100001111100 (0x87c) +0x010 ExceptionAddress : 0x00007ffb`e61f24dd Void +0x018 StackTraceWordSize : 8 +0x01c StackTraceWords : 5 +0x020 StackTrace : 0x000001c3`7c658a80 Void […]

由sosex.mbp或sosex.mbm设置的断点不起作用

我正在使用VS.NET 2010.我编译了一个非常简单的.NET 4.0应用程序。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestWindbg { class Program { static void Main(string[] args) { Console.ReadLine(); Func1(); } static void Func1() { int i = 0; int j = i + 2; Console.WriteLine(j); } } } 我打开windbg 6.12.0002.633编译的可执行文件。 键入以下命令以加载sosex .loadby sosex clr 然后,键入以下命令以设置断点 !mbm TestWindbg.Program.Func1 !mbp Program.cs 16 […]

如何使用WinDBG列出所有托管线程的调用堆栈?

我有一个托管应用程序创建的转储。 我正在使用SOS / SOSEX扩展来简化我的转储分析。 我想列出所有托管线程的调用堆栈,因为我们使用本机应用程序执行~*kb 。 我们怎么做?

使用Windbg的!clrstack命令调试死锁

当我发出clrstack命令时,我得到了以下输出。 它是一个阻塞线程的callstack,它拥有一个死锁并导致死锁。 这是它的确切目的吗? 它是否有任何其他目的(没有任何参数)。 我在哪里可以获得更多信息? !clrstack OS Thread Id: 0x1b2c (6956) ESP EIP 0012f370 7c90e514 [HelperMethodFrame: 0012f370] System.Threading.Thread.SleepInternal(Int32) 0012f3c4 79299275 System.Threading.Thread.Sleep(Int32) 0012f3c8 00e0030f testlock.LockTest.Test() 0012f420 00e00146 testlock.Program.Main(System.String[]) 0012f69c 79e71b4c [GCFrame: 0012f69c]

调试C#代码时的符号问题

我正在使用WinDbg从托管代码(C#,为任何CPU构建的控制台应用程序)加载故障转储,并在x64平台上创建故障转储。 我在x64平台上进行调试。 我已将相关的PDB文件放入符号路径中。 但WinDbg总是从一个奇怪的文件夹中找到符号。 这是一个例子(当我使用时!sym noisy): SYMSRV: c:\MySymbols\FooService.pdb\4311207E2E2D442CB7473828D2488F941\FooService.pdb not found 我的应用程序称为FooService.exe ,相关的PDB文件名为FooService.pdb 。 我已将C:\MySymbols设置为符号路径,并将FooService.pdb复制到目录C:\MySymbols 。 但是为什么WinDbg在C:\MySymbols找不到FooService.pdb ,而是从一个奇怪的子文件夹“FooService.pdb \ 4311207E2E2D442CB7473828D2488F941”? 在我的场景中,为了加载PDB符号文件,最好的解决方案是什么(我必须自己手动创建子文件夹FooService.pdb\4311207E2E2D442CB7473828D2488F941 )?

如何调试托管堆中的损坏

我的程序抛出一个错误,它无法通过catch(Exception e)块处理,然后崩溃: 访问冲突损坏的状态exception。 这是奇怪的事情,因为,正如我所知,从非托管代码抛出损坏的状态exception,而在这里我在调用StringBuilder方法时得到此exception。 代码在后台线程中运行并且不时崩溃,这是不容易再现的。 所以我将WinDbg附加到进程并具有以下exception堆栈: 000000001dabd8c8 000007feea129a1d [HelperMethodFrame: 000000001dabd8c8] 000000001dabda00 000007fee90cfce8 System.Text.StringBuilder.ExpandByABlock(Int32) 000000001dabda40 000007fee90cfba4 System.Text.StringBuilder.Append(Char*, Int32) 000000001dabdaa0 000007fee9102955 System.Text.StringBuilder.Append(System.String, Int32, Int32) 000000001dabdaf0 000007ff00bf5ce3 MineUtils.Common.Strings.Strings.Replace(System.String, System.String, System.String, Boolean, Boolean) 000000001dabdb90 000007ff00bf5a59 MineUtils.Common.Strings.Strings.RemoveSubstrings(System.String, System.String, System.String, Boolean) [D:\Programs\Visual Studio 2005 Projects\MineUtils.Common\Strings\Strings.Common-Main.cs @ 1481 WinDbg显示发生此exception: EXCEPTION_RECORD: ffffffffffffffff — (.exr 0xffffffffffffffff) ExceptionAddress: 000007feea129a1d (clr!WKS::gc_heap::find_first_object+0x0000000000000092) ExceptionCode: c0000005 (Access violation) ExceptionFlags: […]

LOH碎片 – 2015年更新

有很多关于.NET LOH的信息,并且已在各种文章中对其进行了解释。 然而,似乎有些文章缺乏一点精确性。 过时的信息 在Brian Rasmussen的回答(2009年),微软的项目经理 ,他说限制是85000字节。 他还告诉我们,有一个更加奇怪的double[]案例,大小为1000个元素。 CLR团队成员Maoni Stephens(MSDN,2008)也提出了相同的85000限制。 在评论中,Brian Rasmussen变得更加精确,让我们知道它可以用85000字节的byte[] –12字节来再现。 2013年更新 Mario Hewardt(“高级Windows调试”的作者)在2013年告诉我们,如果我们告诉它,.NET 4.5.1现在也可以压缩LOH。 由于默认情况下它处于关闭状态,因此问题仍然存在,除非您已经意识到这一点。 2015年更新 我不能再重现byte[]示例了。 使用短蛮力算法,我发现我必须减去24(SOH中的byte[85000-24] ,LOH中的byte[85000-24] ): static void Main(string[] args) { int diff = 0; int generation = 3; while (generation > 0) { diff++; byte[] large = new byte[85000-diff]; generation = GC.GetGeneration(large); } Console.WriteLine(diff); } 我也无法重现double[]语句。 暴力强迫给我10622个元素作为边界(在SOH中为double[10622]在LOH中为double[10622] […]

什么是“Async Pinned Handle”?

我正在尝试调查一个非常讨厌的软件崩溃,这可能与托管堆损坏有关(因为它发生在垃圾收集期间)。 使用WinDbg和(SOS)!gshandles命令我得到类似的东西 0:000> !gchandles GC Handle Statistics: Strong Handles: 259 Pinned Handles: 137 Async Pinned Handles: 1 Ref Count Handles: 79 Weak Long Handles: 197 Weak Short Handles: 650 Other Handles: 0 Statistics: 而我只是好奇,“普通”固定手柄和“异步固定”手柄有什么区别? 我能找到哪个句柄是“异步”的吗? 我在网上找不到任何有关它的信息,因为当这个计数器正好与崩溃相关时,应用程序似乎总是崩溃。 但话说再说它可能只是垃圾收集过程中使用的一些内部东西。