2017-06-14 67 views
-1

这是我第一次提出问题,而且我会承认,在用户模式调试方面,我是一名初学者。以下是我想要做的事情:如何从!DAE获取堆栈跟踪的线程ID?

我已经通过使用!dae得到了例外和计数,并且我选择了一个具有调用堆栈的例外。我想查看传递给这个callstack函数的参数,所以我假设我需要切换到包含这个异常的线程,并使用kb命令查看参数地址。

我已经尝试了!threads命令,虽然它确实列出了线程,但在“例外”列下没有显示任何例外。

+0

!dae是旧的.net 1.1 sos.dll的旧命令。这是一个古老的.net程序吗? – magicandre1981

回答

0

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

我选择了一个有一个调用堆栈

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

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

该命令将~#s螺纹:

  • ~:螺纹
  • #:有例外
  • s:选择/切换到

为了这个工作,此时必须抛出异常(继续阅读)。

使用kb命令

这是行不通的查看参数地址,因为k命令用于管理堆栈设计的原生栈,没有。对于.NET,您需要!clrstack -p。像kb一样,这只能用于真正的调用堆栈,而不能用于附加到异常的调用堆栈。

我已经试过!threads命令,虽然它列出了线程,但在“例外”列下没有任何例外。

这可能意味着你很不幸,现在不会抛出异常。

下面的命令可能有助于澄清:

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

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