如何从!DAE获取堆栈跟踪的线程ID?

时间:2017-06-14 17:23:21

标签: windbg

这是我第一次提出问题,而且我会事先承认,在用户模式调试方面,我是一名新手。这就是我要做的事情:

我已经通过使用!dae获得了例外和计数,并且我选择了一个具有callstack的例外和计数。我想查看哪些参数传递给此callstack中的函数,因此我假设我需要切换到包含此异常的线程并使用{{1来查看参数地址命令。

我已经尝试了kb命令,虽然它确实列出了主题,但在'异常'下面没有例外。列。

1 个答案:

答案 0 :(得分:0)

正如评论中@magicandre1981所提到的,!dae是一个旧命令,它只列出堆上可用的异常对象。其中许多例外都没有被抛出。 (该命令与!dumpheap -type Exception类似(可能不相同)。)

  

我选择了一个有callstack的人

这当然是个好主意。但是,请注意,此异常可能已被捕获并已被处理或将被捕获和处理。

  

我假设我需要切换到包含此异常的线程

该命令为~#s

  • ~:thread
  • #:异常
  • s:选择/切换到

要使其正常工作,此时必须抛出异常(继续阅读)。

  

使用kb命令

查看参数地址

这不起作用,因为k命令是为本机堆栈设计的,而不是为托管堆栈设计的。对于.NET,您需要!clrstack -p。和kb一样,这只适用于真正的callstacks,而不适用于附加到异常的callstacks。

  

我已经尝试了!threads命令,虽然它确实列出了主题,但在'异常'下面没有例外。列。

这可能意味着你不幸运,而且现在没有抛出异常。

以下命令可能有助于澄清:

  • .exr -1:获取最后一个异常。如果这给出0xE0434F4D,则抛出.NET异常。如果没有,你很不走运(可能在你的情况下)。
  • !pe:打印引发的托管异常(在您的情况下不太可能)。

因为我认为两者都不会给你你想要的结果,问题是:你如何以及何时采取崩溃转储。如果要分析崩溃,则需要在应用程序崩溃时执行故障转储。不是之前而不是之后。有关要考虑的事项,请参阅How to take a good crash dump for .NET。在您的情况下,如果您不使用未处理的异常处理程序,那么ProcDump -e命令行开关或WER LocalDumps似乎是合适的。