这是我第一次提出问题,而且我会承认,在用户模式调试方面,我是一名初学者。以下是我想要做的事情:如何从!DAE获取堆栈跟踪的线程ID?
我已经通过使用!dae
得到了例外和计数,并且我选择了一个具有调用堆栈的例外。我想查看传递给这个callstack函数的参数,所以我假设我需要切换到包含这个异常的线程,并使用kb
命令查看参数地址。
我已经尝试了!threads
命令,虽然它确实列出了线程,但在“例外”列下没有显示任何例外。
这是我第一次提出问题,而且我会承认,在用户模式调试方面,我是一名初学者。以下是我想要做的事情:如何从!DAE获取堆栈跟踪的线程ID?
我已经通过使用!dae
得到了例外和计数,并且我选择了一个具有调用堆栈的例外。我想查看传递给这个callstack函数的参数,所以我假设我需要切换到包含这个异常的线程,并使用kb
命令查看参数地址。
我已经尝试了!threads
命令,虽然它确实列出了线程,但在“例外”列下没有显示任何例外。
正如@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似乎是合适的。
!dae是旧的.net 1.1 sos.dll的旧命令。这是一个古老的.net程序吗? – magicandre1981