armhf sig bus error
2016-01-29 16:21
295 查看
(gdb) run Starting program: /htslib-1.2.1/test/sam test/ce.fa [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1". Program received signal SIGBUS, Bus error. 0x00025640 in bam_aux2f ( s=0xa967e "\333\017I@XddiW\024\213\n\277\005@XZZHello, world!", s@entry=0xa967d "f\333\017I@XddiW\024\213\n\277\005@XZZHello, world!") at sam.c:1181 1181 else if (type == 'f') return *(float*)s; (gdb) This is an alignment issue. VFP requires floating point loads and stores to be naturally aligned but s is only aligned to 2 bytes whiile a float is 4 bytes. Looking further at the code reveals the reason for the unalignment. It seems that the code is reading from a data format where values are prefixed with single bytes practically gauranteeing that many of the accesses will be unaligned. In portable code unaligned accesses should be avoided. Sometimes they will give the right result, sometimes they will give bus errors, sometimes they will silently give wrong answers. To a large extent the behaviour is driven by architecture (and sometimes version of the architecture) but it can also be driven by what instructions the compiler choses to use. Even if it does the right thing it may do so very slowly. x86 tends to be the most forgiving architecture when it comes to unaligned accesses. The attatched patch replaces a number of unaligned accesses in sam.c with memcpy calls. It resulted in a successful build on raspbian stretch. I did not include any conditional logic but it would be easy to add conditional logic to only use memcpy on non-x86 targets if that was considered desirable (I do not if memcpy is faster or slower than letting the x86 cpu fixup the unaligned accesses in hardware and if-so whether the difference is likely to be significant).
[htslib.debdiff (text/plain, attachment)]
+@@ -1177,8 +1183,8 @@ double bam_aux2f(const uint8_t *s) + { + int type; + type = *s++; +- if (type == 'd') return *(double*)s; +- else if (type == 'f') return *(float*)s; ++ if (type == 'd') return READUNALIGNED(s,double); ++ else if (type == 'f') return READUNALIGNED(s,float); + else return 0.0; + }
++#define READUNALIGNED(ptr,type) ({ \ ++ type tmp;\ ++ memcpy(&tmp,ptr,sizeof(type));\ ++ tmp;\ ++})
相关文章推荐
- c#之类型转换2
- spark core源码分析4 worker启动流程
- Shell文件包含
- Shell输入输出重定向:Shell Here Document,/dev/null文件
- Sql暂停语句
- 用示例比较Oracle的 Read committed 和Serializable 事务隔离等级的区别
- 加速度计和陀螺仪指南
- 如何在注册表中彻底锁定IE浏览器的的主页?
- MR-3.Hadoop使用YARN运行MapReduce工作原理
- PHP面向对象深入研究之【继承】,减少代码重复
- Apache Rewrite规则详解
- java错题集
- @property 中的关键字
- Ubuntu 带账号认证发邮件
- Shell函数参数
- 0006-数据库数据类型转换
- 拥抱未来!2016年最值得关注的移动端APP设计趋势
- Shell函数:Shell函数返回值、删除函数、在终端调用函数
- iOS应用间相互跳转
- Android 通过ViewPager实现广告轮播效果