Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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++ C++;获取指定线程的堆栈跟踪_C++_Windows_Stack Trace - Fatal编程技术网

C++ C++;获取指定线程的堆栈跟踪

C++ C++;获取指定线程的堆栈跟踪,c++,windows,stack-trace,C++,Windows,Stack Trace,问题出现在StackWalk64函数中,该函数不适用于其他线程,仅适用于当前线程 例如: symminitialize(进程,symbolPath.c_str(),TRUE); 位移=0; DWORD dwMachineType=图像\文件\机器\ AMD64; stack.AddrPC.Offset=context.Rip; stack.AddrPC.Mode=AddrModeFlat; stack.AddrFrame.Offset=context.Rsp; stack.AddrFrame.

问题出现在StackWalk64函数中,该函数不适用于其他线程,仅适用于当前线程

例如:

symminitialize(进程,symbolPath.c_str(),TRUE);
位移=0;
DWORD dwMachineType=图像\文件\机器\ AMD64;
stack.AddrPC.Offset=context.Rip;
stack.AddrPC.Mode=AddrModeFlat;
stack.AddrFrame.Offset=context.Rsp;
stack.AddrFrame.Mode=AddrModeFlat;
stack.AddrStack.Offset=context.Rsp;
stack.AddrStack.Mode=AddrModeFlat;
对于(帧=0;帧++)
{
结果=StackWalk64
(
dwMachineType,
过程
主线,
&堆叠,
&背景,
无效的
SymFunctionTableAccess64,
SymGetModuleBase64,
无效的
);
symbol.SizeOfStruct=sizeof(图像HLP_SYMBOL64);
symbol.MaxNameLength=255;
SymGetSymFromAddr64(进程,(ULONG64)stack.AddrPC.Offset、位移和符号);
UnDecorateSymbolName(symbol.Name,(PSTR)Name,256,UNDNAME_COMPLETE);

LogDebug我们看不到
上下文
来自何处。可能不是来自主线程。上下文与此代码的功能相同。我在启动第二个线程时存储上下文,但上下文仍然包含相等的堆栈跟踪。我需要从看门狗线程打印主堆栈跟踪。
    SymInitialize(process, symbolPath.c_str(), TRUE);

    displacement = 0;
    DWORD dwMachineType = IMAGE_FILE_MACHINE_AMD64;
    stack.AddrPC.Offset = context.Rip;
    stack.AddrPC.Mode = AddrModeFlat;
    stack.AddrFrame.Offset = context.Rsp;
    stack.AddrFrame.Mode = AddrModeFlat;
    stack.AddrStack.Offset = context.Rsp;
    stack.AddrStack.Mode = AddrModeFlat;

    for (frame = 0; ; frame++)
    {
        result = StackWalk64
        (
            dwMachineType,
            process,
            mainThread,
            &stack,
            &context,
            NULL,
            SymFunctionTableAccess64,
            SymGetModuleBase64,
            NULL
        );

        symbol.SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
        symbol.MaxNameLength = 255;


        SymGetSymFromAddr64(process, (ULONG64)stack.AddrPC.Offset, &displacement, &symbol);
        UnDecorateSymbolName(symbol.Name, (PSTR)name, 256, UNDNAME_COMPLETE);


        LogDebug << frame << " | " << String(symbol.Name);

        if (!result)
        {
            break;
        }
    }