c++ - SymInitialize 失败,错误为 2147483661

标签 c++ windows winapi error-handling

知道为什么会发生这种情况吗?该方法对于当前进程完美无缺,对于在同一本地计算机上运行的远程进程则失败,对我来说垃圾错误代码为 2147483661 (0x80000000D),因为在任何地方都没有关于这个特定错误代码的提示,或者我是否遗漏了一些东西? 。 另外,我觉得;因为 SymInitialize 本身失败了,SymFromAddr 也是如此。我说得对吗?

相关进程以管理员身份运行,并且具有 SeDebug 和 SeSecurity 权限。

bool DbgHelpWrapper::MatchTargetSymbol( IntPtr processHandle, int procId, int threadId )
{
    DWORD dwStartAddress;
    DWORD dwInitializeError;
    DWORD dwThreadID = static_cast<DWORD>(threadId);
    DWORD dwProcessId = static_cast<DWORD>(procId);
    HANDLE hRemoteProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwProcessId );

    if (GetThreadStartAddress( processHandle, dwProcessId, dwThreadID, &dwStartAddress ))
    {
        dwInitializeError = ERROR_SUCCESS;
    } else {
        dwInitializeError = Marshal::GetLastWin32Error();
        System::Console::WriteLine( String::Format("GetThreadStartAddress failed: {0}", dwInitializeError ));
    }

    try
    {
        DWORD dwSymSetOptStatus = SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_UNDNAME | SYMOPT_LOAD_LINES);
        DWORD dwSymInitStatus = ERROR_SUCCESS;
        if (dwSymInitStatus = SymInitialize(hRemoteProcess, NULL, TRUE)) {
            dwInitializeError = ERROR_SUCCESS;
        } else {
            dwInitializeError = Marshal::GetLastWin32Error();
            System::Console::WriteLine( String::Format("SymInitialize failed: {0} error: {1}", dwSymInitStatus, dwInitializeError ));
            return false;
        }
        const int kMaxNameLength = 256;

        ULONG64 buffer[(sizeof(SYMBOL_INFO) + kMaxNameLength * sizeof(wchar_t) + sizeof(ULONG64) - 1) / sizeof(ULONG64)];
        memset(buffer, 0, sizeof(buffer));

        // Initialize symbol information retrieval structures.
        DWORD64 sym_displacement = 0;
        PSYMBOL_INFO symbol = reinterpret_cast<PSYMBOL_INFO>(&buffer[0]);
        symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
        symbol->MaxNameLen = kMaxNameLength - 1;
        if( SymFromAddr(hRemoteProcess, (DWORD64)dwStartAddress, &sym_displacement, symbol ))
        {
            System::String^ name = gcnew System::String( symbol->Name );
            System::Console::WriteLine( String::Format("Found thread with ModuleName: {0}", name ));
            if( name->Contains( this->symbolName ))
            {
                return true;
            }
        }
        else
        {
            dwInitializeError = Marshal::GetLastWin32Error();
            System::Console::WriteLine( String::Format("SymFromAddr failed: {0}", dwInitializeError ));
        }
    }
    finally
    {
        CloseHandle(hRemoteProcess);
    }
    return false;
}

最佳答案

另一个原因(尽管在本例中可能不是)可能是该过程尚未完全启动。在我的调试器代码中,我在 WaitForDebugEvent 返回 CREATE_PROCESS_DEBUG_EVENT 事件代码后立即调用 SymInitialize。这给出了0x80000000D。稍后调用它(就在我需要堆栈遍历之前)成功了。

关于c++ - SymInitialize 失败,错误为 2147483661,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238867/

相关文章:

c++ - SwapBuffers 导致重绘

windows - 无需管理员权限运行EXE文件

c# - 如何在 C# 和 Windows 7 中设置音量?

c - 在 MS Windows 中运行时缺少 Gtk+ 图标

c++ - 基于范围的和双端队列与 vector

c++ - 组框外观

windows - 如何检索 Windows 容器的内存使用情况?

c++ - 在测试用例中读取 qdebug?

c++ - 用于游戏 Controller 的 WinAPI

c++ - 如何将此结构传递给可用函数?