【问题标题】:std::thread crash in Debug mode (Work in run) with Netbeans/Cygwin使用 Netbeans/Cygwin 在调试模式(运行中工作)下 std::thread 崩溃
【发布时间】: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 (&amp;mtx, MUTEX_ALL_ACCESS, &amp;attr, bInitialOwner);in kernel32.cc.

它在运行模式下按预期工作,但在调试时崩溃。 运行模式的结果:

Before thread creation
After thread creation
After join

调试模式下的结果(崩溃前):

Before thread creation

任何想法我错过了什么?

编辑

如果我评论线程相关的行,它可以正常工作。

Call Stack

Signal caught which cause crash

Discard

配置: 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 架构的发布和调试模式下按预期工作。也许您的编译器已经过时并且包含错​​误?

标签: c++ netbeans gdb cygwin


【解决方案1】:

我找到了崩溃的原因。

我的防病毒软件 (Trend) 阻止了该程序,我不得不为 exe 创建一个例外,现在一切正常。

【讨论】:

猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 2019-09-11
  • 2014-06-07
  • 2020-02-13
  • 2020-01-26
相关资源
最近更新 更多