这是我第一次提出问题,而且我会事先承认,在用户模式调试方面,我是一名新手。这就是我要做的事情:
我已经通过使用!dae
获得了例外和计数,并且我选择了一个具有callstack的例外和计数。我想查看哪些参数传递给此callstack中的函数,因此我假设我需要切换到包含此异常的线程并使用{{1来查看参数地址命令。
我已经尝试了kb
命令,虽然它确实列出了主题,但在'异常'下面没有例外。列。
答案 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似乎是合适的。