2017-03-15 109 views
0

当函数“dbmSetIndex”返回时,我的程序被终止。 你可以看到下面的死亡位置。 (=>部分) 你能解释发生了什么吗? (86英特尔)程序在函数返回后死亡

0x0000000000420723 <+83>: mov rdi,r14 
    0x0000000000420726 <+86>: call 0x405260 <[email protected]> 
    0x000000000042072b <+91>: test eax,eax 
    0x000000000042072d <+93>: mov ebp,eax 
=> 0x000000000042072f <+95>: mov DWORD PTR [r12],eax 
    0x0000000000420733 <+99>: jne 0x4207d0 <FnDBBase::SelectSecurity(s_oms_security*, char*)+256> 
    0x0000000000420739 <+105>: lea rsi,[rip+0x4197d]  # 0x4620bd 

这里是dbmSetIndex代码。 我无法找到此代码的哪部分导致此问题。

int dbmSetIndex (dbmHandle* aHandle, const char* aTable, const char* aIndexName) 
{ 
    dbmInternalHandle* pHandle = NULL; 

    _TRY 
    { 
     pHandle = (dbmInternalHandle*)aHandle->mHandle; 

     // Water Mark가 다르면 걍 리턴해라. 
     if (unlikely (aHandle->mMark != DBM_HANDLE_MARK)) 
     { 
      DBM_ERR ("invalide magic number (%ld)", aHandle->mMark); 
      _THROW(ERR_DBM_INVALID_HANDLE); 
     } 

     if(pHandle->mRemote != NULL) 
     { 
      if(pHandle->mRemote->mSockFd > 0) 
      { 
       _CALL(dbmRemoteSetIndex(aHandle, aTable, aIndexName)); 
       _RETURN; 
      } 
     } 

     /**************************************** 
     * DataObject 맵핑. 
     ****************************************/ 
     memset_s(&pHandle->mData, 0x00, sizeof(pHandle->mData)); 
     memcpy_s (pHandle->mData.mTableName, aTable, strlen_s (aTable) + 1); 
     pHandle->mData.mTransType = DBM_SET_INDEX; 
     pHandle->mData.mUserData = (char*)aIndexName; 

     /**************************************** 
     * mAct 호출. 
     ****************************************/ 
     _CALL(pHandle->mTrans->mAct (pHandle)); 
    } 
    _CATCH 
    { 
     _CATCH_ERR; 
    } 
    _FINALLY 
    _END 
} 
+0

请用标记语言编程。 – JJJ

回答

1

您提供了一些反汇编,它表明对您提供的函数的调用已经返回。飞机坠毁没有在函数内发生,但事后:你的函数

电话:

0x0000000000420726 <+86>: call 0x405260 <[email protected]> 

在这里,您返回已经:

0x000000000042072b <+91>: test eax,eax 

的临界线是一个内存访问存储在寄存器r12(写入)中的地址:

0x000000000042072f <+95>: mov DWORD PTR [r12],eax 

让您的调试器显示寄存器并查看r12的内容。它很可能是0x0000000000000000或一个小值,因此是一个空指针(或空引用),但它也可能包含一个无效地址(未初始化的指针!)。

尽管如此,您还是只能从所提供的信息中知道。您必须查看函数调用的代码位置 - 它必须位于函数FnDBBase::SelectSecurity(s_oms_security*, char*)之内,因为您将(jne)跳转到此函数内的偏移量([...] + 256)。应该有一个if参与(测试+ jne指令),可能还有一些指针分配。也许是这样的:

SomeClass* s = [...]; 
s->someMember = dbmSetIndex([...]); // (*) 
if(*s->someMember) 

(*):故障位置,分配期间功能已经完成之后发生了错误。不要指望100%找到这样一个任务,它也可能是一个内联setter函数的调用。

这里我们也看到,为什么r12不一定是0:它将包含在SomeClass内的someMember的预先计算的偏移量,即&(s-> someMember)如果s是0,那么很可能是e。 G。 16,28,......确切地说,所包含的值等于offsetof(SomeClass, somemember)