gpt4 book ai didi

c++ - SymInitialize 失败,错误 2147483661

转载 作者:可可西里 更新时间:2023-11-01 10:00:28 24 4
gpt4 key购买 nike

知道为什么会这样吗?该方法对于当前进程完美运行,对于在同一台本地计算机上运行的远程进程失败,对我来说是垃圾错误代码 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/

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