微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windbg可以显示线程名称吗?

Windbg应该理解用于将线程名称传递给debugging器的MSexception协议 。

我无法得到这个工作。 看网上有很多例子显示“〜”线程列表没有线程名称,这就是我所看到的。 我正在debugging一个.NET x86进程,并且已经试过了Windbg的WDK 8.1 x86和x64版本。

有谁知道这个function是否仍然可用? 我错过了什么?

涉及消失项目的奇怪问题

如何在c#.net windows应用程序中检查gridview的行是否被选中

从Windows移植到Mac

无法在计算机上打开服务控制pipe理器

使用其IP地址读取远程计算机上的registry – OpenRemoteBaseKey的奇怪行为

在确定菜单项目的位置时是否有任何标准要遵循?

InvisibleOperationException隐藏窗口时

我应该在哪里为我的应用程序生成临时文件

Windows安全性自定义loginvalidation

如何将“唤醒时需要密码”上的值更改为错误编程?

对于.NET线程,以下工作适用于“普通” Thread (手动创建线程,因为我不知道如何命名线程池线程):

Thread是一个类,因此可以在.NET托管堆中找到:

0:000>.loadby sos clr 0:000> !dumpheap -stat -type Thread MT Count TotalSize Class Name ... 725e4960 11 572 System.Threading.Thread

请注意,还有其他的输出,因为!dumpheap查找类名的一部分。 然而,方法表(MT)唯一地标识了一个类,所以我们从现在开始使用:

0:000> !dumpheap -short -mt 725e4960 023123d0 02312464 02313c80 ...

这些是Thread对象的地址。 由于它是干净的输出,我们可以在一个循环中使用它:

0:000> .foreach (address {!dumpheap -short -mt 725e4960}) {.echo ${address} } 023123d0 02312464 02313c80 ...

在循环内部,我们可以使用地址来获得更多关于线程的信息。 首先,让我们来看看一个Thread如何在内部看起来像:

0:000> !do 023123d0 Name: System.Threading.Thread ... Fields: MT Field Offset Type VT Attr Value Name ... 725e3e18 400076e c System.String 0 instance 02313c0c m_Name ...

在偏移+0xC (取决于m_Name !),有m_Name成员。 这是一个字符串。 让我们来看看一个字符串的样子:

0:000> !do poi(023123d0+c) Name: System.String ... Fields: MT Field Offset Type VT Attr Value Name ... 725e4810 40000ac 8 System.Char 1 instance 4d m_firstChar

所以,字符串的第一个字符是偏移+0x08 。 .NET中的字符串是Unicode的,所以我们可以用du来查看它:

0:000> du poi(023123d0+c)+8 02313c14 "My named thread 0"

将所有这些知识组合成一个单一的命令:

.foreach (address {!dumpheap -short -mt 725e4960}) { du poi(${address}+c)+8 }

(格式化为可读性,将其全部放在一行中)

如果你这样做,你会发现它可能会输出类似的东西

00000008 "????????????????????????????????"

这发生在m_Name为null 。 如果你关心这一点,你可以添加一个检查null:

.foreach (address {!dumpheap -short -mt 725e4960}) { .if (poi(${address}+c) != 0) { du poi(${address}+c)+8 } }

(格式化为可读性,将其全部放在一行中)

其他改进:

为线程ID做同样的事情

美化输出(使用.printf而不是dd和du )

最后结果:

.foreach (address {!dumpheap -short -mt 725e4960}) { .if (poi(${address}+c) != 0) { .printf "%d ",poi(${address}+28); .printf "%murn",poi(${address}+c)+8 } }

有谁知道这个功能是否仍然可用?

是的,这个功能仍然可用。 至少对于本机应用程序。

对于.NET应用程序,从“ 如何:在托管代码中设置线程名称方法可能比抛出异常更受欢迎。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐