首页 > 解决方案 > 如何在 Windows 上以编程方式(IDebugClient)从转储文件中获取进程名称

问题描述

使用windbg,打开转储文件并运行'!analyze -v',结果中会列出PROCESS_NAME 属性,例如PROCESS_NAME: notmyfault64.exe。

但是如何通过 windows 调试 API 获取 PROCESS_NAME 呢?

一种可能的方法是使用 IDebugClient::OpenDumpFile() 打开转储文件,然后使用 IDebugControl::Execute() 执行 '!analyze -v' 并从输出中获取 PROCESS_NAME。但这看起来像是一种解决方法。

有什么直接的方法可以通过调试 API 获取 PROCESS_NAME 吗?例如,IDebugSymbols3::GetModuleNames()?我试过这样的代码:

ULONG loaded = 0, unloaded = 0;
symbols->GetNumberModules(&loaded, &unloaded);
const ULONG count = loaded + unloaded;

DEBUG_MODULE_PARAMETERS* parameters = new DEBUG_MODULE_PARAMETERS[count];
symbols->GetModuleParameters(loaded, 0, NULL, parameters);
for (int i = 0; i < count; i++) {
  symbols->GetModuleNames(DEBUG_ANY_ID, parameters[i].Base, ImageNameBuffer, MAX_PATH + 1, &ImageNameSize,
        ModuleNameBuffer, MAX_PATH + 1, &ModuleNameSize,
     LoadedImageNameBuffer, MAX_PATH + 1,
     &LoadedImageNameSize);

     std::cout << ImageNameBuffer<<", base level:"<<i << "\n";
  }

但是如何决定模块名称应该是哪个索引或基数呢?

这里也有一些例子:https://medium.com/swlh/windows-debugger-api-the-end-of-versioned-structures-ac4acaa351bd,问题也是如何选择正确的进程名称作为与Windbg分析结果相同吗?

那么windbg分析结果中的IMAGE_NAME和MODULE_NAME如何通过IDebugClient获取呢?

谢谢!

标签: kernelsymbolswindbgdumpbsod

解决方案


推荐阅读