gpt4 book ai didi

c++ - 如何在 WinDbg 扩展中基于转储文件内存创建对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:13 27 4
gpt4 key购买 nike

我处理大型应用程序,经常使用 WinDbg 根据客户的 DMP 文件诊断问题。我已经为 WinDbg 编写了一些小的扩展,这些扩展被证明对于从 DMP 文件中提取信息位非常有用。在我的扩展代码中,我发现自己以相同的方式一遍又一遍地手动取消引用 c++ 类对象。例如:

Address = GetExpression("somemodule!somesymbol");
ReadMemory(Address, &addressOfPtr, sizeof(addressOfPtr), &cb);

// get the actual address
ReadMemory(addressOfObj, &addressOfObj, sizeof(addressOfObj), &cb);

ULONG offset;
ULONG addressOfField;

GetFieldOffset("somemodule!somesymbolclass", "somefield", &offset);
ReadMemory(addressOfObj+offset, &addressOfField, sizeof(addressOfField), &cb);

效果很好,但随着我编写了更多扩展,具有更强大的功能(并在我们的应用程序 DMP 文件中访问更复杂的对象),我渴望找到更好的解决方案。我当然可以访问我们自己的应用程序的源代码,所以我认为应该有一种方法可以从 DMP 文件中复制一个对象,并使用该内存在调试器扩展中创建一个实际对象,我可以在上面调用函数(通过从我们的应用程序中链接 dll)。这样我就省去了手动从 DMP 中取出东西的麻烦。

这可能吗?我尝试了一些显而易见的事情,比如在扩展中创建一个新对象,然后直接从 DMP 文件中用一个大的 ReadMemory 覆盖它。这似乎将数据放在了正确的字段中,但是当我试图调用一个函数时却吓坏了。我想我遗漏了一些东西……也许 C++ 提取了一些我不知道的 vtable 特性?我的代码看起来与此类似:

SomeClass* thisClass = SomeClass::New();
ReadMemory(addressOfObj, &(*thisClass), sizeof(*thisClass), &cb);

跟进:看起来我想要的可能是来自 EngExtCpp 的 ExtRemoteTyped?有没有人成功使用过这个?我需要在 google 上搜索一些示例代码,但运气不太好。

跟进 2:我正在对此进行两种不同的调查。
1) 我正在研究 ExtRemoteTyped,但看起来这个类实际上只是 ReadMemory/GetFieldOffset 调用的助手。是的,它有助于加快速度,但在从 DMP 文件重新创建对象时并没有真正帮助。虽然文档很薄,所以我可能会误解一些东西。2) 我也在考虑尝试使用 ReadMemory 来用 DMP 文件中的数据覆盖在我的扩展中创建的对象。但是,我没有像上面那样使用 sizeof(*thisClass) ,而是想只挑选数据元素,并保持 vtables 不变。

最佳答案

有趣的想法,但是这可能只适用于最简单的对象。例如,如果对象包含指向其他对象(或 vtable)的指针或引用,则这些对象不会很好地复制到新的地址空间。

但是,您可以让“代理”对象工作,当您调用代理方法时,它们会适当调用 ReadMemory() 以获取信息。这听起来是一项相当大的工作量,而且我认为它或多或少必须为您要代理的每个类定制一组代码。可能有更好的方法来解决这个问题,但这就是我突然想到的。

关于c++ - 如何在 WinDbg 扩展中基于转储文件内存创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2573242/

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