崩溃是导致程序完全停止的不可恢复错误的结果。
在使用XLClang ++的__cxa_end_catch中查看崩溃的一部分,我尝试对复制器进行重构以避免使用std :: exception_ptr,以查看是否会影响任何东西: #include 在使用XLClang ++__cxa_end_catch中研究carlash的一部分,我尝试重构复制器以避免使用std::exception_ptr,以查看是否会影响任何东西: #include <cstdio> #include <exception> #include <future> #include <thread> #include <vector> std::future<std::invalid_argument> GetExceptionFromDeadThread() { return std::async(std::launch::async, []() { try { throw std::invalid_argument("Some string long enough to allocate on the heap? "); } catch (std::invalid_argument e) { return e; } catch (...) { std::fprintf(stderr, "'std::rethrow_exception(future.get())' threw unexpected exception"); abort(); } }); } int main() { try { constexpr size_t numThreads(100); std::vector<std::future<std::invalid_argument>> futures; while (true) { for (size_t i = 0; i < numThreads; ++i) { futures.push_back(GetExceptionFromDeadThread()); } while (!futures.empty()) { auto& future(futures.back()); future.wait(); try { throw future.get(); } catch (std::invalid_argument&) { std::fputs(".", stdout); } catch (...) { std::fprintf(stderr, "'std::rethrow_exception(future.get())' threw unexpected exception"); abort(); } futures.pop_back(); } } } catch (...) { std::fprintf(stderr, "Caught unexpected exception"); abort(); } } 但我注意到,在Windows开发机上进行测试时(W/ Visual Studio 2022,在调试中默认创建的C ++控制台项目| X64配置),它正在崩溃!当我以为我正在研究AIX编译器/工具链的问题时,这打扰了我,但也许我做错了什么? Heap[exception_ptr_test.exe]:指定为无效的地址 rtlvalidateHeap(0000021A37BB0000,00007FFFDA43A2F0) > ntdll.dll!RtlpBreakPointHeap() Unknown ntdll.dll!RtlpValidateHeapEntry() Unknown ntdll.dll!RtlValidateHeap() Unknown KernelBase.dll!HeapValidate() Unknown ucrtbased.dll!_CrtIsValidHeapPointer(const void * block) Line 1407 C++ ucrtbased.dll!free_dbg_nolock(void * const block, const int block_use) Line 904 C++ ucrtbased.dll!_free_dbg(void * block, int block_use) Line 1030 C++ ucrtbased.dll!free(void * block) Line 32 C++ vcruntime140d.dll!__std_exception_destroy(__std_exception_data * data) Line 46 C++ exception_ptr_test.exe!std::exception::~exception() Line 91 C++ exception_ptr_test.exe!std::logic_error::~logic_error() C++ exception_ptr_test.exe!std::invalid_argument::~invalid_argument() C++ exception_ptr_test.exe!std::_Packaged_state<std::invalid_argument __cdecl(void)>::_Call_immediate() Line 494 C++ exception_ptr_test.exe!std::_Task_async_state<std::invalid_argument>::{ctor}::__l2::<lambda_1>::operator()() Line 664 C++ exception_ptr_test.exe!std::invoke<`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1> &>(std::_Task_async_state<std::invalid_argument>::{ctor}::__l2::<lambda_1> & _Obj) Line 1695 C++ exception_ptr_test.exe!std::_Func_impl_no_alloc<`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,void>::_Do_call() Line 874 C++ exception_ptr_test.exe!std::_Func_class<void>::operator()() Line 920 C++ exception_ptr_test.exe!Concurrency::details::_MakeVoidToUnitFunc::__l2::<lambda_1>::operator()() Line 2363 C++ exception_ptr_test.exe!std::invoke<`Concurrency::details::_MakeVoidToUnitFunc'::`2'::<lambda_1> &>(Concurrency::details::_MakeVoidToUnitFunc::__l2::<lambda_1> & _Obj) Line 1696 C++ exception_ptr_test.exe!std::_Func_impl_no_alloc<`Concurrency::details::_MakeVoidToUnitFunc'::`2'::<lambda_1>,unsigned char>::_Do_call() Line 878 C++ exception_ptr_test.exe!std::_Func_class<unsigned char>::operator()() Line 921 C++ exception_ptr_test.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_LogWorkItemAndInvokeUserLambda<std::function<unsigned char __cdecl(void)>>(std::function<unsigned char __cdecl(void)> _func) Line 3528 C++ exception_ptr_test.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_Init(Concurrency::details::_TypeSelectorNoAsync __formal) Line 3548 C++ exception_ptr_test.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_Perform() Line 3533 C++ exception_ptr_test.exe!Concurrency::details::_PPLTaskHandle<unsigned char,Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>,Concurrency::details::_TaskProcHandle>::invoke() Line 1475 C++ exception_ptr_test.exe!Concurrency::details::_TaskProcHandle::_RunChoreBridge(void * _Parameter) Line 171 C++ exception_ptr_test.exe!Concurrency::details::_DefaultPPLTaskScheduler::_PPLTaskChore::_Callback(void * _Args) Line 57 C++ msvcp140d.dll!Concurrency::details::`anonymous namespace'::_Task_scheduler_callback(_TP_CALLBACK_INSTANCE * _Pci, void * _Args, _TP_WORK * __formal) Line 134 C++ ntdll.dll!TppWorkpExecuteCallback() Unknown ntdll.dll!TppWorkerThread() Unknown kernel32.dll!BaseThreadInitThunk() Unknown ntdll.dll!RtlUserThreadStart() Unknown ,此外,更改为return e使崩溃消失了。 您“手动”捕获,然后按值返回一个异常对象(后来恢复返回对象)。这很容易导致双重破坏或其他细微的终身问题,尤其是如果将异常消息存储在堆分配的缓冲区中时。换句话说,您的额外应支付会导致调试CRT正确地抱怨无效的指针或指针免费。 在您的代码中,您有: return std::invalid_argument(e)按值(std :: Invalid_argument e)进行启动迫使异常对象的副本。然后,您继续前进,这是另一个副本,最终在主线程中进行std::invalid_argument。这是相同异常对象弹跳的多个副本。一些标准的图书馆实现很小的剂量可以很好,但这通常是一个坏习惯,在您的代码中,它基本上是复制一个包含大型,动态分配的字符串的例外。 Instead,尝试: catch (std::invalid_argument e) { return e; } 至少在阻止捕获块中不必要的副本。 您也可以使用return e;重新捕获您捕获的例外:throw future.get(); 对比,catch (const std::invalid_argument& e) { return e; } 总是抛出一个e。如果您的目标是保留原始异常对象(及其所有内部状态),请不要完全命名变量:只需使用throw; . 其他选项是,您也可以在same中手动存储异常,还可以利用catch (...) { // ... throw; // rethrow the same exception object } 或让throw e;做到。 在引擎盖下,copy已经能够捕获异步功能中抛出的任何例外,并将其存储为throw;。如果您希望主线程看到该异常,只需让异步函数正常投掷,当您在主线程中执行std::future时,如果异步代码会引发异常,则std::exception::ptr调用它。例如: STD:: Future GetExceptionFromDeadThread() { 返回std :: async(std ::启动:: async,[] { 投掷std :: invalid_argument(“一些字符串...”); }); }std::async结论,始终通过引用(std::async)捕获异常。如果您需要重新固定完全相同的例外,请使用std::exception::ptr而不是future.get()。重要的是,如果您可以利用get()的正常机制或int main() { auto fut = GetExceptionFromDeadThread(); try { fut.get(); } catch(const std::invalid_argument &e) { // handle } // ... } 。
PHP在Almalinux 8.10和PHP 8.4.2的WHM服务器上随机下降。它可以是什么?
上运行。 在我的一台服务器中,每个网站都随机停止工作(它们停止响应,好像站点倒塌一样),我必须重新启动“ Apache的PHP-FPM服务”才能使所有内容再次工作。
在.NET应用程序中使用status_stack_overflow do appcrash表示本机代码中发生的堆栈溢出?
我在ntdll.dll中获取带有执行代码C00000fd(status_stack_overflow)的AppCrash。 这是否意味着在我的托管代码之外,本机代码中某个地方的某个地方有堆栈溢出?因为管理...
结构类型:AWST3.Medium.
在Fedora Linux开放Spotify后的前几分钟(发生在Fedora 40上,仍然发生在Fedora 41上),它一直在通知崩溃,即使没有问题……
我正在我的笔记本电脑上使用 wamp 进行开发,并且 mysql 几周以来运行良好。今天启动 60 秒后 mysql 崩溃了,我在日志中发现以下错误: 2016-03-17T20:34:37.66202...
致命:gpu_data_manager_impl_private.cc(439)] GPU 进程不可用。再见
我正在使用 Ubuntu 18.04,并在最新版本的 intellij FATAL 中遇到以下异常:gpu_data_manager_impl_private.cc(439)] GPU 进程不可用。再见。错误。这发生在...
为什么我的 Flutter 应用程序无法在 iPhone 上运行?
我在模拟器(iPhone 12,iOS 14.5)上成功运行了我的应用程序,但是当它在真正的iPhone 11 Pro Max(iOS 14.7.1)上运行时,我面临的只是黑屏。这是 Xcode 的输出: 2021-09-16 18:48:00.
为什么当CallKit消息到达并唤醒应用程序时应用程序崩溃?从在线崩溃日志来看,崩溃总是发生在唤醒后的 7 秒处。 日期/时间:...
我在一个项目中使用了一个第三方sdk,其中在其中一个旅程中,正在使用默认的android日历。由于某种原因,当我单击编辑按钮时,会发生这样的情况...
执行简单的 mysql.connector 代码时内核立即崩溃
当我在 .ipynb 文件中执行以下代码时,它立即崩溃,并给出以下解释: 将会话处理为内核进程死亡 ExitCode:3221225477,原因: 我的代码: 导入我的...
如何在 python 中实现一个字典,以可以从故障中恢复的方式持久保存到磁盘?
我有一个使用 pyzmq 实现的生产者-消费者实现(我从这里获取了示例: 我有一个生产者,可以同时生产针对几种不同类型消费的对象...
我在 C# 中定义了一个 UDF,它将 SQL 查询的结果返回到动态数组。这个公式运行得很好并且可以返回值。您可以在公式栏中编辑公式,但是在编辑时...
为 FPS 游戏制作相机后坐力脚本,让它工作,但是当我将后坐力值设置为 0 以外的任何值时,Unity 冻结,我必须对其进行任务管理。不会崩溃,只是冻结。