Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以检查悬挂式光纤';s调用堆栈?_C++_Windows_Visual Studio 2017_Fibers - Fatal编程技术网

C++ 是否可以检查悬挂式光纤';s调用堆栈?

C++ 是否可以检查悬挂式光纤';s调用堆栈?,c++,windows,visual-studio-2017,fibers,C++,Windows,Visual Studio 2017,Fibers,VisualStudio能够检查挂起的线程及其调用堆栈。在给定光纤句柄的情况下,是否可以检查挂起光纤的调用堆栈 目标是获得更多关于悬浮光纤的调试信息(并满足我的好奇心) 从我最初的搜索中,我并不认为这是容易的(甚至是可行的)。欢迎提出建议。不,这是不可能的。调试器无法获取非活动光纤的堆栈,因为只有应用程序本身知道非活动光纤数据和堆栈的位置 试着解释一下 有纤维手柄吗 不存在光纤手柄。仅针对线程存在句柄。活性纤维的堆叠与螺纹堆叠相同。从进程堆分配的其他光纤(和it堆栈)。操作系统不存储-附加光纤数

VisualStudio能够检查挂起的线程及其调用堆栈。在给定光纤句柄的情况下,是否可以检查挂起光纤的调用堆栈

目标是获得更多关于悬浮光纤的调试信息(并满足我的好奇心)


从我最初的搜索中,我并不认为这是容易的(甚至是可行的)。欢迎提出建议。

不,这是不可能的。调试器无法获取非活动光纤的堆栈,因为只有应用程序本身知道非活动光纤数据和堆栈的位置

试着解释一下

有纤维手柄吗


不存在光纤手柄。仅针对线程存在句柄。活性纤维的堆叠与螺纹堆叠相同。从进程堆分配的其他光纤(和it堆栈)。操作系统不存储-附加光纤数据/堆栈所在的位置。应用程序本身必须存储此信息。外部程序,包括调试器,不能知道这一点。因此,如果我们甚至不知道堆栈的位置,就不可能显示堆栈跟踪。调试器甚至不知道存在多少光纤。可能的唯一视图-在线程上(调用
ConvertThreadToFiber
之后和
ConvertFiberToThread
之前)是否有光纤(至少一个光纤的数量)处于活动状态。是否创建了额外的光纤,其中存储了it数据/堆栈-已经未知。

@有人指出光纤是在线程上下文中运行的:我意识到了这一点。但是,光纤存储自己的状态。当任何(启用光纤的)线程调度光纤时,它能够向我显示其调用堆栈。这让我想到,从光纤存储的状态来看,应该可以显示调用堆栈。使用光纤句柄,他很可能是指
CreateFiber
返回的光纤地址,堆栈指针保存在其中。有了这些信息,如果用光纤的值替换某些线程的rsp/rip(之后显然需要恢复),就可以在调试器中找到光纤调用堆栈。@ssbssa-调试器无法获取
CreateFiber
No返回的地址,但是您可以将此地址存储在某个变量中。@ssbssa-对于在另一个进程(调试程序或任何进程)中使用此地址,需要设置钩子
CreateFiberEx
CreateFiber
DeleteFiber
。只有此工具的特殊设计才能做到这一点,而不是通用调试器。您可以将此地址存储在某个变量中—我完全无法理解这一点,但我们可以在这里假设我们已经拥有光纤地址,因为在这个问题中它是这样写的:
在给定光纤句柄的情况下,是否可以检查挂起光纤的调用堆栈?