我的程序在函数" dbmSetIndex"被退回了。 你可以在下面看到被杀的位置。 (=>部分) 你能解释一下发生了什么吗 (x86 intel)
0x0000000000420723 <+83>: mov rdi,r14
0x0000000000420726 <+86>: call 0x405260 <dbmSetIndex@plt>
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 :(得分:1)
您提供了一些反汇编,表明您提供的函数的调用已经返回。事故中没有发生崩溃,但之后:
调用你的职能:
0x0000000000420726 <+86>: call 0x405260 <dbmSetIndex@plt>
此处您已返回:
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:它将包含someMember
中SomeClass
的预先计算的偏移量,i。即&amp;(s-> someMember),如果s为0,则很可能是e。 G。 16,28,......恰然,包含的值等于offsetof(SomeClass, somemember)
。