据称 std::thread 导致不可用的堆栈跟踪

Posted

技术标签:

【中文标题】据称 std::thread 导致不可用的堆栈跟踪【英文标题】:std::thread supposedly leading to unusable stack trace 【发布时间】:2018-08-16 08:34:20 【问题描述】:

这个问题与std::thread 的所谓劣势有关。昨天我正在随便遍历 Lyft 流行的开源分布式代理 envoy。当我研究他们的线程部分时,我遇到了一条引起我注意的评论。 comment 表示如下:

pthread 线程的包装器。我们不使用 std::thread 因为它吃异常并导致不可用的堆栈跟踪

我不确定 吃异常和不可用的堆栈跟踪是什么意思

谁能解释它的含义以及为什么std::thread 会导致不可靠的堆栈跟踪?

【问题讨论】:

【参考方案1】:

大概他们有一些自定义的异常处理机制,用堆栈跟踪记录未捕获的异常。

std::thread 被定义为捕获未处理的异常并调用 std::terminate:

如果通过抛出异常终止,则调用 std::terminate

https://en.cppreference.com/w/cpp/thread/thread

【讨论】:

【参考方案2】:

C++ 标准对 std::threads 中未捕获的异常有如下说明:

In [thread.thread.constr]:

... 如果调用 INVOKE(​DECAY_COPY(​std​::​forward(f)), DECAY_COPY(​std​::​forward(args))...) 以 未捕获的异常,应调用终止。

据此,答案

谁能解释它的含义以及为什么std::thread 会导致不可靠的堆栈跟踪?

除非在线程 proc 本身中以专用方式处理,否则线程只会在异常时终止,并且启动线程的代码堆栈不会更明智地了解所发生的事情。

【讨论】:

以上是关于据称 std::thread 导致不可用的堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章

NullPointerException 堆栈跟踪在没有调试代理的情况下不可用

为啥 std::thread 缺少基本功能? [关闭]

std::thread 导致程序中止

如何使用 std::thread?

.NET 发布模式构建中是不是提供堆栈跟踪信息?

std::thread 导致应用程序中止并出现错误 R6010