- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Unix 上使用线程已有 20 年,只是在 Windows 上使用 Visual Studio 2008 学习它们。
我的应用程序是基于对话框的 MFC GUI,有四个主要的“对等”窗口(没有一个是“主”窗口)。当 MyApp::InitInstance() 启动时,Debug->Windows->Threads 窗口报告只有一个线程,MainThread。当我越过 first CDialog::Create()
调用时,创建了 3 个工作线程。我不知道这些是什么,也很想知道——尤其是想引用一本完整的解释书或网页。我尝试在 CreateThread()
上放置一个断点,但 VS2008 报告:The function cannot be found.
悬停在 !
断点中的图标上 window 。如果我中断一个调用它的函数,我也不能单步进入它。我假设它是一个系统调用,因为内核代码 VS08 无法访问它。
然后我创建一个输出音频的工作线程并设置为 THREAD_PRIORITY_TIME_CRITICAL。这已经稳定运行了很长时间。
但是,一旦我的应用程序离开 MyApp::InitInstance(),就会创建一个神秘线程,其“优先级”在“调试线程”窗口中显示为 -8。我不知道那个线程是什么。任何想法或资源指针?我尝试在 SetThreadPriority()
上放置一个断点,假设我会在任何代码中将其设置为此非 Vanilla 优先级,就像 CreateThread()
,它不是已知函数。
关于实际问题,而不是纯粹的谜团:在关闭我的应用程序时,我正在破坏并释放我使用的所有内存,并在我这样做时在这个“-8”线程中崩溃。没有源代码,只有程序集,没有堆栈跟踪或符号。程序没有提示其堆损坏,例如符号出现在其堆栈或输出窗口中。
我能想到的关于该应用程序的唯一额外信息是:
-- 它可以很好地接收 MIDI 事件并且已经使用多年
--它有一个工作线程,为一个声音缓冲区计算数据;我设置了一个哨兵 bool 标志并等待它以 GetExitCodeThread()
; 结束;我确实得到了退出代码,所以我确定这不是 -8 线程。 (无论如何它的优先级是“TimeCritical”,而不是-8)
-- 除了内存泄漏外,一切都没有问题,我现在正在使用 _CRTDBG_MAP_ALLOC
解决这个问题。如果不释放数据,我就不会崩溃。但是在找出导致问题的确切对象之后,我仍然不知所措,因为——再一次——我实际上还没有创建一个引用该对象的线程。
最佳答案
许多库(包括 MFC)都会创建额外的工作线程或线程池作为其正常操作的一部分。没什么好担心的。
如果你真的想确切地知道这些线程是在哪里创建的,你在 CreateThread
上设置断点的问题是调试器无法解析符号名称。您需要通过使用特殊语法告诉它它在哪个模块中来帮助它 {,,module}symbol
(有关 here 的更多信息)。此外,名称可能经过修饰,因此实际有效的符号名称可能是 {,,kernel32.dll}CreateThread
中的任何一个。 , {,,kernel32.dll}_CreateThread}
, 或 {,,kernel32.dll}_CreateThread@44
.同样对于 SetThreadPriority()
.
我还强烈建议将调试器配置为 use the Microsoft symbol servers ,如果你还没有。这将为您提供更多有用的 Microsoft DLL(包括 MFC)中的函数地址符号,让您更好地了解它在做什么。
也就是说,知道线程的创建位置可能对您没有帮助。由于某处的缓冲区溢出,您很可能会发生某种堆损坏。当你释放一个已经溢出的缓冲区时,损坏会变得更糟,因为堆管理器将跟随损坏的指针并开始写入内存的其他随机位置;而不释放损坏的缓冲区不太可能使进程崩溃。准确追踪堆损坏发生的位置将具有挑战性。
关于c++ - Visual Studio C++ : what's creating these threads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35393611/
我经常使用 SSMS 查询数据和构建数据集,我的 IT 部门负责数据库管理。 最近我发现了 Azure Data Studio,我喜欢: 智能感知 源代码控制(例如使用 Git) 来自社区的扩展 SQ
我想根据我使用的 visual studio 版本编译不同的东西,比如 #if VISUAL_STUDIO_VERSION > 2015 eventH?.Invoke(this, EventArgs.
我们的开发团队计划从 visual studio 2005 升级到 visual studio 2010 -- 跳过 visual studio 2008。 大部分项目是VB ASP.NET项目,使用
我的Visual Studio 2015无法构建2010平台工具集。它说: The build tools for Visual Studio 2010 (v100) cannot be found.
我目前正在使用 Visual Studio 2015 来编程 ASP.NET Core 应用程序。我对安装 Visual Studio 2017 有以下疑问: 什么被认为是最佳实践和/或最干净的方法?
尝试从扩展和更新获取 Visual Studio 扩展时,出现以下错误:- 向 visualstudiogallery.msdn.microsoft.com/Services/VStudio/Exte
这个问题在这里已经有了答案: Can Visual Studio Code and VS 2012 be installed on same computer? (1 个回答) 关闭去年。 在安装了
作为标准安装的一部分,Visual Studio Code 带有一个名为“Monokai Dimmed”的颜色主题。 有没有办法将它移植到 Visual Studio 2015?我检查了社区主题( h
我想开始编程 CUDA。 我已经安装了 Visual Studio 2010 Express。 我还安装了 nVidia nSight Visual Studio。 而且我具备所有常见的先决条件(Ne
Visual Studio Community Edition是否可以使用Visual Studio Online帐户上的存储库? 我一直为包含在Online帐户中的Visual Studio Onl
我有一个我一直在开发的应用程序,但在 android studio 上遇到了问题。当我点击“build->run”然后选择我的设备时,应用程序永远不会在我的手机上运行(并且自动出现的android-s
我正在使用Visual Studio2010。我面临的一个问题是,当我创建一个新的Web项目时,Visual Studio将创建该项目,并且不会在解决方案资源管理器中显示其解决方案。 另一件事是,我想
我通读了这里的许多帖子,却找不到一个有效的明确答案。因此,在花了一些时间使它生效之后,我认为应该发布它。 问题:发布配置文件将建立在服务器上,但不会发布。 解: 确保已安装Microsoft Wind
我正在尝试使用Visual Studio 2012构建针对.NET 3.5的C++ CLI应用程序。 通过安装Visual Studio 2008,并指定v90平台工具集,我已经在一台机器上进行了这项
我在 Microsoft Visual Studios 2013 中有一个项目,我想在 Microsoft Visual Studios 2010 中打开它。有什么简单的方法吗?还是我必须在2010年
我想知道,如果我发送一个解决方案文件夹(它是用 visual studio C# 编写的),您可以在 visual studio for mac 中打开解决方案吗? 在visual studio 20
有没有办法在 Visual Studio Code 和 Visual Studio 中设置相同的快捷方式(而不必每次都手动更改它们)? 例如,我在 Visual Studio Code 中经常使用 A
我刚开始了解 Visual Studio Code。我想知道,我可以将 Visual Studio 替换为所有 .NET 开发相关的工作吗? 我可以节省 Visual Studio 许可的成本吗? V
我安装了具有有效许可证(Visual Studio 订阅)的 Visual Studio 2019 企业版(VS 2019 16.1.4),它运行良好。 突然之间,当我尝试打开项目或项目中的任何文件时
我一直在使用 Compass 编译 Windows 环境中的 sass 文件,无论是在命令行上还是使用 Compass-app 来查看目录。 我刚刚开始使用 Visual Studio(专业版 201
我是一名优秀的程序员,十分优秀!