C++ 如何在Solaris上修复SIGBUS
我在64位Solaris上使用的是C++ 如何在Solaris上修复SIGBUS,c++,memory,solaris,C++,Memory,Solaris,我在64位Solaris上使用的是atomic_inc_64_nv,返回值被强制转换为无符号long。 但当我运行我的应用程序时,它崩溃了,core坚持认为崩溃的原因是SIGBUS。我怀疑可能存在对齐问题。我如何解决这个问题 这是我使用增量的函数 inline unsigned long long Increment64(volatile unsigned long long * pullTarget) { #if defined(LINUX) return Ad
atomic_inc_64_nv
,返回值被强制转换为无符号long。
但当我运行我的应用程序时,它崩溃了,core坚持认为崩溃的原因是SIGBUS。我怀疑可能存在对齐问题。我如何解决这个问题
这是我使用增量的函数
inline unsigned long long Increment64(volatile unsigned long long * pullTarget)
{
#if defined(LINUX)
return Add64(pullTarget, 1ULL);
#elif defined(SOLARIS)
return atomic_inc_64_nv((volatile unsigned long *)pullTarget) - 1ULL;
#elif defined(WIN32)
return (unsigned long long)InterlockedIncrement64((LONGLONG volatile*)(pullTarget)) - 1ULL;
#endif // defined(LINUX)
}
提前感谢您。Sparc处理器不支持未对齐的访问。您需要确保您的
pullTarget
与8字节对齐。您可以添加如下代码来捕获它:
if((uint_ptr)pullTarget和7)
{
printf(“对齐问题pullTarget=%p\n”,pullTarget);
}Sparc处理器不支持未对齐的访问。您需要确保您的
pullTarget
与8字节对齐。您可以添加如下代码来捕获它:
if((uint_ptr)pullTarget和7)
{
printf(“对齐问题pullTarget=%p\n”,pullTarget);
}由于您有一个内核并在调试器中打开了它,现在只需打印变量
pullTarget
中包含的值即可。(指针值本身,而不是它所指向的值。)您应该看到它不能被8整除,因为@MatstPetersson的原因是正确的。由于您有一个核心并在调试器中打开了它,现在只需打印变量pullTarget
中包含的值即可。(指针值本身,而不是它指向的对象。)您应该看到它不能被8整除,因为@MatstPetersson的原因是正确的。您是否尝试过调试器?没有代码,就很难帮助您。请提供一个。请查看上面发布的函数。是否尝试了调试器?没有代码,就很难帮助您。请提供一个。请查看上面发布的函数。最有可能的错误将出现在调用此函数的任何地方。最有可能的错误将出现在调用此函数的任何地方。