How can I create objects based on dump file memory in a WinDbg extension?

后端 未结 4 1431
走了就别回头了
走了就别回头了 2021-02-06 13:55

I work on a large application, and frequently use WinDbg to diagnose issues based on a DMP file from a customer. I have written a few small extensions for WinDbg that have prov

4条回答
  •  别那么骄傲
    2021-02-06 14:29

    I ended up just following my initial hunch, and copying over the data from the dmp file into a new object. I made this better by making remote wrapper objects like this:

    class SomeClassRemote : public SomeClass
    {
    protected:
        SomeClassRemote (void);
        SomeClassRemote (ULONG inRemoteAddress);
    
    public:
        static  SomeClassRemote *       New(ULONG inRemoteAddress);
        virtual ~SomeClassRemote (void);
    
    private:
    
        ULONG                   m_Address;
    
    };
    

    And in the implementation:

    SomeClassRemote::SomeClassRemote (ULONG inRemoteAddress)
    {
        ULONG cb;
    
        m_Address = inRemoteAddress;
    
        // copy in all the data to the new object, skipping the virtual function tables
        ReadMemory(inRemoteAddress + 0x4, (PVOID) ((ULONG)&(*this) +0x4), sizeof(SomeClass) - 4, &cb);
    }
    
    SomeClassRemote::SomeClassRemote(void)
    {
    }
    
    SomeClassRemote::~SomeClassRemote(void)
    {
    }
    
    SomeClassRemote* SomeClassRemote::New(ULONG inRemoteAddress)
    {
        SomeClassRemote*x = new SomeClassRemote(inRemoteAddress);
    
        return (x);
    }
    

    That is the basics, but then I add specific overrides in as necessary to grab more information from the dmp file. This technique allows me to pass these new remote objects back into our original source code for processing in various utility functions, cause they are derived from the original class.

    It sure SEEMS like I should be able to templatize this somehow... but there always seems to be SOME reason that each class is implemented SLIGHTLY differently, for example some of our more complicated objects have a couple vtables, both of which have to be skipped.

提交回复
热议问题