【问题标题】:Analyzing crash - translate disassembly instructions to C++ equivalent分析崩溃 - 将反汇编指令转换为 C++ 等效指令
【发布时间】:2011-09-02 22:15:22
【问题描述】:

我正在尝试调试崩溃。 (ACCESS_VIOLATION)

下面是反汇编的sn-p。我标记了发生异常的行。 它对应下面显示的实际 C++ 代码中的什么指令?

反汇编:

420: for( Uint32 i = 0; i < m_children.size(); ++i){
    06A923D3 8B 46 0C             mov         eax,dword ptr [esi+0Ch]  
    06A923D6 57                   push        edi  
    06A923D7 33 FF                xor         edi,edi  
--> 06A923D9 39 38                cmp         dword ptr [eax],edi  
    06A923DB 76 59                jbe         ICategoryNode::iterate+66h (6A92436h)  
    06A923DD 53                   push        ebx  
    06A923DE 55                   push        ebp  
    06A923DF 8B 2D 04 60 B0 06    mov         ebp,dword ptr [__imp_::AssertionFailure::logAssert (6B06004h)]  
    06A923E5 33 DB                xor         ebx,ebx  
421: bool keepGoing = CategoryImp::recursiveIterator(handler, *m_children[i]);

实际的 C++ 代码:

void ICategoryNode::iterate(ICategoryHandler& handler) const {
    for(Uint32 i = 0; i < m_children.size(); ++i) {
        bool keepGoing = CategoryImp::recursiveIterator(handler, *m_children[i]);
        if(!keepGoing)
            return;
    }
}

【问题讨论】:

    标签: c++ debugging assembly crash


    【解决方案1】:

    看起来cmp dword ptr [eax],edi 对应于 m_children 的 size 成员的取消引用被内联到小于检查中。

    很可能,您的this 指针无效。您可能在空指针或已删除对象或其他对象上调用了ICategoryNode::iterate(如果eax 的值非常低,则可能是空指针-但无论如何,请检查上面的堆栈帧,您应该能够获取被调用对象的错误地址)。

    【讨论】:

    • 您是否暗示this 必须为空,因为使用m_children 会导致异常?我编辑了代码以明确它已经进入成员函数的事实(因此this是有效的)。
    • 没有。我的意思是this 无效。即,您调用了ptr-&gt;iterate(something),其中ptr 为NULL、未初始化、已删除或无效。 m_children 不是指针,所以不能为 NULL。
    • @dominus:你为什么说this一定是有效的,因为你进入了成员函数?成员函数是虚函数吗?如果不是,你没有理由相信你的this 指针。我同意 bdonlan。
    • 我已经调试了各种有趣的错误,其中this 在函数中途 变得无效-永远不要仅仅因为您将this 放入函数中就认为它是有效的,即使它虚拟的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2011-12-29
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多