调用堆栈显示SIGBUS,这意味着什么

时间:2017-08-25 11:51:09

标签: c++ memory-management solaris alloc sigbus

我的调用堆栈显示以下内容:

 --- called from signal handler with signal 10 (SIGBUS) ---
 001301b8 allocate__t24__default_alloc_template2b0i0Ui (20, 20, 309940, 36, fc55
1a00, 0) + a4
 0011dcb8 __nw__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0_3RepUiUi (10, 10, 7773e8, 0, 0, 0) + 14
 0011dcf8 create__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_all
oc_template2b0i0_3RepUi (a, a, 7773e8, a, 0, 0) + 24
 0011e0bc replace__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_allo
c_template2b0i0UiUiPCcUi (fbcff5c0, 0, ffffffff, fcbf55e2, a, 80808080) + 114
 00133ef0 assign__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0PCcUi (fbcff5c0, fcbf55e2, a, ffffffff, ffffffff, 20) + 24
 00132c78 assign__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0PCc (fbcff5c0, fcbf55e2, 15b0, 15d0, 16f0, 0) + 24
 0012f970 __t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_templ
ate2b0i0PCc (fbcff5c0, fcbf55e2, fcbf55d8, fbcff70e, 10, e00) + 28
 001f7e0c getFiles__7ListDirb (fbcff8e4, 0, 241000, 0, 4e61a0, ff11f478) + 144
. . .

这是否意味着分配失败意味着占用了太多内存? 如何检查/监控内存使用量的增长和缩小,以找出问题所在的位置? 我可以覆盖allocate__t24__default_alloc_template2b0i0Ui,即__default_alloc_template<false, 0>::allocate(unsigned int),以便它调用自定义分配呼叫吗?

1 个答案:

答案 0 :(得分:2)

  

调用堆栈显示SIGBUS,这是什么意思

显示调用堆栈的顶部可能会有所帮助,因此我们可以检查指针的对齐方式。了解导致SIGBUS

的平台和指令也会有所帮助

我的经验SIGBUS通常与未对齐的数据有关。在您走下兔子洞之前,请尝试将-xmemalign=4i-xmemalign=8i添加到CFLAGSCXXFLAGS

我似乎记得Sparc的指令可以更有效地操作更广泛的数据,但它对齐非常敏感。如果您将uint8_t*转换为uint32_t*uint64_t*,那么该缓冲区确实需要对齐,因为SunCC默认会生成更有效的移动。这是安德烈所说的严格别名违规。 Sun不像x86,如果你作弊,它也会SIGBUS

另请参阅“Sun手册”中的B.2.111 -xmemalign=abGoogle "-xmemalign=4i"也有很多好的点击。问题是,在你遇到问题并深入研究之后,你就不会知道你需要搜索的内容。

(我花了几个月的时间在Sparc上追逐一次Sparc的自我测试,这是由于一个肮脏的演员和更广泛的移动指令。-xmemalign=4i为我修好了。