【发布时间】:2020-03-13 17:02:14
【问题描述】:
我正在尝试调试 (GDB) 我在 Windows 下使用 Cygwin 开发的应用程序。 当我调试这个时,当线程被创建并且程序停止时,我得到“收到信号:?(未知信号)”。
#include <iostream>
#include <thread>
using namespace std;
void ConnectionTimer()
{
}
int main(int argc, char** argv) {
cout<<"Before thread creation"<<endl;
std::thread t( ConnectionTimer);
cout<<"After thread creation"<<endl;
t.join();
cout<<"After join"<<endl;
return 0;
}
调试器停在该行
status = NtCreateMutant (&mtx, MUTEX_ALL_ACCESS, &attr, bInitialOwner);in kernel32.cc.
它在运行模式下按预期工作,但在调试时崩溃。 运行模式的结果:
Before thread creation
After thread creation
After join
调试模式下的结果(崩溃前):
Before thread creation
任何想法我错过了什么?
编辑
如果我评论线程相关的行,它可以正常工作。
Signal caught which cause crash
配置: GDB 8.2.1-1 下 W10 上的 Cygwin 3.1.4-1,使用 g++ (GCC) 9.2.0-3 编译
【问题讨论】:
-
但在调试时崩溃 -- 如果它在调试模式下崩溃,那么您应该可以调试它。去掉线程函数内部的
cout语句,再试一次。 -
cout 仅用于示例。它在创建线程时无缘无故地崩溃。当我一步一步走时,程序甚至在进入线程函数之前就崩溃了。
-
再次,摆脱
cout声明。以“全速”运行您的程序,而不是一步一步地运行。在 MT 程序中逐步运行是一种快速解决时间问题的方法。这就是 MT 程序并非微不足道的原因之一。 -
无论有没有 cout,它实际上都可以“全速”工作。问题是我需要对使用线程作为示例的更大应用程序使用调试模式。
-
我无法使用 Visual Studio 重现该问题(在更新后的代码中)。它可以在 x64 和 x86 架构的发布和调试模式下按预期工作。也许您的编译器已经过时并且包含错误?