在 Process Explorer 中调试 RtlUserThreadStart

2024-05-03

我有一个基于 3.5 构建的多线程 wpf 应用程序。当我通过 Process Explorer 查看正在运行的线程时,我看到 8 个线程都具有相同的起始地址 ntdll.dll!RtlUserThreadStart,并且所有 8 个线程的 CPU 值在 3-6+ 之间,并且具有较高的周期增量。我无法弄清楚这些线程在做什么。它总是相同的线程。它在应用程序的同一实例中永远不会变化。当我同时调试应用程序并暂停调试器时,所有这些线程都显示堆栈的一行 System.Threading.ConcurrencyScheduler.Scheduler.WaitForWork() 或 System.Threading.Monitor.Wait()。

我启用了 Visual Studio 的符号文件,并且在这些线程上看到以下堆栈:

System.Threading.Monitor.Wait() Normal
mscorlib.dll!System.Threading.Monitor.Wait(object obj, int millisecondsTimeout) + 0x19     bytes
System.Threading.dll!System.Threading.ConcurrencyScheduler.Scheduler.WaitForWork() + 0xd0 bytes  
System.Threading.dll!System.Threading.ConcurrencyScheduler.InternalContext.Dispatch() + 0x74a bytes
System.Threading.dll!System.Threading.ConcurrencyScheduler.ThreadInternalContext.ThreadStartBridge(System.IntPtr dummy) + 0x9f bytes     

当我查看进程监视器内线程上提供的堆栈时,我看到以下示例:

0  ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
1  ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
2  ntoskrnl.exe!KeWaitForSingleObject+0x19f
3  ntoskrnl.exe!_misaligned_access+0xba4
4  ntoskrnl.exe!_misaligned_access+0x1821
5  ntoskrnl.exe!_misaligned_access+0x1a97
6  mscorwks.dll!InitializeFusion+0x990b
7  mscorwks.dll!DeleteShadowCache+0x31ef

or:

0  ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
1  ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
2  ntoskrnl.exe!KeWaitForSingleObject+0x19f
3  ntoskrnl.exe!_misaligned_access+0xba4
4  ntoskrnl.exe!_misaligned_access+0x1821
5  ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x93d
6  ntoskrnl.exe!KeWaitForMultipleObjects+0x26a
7  ntoskrnl.exe!NtWaitForSingleObject+0x41f
8  ntoskrnl.exe!NtWaitForSingleObject+0x78e
9  ntoskrnl.exe!KeSynchronizeExecution+0x3a23
10 ntdll.dll!ZwWaitForMultipleObjects+0xa
11 KERNELBASE.dll!GetCurrentProcess+0x40
12 KERNEL32.dll!WaitForMultipleObjectsEx+0xb3
13 mscorwks.dll!CreateApplicationContext+0x10499
14 mscorwks.dll!CreateApplicationContext+0xbc41
15 mscorwks.dll!StrongNameFreeBuffer+0xc54d
16 mscorwks.dll!StrongNameFreeBuffer+0x2ac48
17 mscorwks.dll!StrongNameTokenFromPublicKey+0x1a5ea
18 mscorwks.dll!CopyPDBs+0x17362
19 mscorwks.dll!CorExitProcess+0x3dc9
20 mscorwks.dll!TranslateSecurityAttributes+0x547f
21 mscorlib.ni.dll+0x8e6bc9

作为此项目的附加说明。我的电脑是4核的单CPU。当我们在 4 核双 CPU 上运行相同的应用程序时,我们会看到线程数量从 8 增加到 16。


不幸的是,您的问题记录不足,但合理的猜测是您似乎使用了 PPL 库。它保留了一个线程池来完成并行作业。毫无疑问,您会看到较高的 CPU 周期计数,因为这些线程确实正在执行您要求它们执行的工作。

与线程池的典型情况一样,PPL 保留这些线程以供下一个作业执行,这就是为什么您会看到它们在 WaitForWork() 上等待。由于缺少调试符号,本机堆栈跟踪是垃圾。否则,RtlUserThreadStart 是一个 Windows 函数,您将始终在非托管堆栈跟踪中看到它,这就是线程的启动方式。

这都是完全正常的。唯一值得注意的其他信息是这个答案 http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/8542425d-db3e-4334-9cdd-3ff0f5911f24微软员工发帖:

并发运行时缓存线程以供以后重用。仅当所有并发运行时调度程序都已关闭时,它们才会被释放。 (通常,进程中只有一个默认调度程序)。当将工作排队到调度程序的所有外部线程都退出时,调度程序将关闭。因此,如果主线程调度工作(例如通过从 main() 调用parallel_for),那么默认调度程序将仅在进程关闭时被删除。

缓存线程数有上限。它大约是机器上核心数量的 4 倍(尽管还有一些其他因素影响阈值,例如调度程序策略中的堆栈大小选项)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Process Explorer 中调试 RtlUserThreadStart 的相关文章

随机推荐

  • 将表情符号列表替换为其图像

    我有一个数组 emoticons smile1 gif smile2 gif D smile3 gif 然后我有一个带有文本的变量 var text this is a simple test 和一个带有网站 url 的变量 var url
  • 同位素网格+角印去除空白,排序逻辑

    这个问题与这个旧问题有关 同位素网格布局使用空白空间 https stackoverflow com questions 11612399 isotope grid layout use empty space 这是我正在使用的小提琴 ht
  • 如何使用过程填充数据库

    我有大约 15 个不同的表 其中填充了不同的数据和不同的实体关系 我需要创建一个脚本 用这些表的内容填充我的数据库 脚本完成后 我使用 sqlplus 在 cmd 中运行它 然后使用 START文件路径 我有两个不同的 sql 文件 一个名
  • Python C-Api 线程问题

    我正在编写一个 C 程序 它使用用 python 编写的网络库 我将 python lib 与 python C api 一起嵌入 该库异步发送所有请求 并在请求完成时通过信号通知我 这意味着理论上 实际上我有两个与线程相关的问题 从 c
  • 现代正则表达式引擎可以解析什么样的形式语言?

    人们有时会说 你不能用正则表达式解析 X 因为 X 不是正则语言 然而 根据我的理解 现代正则表达式引擎可以匹配的不仅仅是正则语言乔姆斯基的感觉 http en wikipedia org wiki Chomsky hierarchy 我的
  • Android:Google 登录令牌无效

    我通过 Android 中的 google 登录收到的令牌收到错误 error invalid token error description 无效值 我还注意到 与我在 iOS 中获得的令牌相比 我的令牌看起来有点短 ya29 4AFYx
  • Laravel 关注者/关注关系

    我正在尝试在 laravel 中制作一个简单的关注者 关注系统 没什么特别的 只需单击一个按钮即可关注或取消关注 并显示关注者或关注你的人 我的问题是我不知道如何建立模型之间的关系 这些是迁移 用户迁移 Schema create user
  • Shell 执行将窗口置于前面

    我正在使用此函数从我的 MSI 调用可执行文件 然而 可执行文件的窗口隐藏在我的 MSI 窗口后面 有什么办法可以把它带到前面吗 我尝试在调用之前最小化所有窗口ShellExecute但这仍然没有将可执行窗口带到前面 extern C UI
  • typescript 扩展不需要的接口

    我有两个接口 interface ISuccessResponse Success boolean Message string and interface IAppVersion extends ISuccessResponse OSVe
  • 有 PostSharp 替代品吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我必须放弃使用 PostSharp 因为它不适用于混淆 合并的程序集 至少 我没有看到任何方法让它工作
  • 如何在 Python 3.x 中删除字符串末尾的数字?

    我想从字符串末尾删除数字 但我不知道 Can the split 方法工作 我怎样才能做到这一点 初始字符串看起来像asdfg123 而我只想asdfg反而 感谢您的帮助 不 split 不起作用 因为 split 只能与要分割的固定字符串
  • 从vue中的api加载路由

    我正在尝试从我的 API 在 Vue 应用程序中加载路由 我尝试将数据推送到路由变量并使用 addRoutes 方法 但没有运气 我认为异步可能存在问题 但为什么 addRoutes 不起作用 这是我的代码 import Vue from
  • 如何使用界面生成器在 UITableView 中设置水平滚动?

    我的应用程序中有 UITableView 有 2 列 我可以阅读第 1 列和第 2 列的一半 我的问题是 我们可以使用 uitableview 中的界面生成器添加水平滚动 以便我可以读取表中所有单元格的第 2 列吗 我们是否也必须为此添加一
  • 为什么 Task.WhenAny 没有抛出预期的 TimeoutException?

    请注意以下简单代码 class Program static void Main var sw new Stopwatch sw Start try Task WhenAny RunAsync GetAwaiter GetResult ca
  • PHP/MySQL/jQuery 记录的悲观锁定

    我一直在考虑为我参与的应用程序开发一些简单的记录锁定 有一些用户实际上需要花费几个小时才能完成记录的编辑 当其他人想要更改记录时 这会导致问题 目前不涉及锁定 我不确定乐观锁定在我的情况下是否可靠 因为记录是通过 AJAX 请求保存的 我正
  • C++ 中类定义的顺序

    我这里有点问题 我试图定义几个类 其中一些是玩家 一些是属于玩家的 Pawn 来自 Python 我习惯于能够通过 Pawn 方便地访问 Pawn 拥有的 Player 以及通过 Player 访问 Player 的 Pawn 如果我错了请
  • android logcat 记录闲聊模块行过期消息

    我收到很多与我的应用程序相关的此类 logcat 消息 11 19 19 04 23 872 3327 3440 I chatty uid 10085 com xxxx yyy expire 18 lines 这些日志消息是什么 我在这里缺
  • 如何使用索引优化 InnoDB 上的 COUNT(*) 性能

    我有一个较大但狭窄的 InnoDB 表 有大约 9m 条记录 正在做count or count id 桌子上的速度非常慢 6秒以上 DROP TABLE IF EXISTS perf2 CREATE TABLE perf2 id int
  • 如何选择按范围分组的值的计数

    斯塔克万岁 我需要选择按范围分组的值的计数 举例来说 假设我在表列中有以下值 1 2 4 5 6 8 9 11 13 16 然后 我想检索 5 范围内它们的计数 如下所示 From 0 to 4 there is 3 values 1 2
  • 在 Process Explorer 中调试 RtlUserThreadStart

    我有一个基于 3 5 构建的多线程 wpf 应用程序 当我通过 Process Explorer 查看正在运行的线程时 我看到 8 个线程都具有相同的起始地址 ntdll dll RtlUserThreadStart 并且所有 8 个线程的