程序在函数返回后被终止
Program was killed after function returning
当函数"dbmSetIndex"返回时,我的程序被杀死了。 您可以在下面看到被杀的位置。(=>部分) 你能解释一下发生了什么吗? (x86 英特尔)
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
}
您提供了一些反汇编,这表明对您提供的函数的调用已经返回。崩溃没有发生在函数中,但之后:
函数调用:
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
(test + jne 指令),可能还有一些指针分配。可能是这样的:
SomeClass* s = [...];
s->someMember = dbmSetIndex([...]); // (*)
if(*s->someMember)
(*):故障位置,在功能完成后的分配过程中发生错误。不要 100% 指望找到这样的赋值,它也可能是对内联 setter 函数的调用。
在这里,我们也看到了为什么 r12 不一定是 0:它将包含预先计算的someMember
在SomeClass
内的偏移量,即 &(s->someMember),如果 s 为 0,则很可能是 0,例如 16、28、...准确地说,当时包含的值等于offsetof(SomeClass, somemember)
.
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 当加入 C++11 函数的线程仍未终止时,是否可以返回?
- 当可以返回错误/异常时,从库中终止调用程序(例如,调用exit())是否总是错误的?
- C++ Argv[1] 终止程序,返回值 9009
- 如何在执行期间终止(或返回)具有结构类型的自动函数
- 如何将没有终止字符和大小的返回消息一起使用提升async_read?
- 程序在函数返回后被终止
- 程序是否可以在调用kill函数之前返回/终止
- C++ WinSock Recv 在接收 0 数据时终止线程而不是返回错误代码
- pclose() 返回管道的终止状态是否在所有平台上都向左移动了 8 位?
- 将在C++中的内联函数中返回语句实际上返回并终止代码流
- main()返回时终止线程
- 如何返回0并从函数终止
- C++11 std::string::operator[]是否返回null终止的缓冲区
- 在不终止程序的情况下将动态分配的内存返回给操作系统