kernel - 如何在 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获取呢?
谢谢!
解决方案
推荐阅读
- timezone - 如何在 ubuntu 中更改我的本地时区,因为我的时区不适合真实情况?
- c# - Crystal Report 13 - 限制详细显示的记录数部分在每个组的末尾显示额外的页面
- prolog - 如何解决 Turbo Prolog 中的自由变量错误?
- react-native - 如何从一个屏幕跳转到另一个屏幕并从 ReactNative 的堆栈中清除所有其他屏幕?
- python - 提取单词/短语后跟一个短语
- python - 使用带注意的 LSTM 编码器解码器进行多输出预测
- c# - 如何创建用户类并注册新用户?
- python-3.x - 统计跨账户的EC2实例数
- xml - 谁能告诉我如何获得车道的地理坐标?
- python-3.x - 类型检查 python 列表、数组或序列仅用于数字类型