gpt4 book ai didi

c++ - Visual Studio 多线程调试

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:21 25 4
gpt4 key购买 nike

我在 Visual Studio 2013 中运行此代码(调试配置):

#include <thread>
#include <stdexcept>

void c() {
/* breakpoint here*/ throw std::runtime_error("error");
}

void b() {
c();
}

void a() {

b();

}

int main(int argc, char** argv) {
std::thread thr(a);

if (thr.joinable()) thr.join();

return 0;
}

执行在断点处暂停,我看到了调用堆栈:

> DemoProj.exe!c() Line 5   C++
DemoProj.exe!b() Line 10 C++
DemoProj.exe!a() Line 16 C++
[External Code]

这太棒了!我可以清楚地看到我在执行过程中的位置。

之后,我执行了一步 (F10) 以执行此异常抛出行。当然,会抛出异常,但现在我的调用堆栈如下所示:

> msvcp120d.dll!_Call_func$catch$0() Line 30    C++
msvcr120d.dll!_CallSettingFrame() Line 51 Unknown
msvcr120d.dll!__CxxCallCatchBlock(_EXCEPTION_RECORD * pExcept) Line 1281 C++
ntdll.dll!RcConsolidateFrames() Unknown
msvcp120d.dll!_Call_func(void * _Data) Line 28 C++
msvcr120d.dll!_callthreadstartex() Line 376 C
msvcr120d.dll!_threadstartex(void * ptd) Line 359 C
kernel32.dll!BaseThreadInitThunk() Unknown
ntdll.dll!RtlUserThreadStart() Unknown

这使我的调试变得毫无用处。线路

/* breakpoint here*/ throw std::runtime_error("error"); 

只是为了这个简单的例子。在实际项目中,我不知道代码会在哪里中断。如果 Visual Studio 能够在发生错误的确切行停止执行,那将会有很大帮助。

但是,如果异常在我的主线程之外的任何地方抛出,我只会得到这些系统调用,而永远无法弄清楚我的代码中的哪一行导致了崩溃。

有什么帮助吗?

我觉得这个问题类似于this one .想法是在副线程中捕获异常并将它们传递给主线程,以便主线程可以重新抛出它们。有没有更优雅的解决方案?

最佳答案

it would be of great help if Visual Studio could stop the execution on the exact line where the error occurred.

Visual Studio 有一个选项可以在抛出异常时自动中断。在 Vs 2015 中,它是调试 -> Windows -> 异常设置。勾选 Break When Thrown 标题下的 C++ Exceptions 复选框。

这有助于找出哪些代码引发了异常。缺点是,如果您有定期抛出和处理异常的代码,您将在调试器中遇到很多意外中断。

关于c++ - Visual Studio 多线程调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41546170/

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