gpt4 book ai didi

c++ - Visual Studio C++ : what's creating these threads?

转载 作者:行者123 更新时间:2023-11-30 02:33:29 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com