标签: sos

调试.NET CLR应用程序时,如何查看评估堆栈上的局部变量?

我正在使用Windbg(具有sos扩展),并尝试调试崩溃的应用程序。我能够转储引发异常的调用的IL,并且通过检查代码,如果可以转储评估堆栈的内容,似乎可以获得所需的信息。WinDbg&sos可以做什么?

这是我所做的:

  1. 开始WinDbg
  2. 附加到崩溃的进程
  3. loadby sos mscorwks (加载sos扩展名)
  4. !token2ee theModuleName 0600009a (其中,ModuleName是我正在调试的应用程序(和程序集)的名称,9a是Windows错误报告工具报告的崩溃方法的方法偏移量。我得到以下输出:

    模块:000e2c3c(theApplicationName.exe)
    令牌:0x0600009a方法描述
    :000e67c8
    名称:MyNamespace.MyClassName.theCulpritFn(MyOtherClass)
    JITTED代码地址:0081b1d0

  5. !dumpil 00e67c8 (为相关方法转储了IL)。这是输出:

    
    // ..
    // .. the previous code omitted for brevity
    .catch
    {
     IL_0071: stloc.0
     IL_0072: nop
     IL_0073: ldstr "Can't set CurrentServer property for: "
     IL_0078: ldarg.0
     IL_0079: ldfld MyNamespace.MyClassName::_currentServer
     IL_007e: brtrue.s IL_0087
     IL_0080: ldstr ""
     IL_0085: br.s IL_0092
     IL_0087: ldarg.0
     IL_0088: ldfld MyNamespace.MyClassName::_currentServer
     IL_008d: callvirt MyNamespace.MyOtherClass::get_Name
     IL_0092: call System.String::Concat
     IL_0097: ldloc.0
     IL_0098: newobj MyNamespace.MySpecialExceptionType::ctor …
    Run Code Online (Sandbox Code Playgroud)

debugging stack il windbg sos

6
推荐指数
1
解决办法
8214
查看次数

实时调试堆栈溢出

我有一个托管代码Windows服务应用程序,由于托管StackOverFlowException,它偶尔会在生产中崩溃.我知道这是因为我在崩溃模式下运行了adplus并使用SoS分析了故障转储.我甚至连接了windbg调试器并将其设置为"go unhandled exception".

我的问题是,我看不到任何托管堆栈或切换到任何线程.在调试器中断时,它们都被拆除了.

我不是Windbg专家,而且,除了在实时系统上安装Visual Studio或使用该工具进行远程调试和调试外,是否有人建议如何从违规线程中获取堆栈跟踪?

这就是我正在做的事情.

!线程

...

XXXX 11 27c 000000001b2175f0 b220已禁用00000000072c9058:00000000072cad80 0000000019bdd3f0 0 Ukn System.StackOverflowException(0000000000c010d0)

...

此时你会看到XXXX ID表明线程已经死了.

c# stack-overflow crash windbg sos

6
推荐指数
1
解决办法
3567
查看次数

检查内存转储中所有实例的字段

我有一个内存转储,我用它来解决客户端问题.这是一个.NET(C#)应用程序.我的应用程序的问题是正在创建特定类的太多实例.当应该有类似20的东西时,这个类有6300个实例.我想循环遍历所有这些实例并调用每个实例的名称字段.在WinDbg/SOS中有没有简单的方法呢?

我知道我可以使用!dumpheap -type {typename}来查找该类的所有实例,但我不确定如何将它们全部扩展并查看我感兴趣的字段.

.net debugging windbg sos

6
推荐指数
1
解决办法
3209
查看次数

当涉及(WPF)本机映像时,如何获得混合模式小型转储的完整堆栈跟踪?

我有一个使用WPF的混合模式C++/CLI应用程序.我们客户的崩溃报告为我们自己的服务器的小型转储.

当我尝试使用windbg sos-extension中的!pe或!clrstack命令调查minidump时,我经常从WPF程序集中获取不完整的堆栈帧信息,例如

SP       IP       Function
0013E370 564618E3 PresentationFramework_ni!Unknown+0x1bf
0013E3A4 56461258 PresentationFramework_ni!Unknown+0x58
0013E3CC 5634C6D8 PresentationFramework_ni!Unknown+0x18
0013E3D8 55C04AA2 PresentationFramework_ni!Unknown+0x502
...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,堆栈跟踪解码也变得非常慢.

使用!sym noisy显示了以下的大量消息

SYMSRV:  C:\Symbols\PresentationFramework.ni.dll\488F142Edab000\PresentationFramework.ni.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.ni.dll/488F142Edab000/PresentationFramework.ni.dll not found
DBGHELP: C:\Program Files (x86)\Debugging Tools for Windows (x86)\PresentationFramework.ni.dll - file not found
DBGHELP: PresentationFramework.ni.dll not found in c:\Windows\System32
SYMSRV:  C:\Symbols\PresentationFramework.ni.dll\488F142Edab000\PresentationFramework.ni.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.ni.dll/488F142Edab000/PresentationFramework.ni.dll not found
DBGENG:  C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\PresentationFramewo#\9519494798a88867406b5755e1dbded6\PresentationFramework.ni.dll - Couldn't map image from disk.
SYMSRV:  C:\Symbols\PresentationFramework.dll\488F142E50e000\PresentationFramework.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.dll/488F142E50e000/PresentationFramework.dll not found
DBGHELP: C:\Program Files (x86)\Debugging Tools for Windows (x86)\PresentationFramework.dll …
Run Code Online (Sandbox Code Playgroud)

.net wpf minidump stack-trace sos

6
推荐指数
1
解决办法
3224
查看次数

比较两个转储文件以报告增长最快的对象

用于调试托管应用程序如果我有两个转储文件,还是要比较这两个文件吗?我正在考虑内存泄漏的情况,如果我在不同的时间拍摄过程快照,我想知道是否有任何自动比较文件并获得某种类型的报告,哪个对象的数量和/或大小增长最快.我知道您可以通过ANT内存分析器生成这些类型的报告,但为此目的寻找任何免费的工具/脚本.

windbg sos

6
推荐指数
1
解决办法
2224
查看次数

在实时调试加载了多个CLR版本的进程时,SOS命令失败

我有一个ASP.net 2.0应用程序,我试图使用Windbg和SOS.dll进行实时调试.当我将调试器附加到进程时,我看到它加载了CLR的2.0和4.0版本.[mscorwks.dll和CLR.dll].我通过 - .loadby sos mscorwks加载我的SOS.在此之后,我的SOS命令都不起作用.我收到"无法请求线程存储","无法从系统域获取信息"等.

我了解到这是由于mscordacwks.dll与不同版本的CLR不匹配.但是我在google上使用cordll命令加载正确版本的mscordacwks的所有解决方案都无法解决我的问题.特别是,我使用过.cordll -ve -lp但似乎没有任何区别.在再次执行"!threads"后,我得到了

"CLR DLL状态:已加载的DLL C:\ WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll

无法请求线程存储"

我在stackoverflow中看到围绕这个问题的另一个条目.但幸运的是,在提出解决方案之前问题就消失了,这也不是这个条目的重复

任何线索,以帮助我使用SOS exention与2个版本的CLR加载到我的过程中将不胜感激.

MSCORDACWKS版本的加载行为如下 -

**0:033>** .cordll -e 
CLR DLL status: Loaded DLL C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll 
**0:033>** .cordll -ve -u -lp C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll
 CLR DLL status: No load attempts 
**0:033>** .cordll -e
 CLR DLL status: No load attempts
 **0:033>** !threads 
CLRDLL: Loaded DLL C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll Failed to request ThreadStore 
Run Code Online (Sandbox Code Playgroud)

windbg sos

6
推荐指数
1
解决办法
3611
查看次数

无法附加到.net 4.0中的进程

**帖子已编辑,更多信息如下

我刚刚观看了两个关于高级Dotnet调试的精彩视频(Brian Rasmussen),我正在尝试重复一些步骤,但只是不知道如何处理tis错误:

An attempt to set a processes DebugPort or ExceptionPort was made,
but a port already exists in the process.
Run Code Online (Sandbox Code Playgroud)

我在谷歌上找到了一些答案,我一般都明白错误说的是什么,但我只是不明白一个奇怪的事实:当我编译我的简单应用程序<.NET 4.0时,我可以附加电影显示,试图做在编译目标后,相同的.NET 4.0禁止我附加.

谷歌的一个答案说"尝试使用非侵入模式从windbg附加",但是......布莱恩不使用任何这样的复选框.它只适用于他的视频.

有什么不同?捕获量在哪里?是Windows 7还是Vista?也许一些不同的编译设置很重要

我正在使用带有MS SDK的MS VS 2k10和从msdn下载的Windbg x86以及正确配置到http服务器的符号.该系统是MS Vista x86.

资源(确切时间> = 8:15):http: //channel9.msdn.com/posts/MDCC-TechTalk-Advanced-NET-Debugging-part-2

编辑: 附加到从VS运行的进程时出现错误.试图附加到运行/外部VS的进程,windbg不显示任何内容.

Edit2: Windbg在我的系统中有一些令人耳目一新的问题.使用几次"Windows\[Undock | Dock all]"菜单选项,我能够看到附加过程的内容,这是缺失的.

所以现在唯一的问题是:从VS开始连接到流程时有什么不同,当它使用目标<4.0并再次= 4.0编译时?为什么当目标4.0 windbg无法以非"非侵入"模式附加到进程时.VS 2k10有什么变化?

windbg .net-4.0 sos

6
推荐指数
1
解决办法
2627
查看次数

是否可以从WinDbg/SOS调用方法

是否可以从windbg调用托管方法?是否有任何.NET等价物.call?或者如何使用它来调用托管方法?

我有兴趣将生成会话附加到生产过程(没有pdb的发布),这是不可能使用Visual Studio Debugger.

debugging methods windbg call sos

6
推荐指数
0
解决办法
919
查看次数

使用WinDbg时,是否可以在托管应用程序的源代码中设置断点?

我尝试在ac#application的源代码中使用WinDbg设置断点,但它不起作用.当我使用WinDbg时,有没有办法在托管应用程序的源代码中设置断点?

Repro步骤如下:

1.制作一个简单的c#应用程序

class Proram
{
  static void MyWrite(){
      Console.WriteLine("test");
  }
  static void Main(string[] args){
      Console.ReadLine();
      MyWrite();
  }
 }
Run Code Online (Sandbox Code Playgroud)

2.启动从WinDbg中的.NET应用程序
3.Open其源文件到的WinDbg
4.Break执行(而在该应用的ReadLine() )
5.Setup符号路径和负载sos.dll
6.Set断点在Console.WriteLine( "test")使用F9
7.执行"g"命令8.
发生错误

Unable to insert breakpoint 0 at <address>, Win32 error 0x998 
     "Invalid access to memory location."
bp0 at <address> failed
WaitForEvent failed
Run Code Online (Sandbox Code Playgroud)

我有应用程序的私有符号,所以我不认为这是一个符号相关的问题.

windbg sos

6
推荐指数
1
解决办法
1823
查看次数

如何在.net内存转储中列出正在运行的任务

我们有一个使用async/await模式的复杂ASP.Net Core应用程序.应用程序最近停止响应,我们为它进行了内存转储.我们怀疑有一些异步操作会导致应用程序卡住,但不确定是哪一个.在为Web应用程序进行内存转储后,我们可以看到很少的运行线程,因为由于使用了async/await,线程被返回到线程池.问题是,是否可以在内存转储中列出正在运行的任务,以及它们运行的​​位置,以便我可以判断哪个异步操作会使应用程序卡住?对于同步阻塞调用,它很容易 - 只列出所有活动线程的调用堆栈.但是对于异步操作,它不再起作用了.(添加更多跟踪是一种可能的方法,但情况是我们无法保证我们在应用程序及其依赖库中的每个异步操作都有足够的跟踪.)

例如,如果ASP.Net Core应用程序卡在某些代码中,如何从内存转储中告诉它?

public async Task SomeBadMethodInADependentLibrary()
{
    TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
    await tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

.net multithreading asynchronous windbg sos

6
推荐指数
1
解决办法
925
查看次数