2017-03-15 116 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)