【问题标题】:How to get the thread ID of a stack trace from !DAE?如何从 !DAE 获取堆栈跟踪的线程 ID?
【发布时间】:2017-06-14 17:23:20
【问题描述】:

这是我第一次提出问题,我先承认我在用户模式调试方面是一个初学者。这是我正在尝试做的事情:

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

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

【问题讨论】:

  • !dae 是来自旧 .net 1.1 sos.dll 的旧命令。这是这么老的 .net 程序吗?

标签: windbg


【解决方案1】:

正如 cmets 中的 @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 似乎适合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 2010-09-22
    • 2010-11-10
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多