如何在Solaris上修复SIGBUS

时间:2012-12-23 17:07:25

标签: c++ memory solaris

我在64位Solaris上使用atomic_inc_64_nv,返回值被转换为unsigned long。 但是,当我运行我的应用程序时,它崩溃了,并且核心正在声称崩溃的原因是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)
    }

先谢谢你。

2 个答案:

答案 0 :(得分:3)

Sparc处理器不支持未对齐访问。您需要确保pullTarget与8个字节对齐。您可以添加一些这样的代码来捕获它:

if((uint_ptr)pullTarget& 7)    {       printf(“对齐问题pullTarget =%p \ n”,pullTarget);    }

答案 1 :(得分:2)

由于您有一个核心并已在调试器中打开它,现在只需打印变量pullTarget中包含的值。 (指针值本身,而不是它指向的内容。)你应该看到它不能被8整除,因为@MatsPetersson在原因上是正确的。