前几天交叉编译crtmpserver到arm9下。编译通过,但是运行的时候,总是提示Alignment trap,但是并不影响程序的运行。这依然很令人不爽,因为不知道是什么原因引起的,这就像一颗定时炸弹一样,一定要解决。

  
修改makefile,加入-ggdb,去掉编译优化,重新编译。编译完毕,在gdb下运行,依然提示Alignment
trap,并且gdb没有任何反应。按照设想,操作系统应该能捕获到这个错误,然后通过信号的方式传递给gdb,gdb再中断停下来。但是事实上并没有按
照我的设想运行,为什么呢?通过查找资料,发现cpu在处理内存对齐的时候,有几种方式可以设置。

cat /proc/cpu/alignment
User:           1
System:         0
Skipped:        0
Half:           0
Word:           1
DWord:          0
Multi:          0
User faults:    3 (fixup+warn)

我的嵌入式linux系统下的默认处理方式是第3级处理方式:修复+警告。

0 - ignore
1 - warn
2 - fixup
3 - fixup+warn
4 - signal
5 - signal+warn (需要这个)

于是修改为:echo 5 > /proc/cpu/alignment,这样就会给内核一个信号。再在gdb下面重新运行

./rtmpserver ./rtmpserver.lua,果然gdb捕获到该信息,然后bt,查看出现问题的代码:

_currentFPVersion = ntohl(*((uint32_t *) (GETIBPOINTER(buffer) + 4))); //----MARKED-LONG---
原来是在强制类型转换读取内存的时候出现了错误,于是修改为:
uint32_t uTemp = 0;
memcpy(&uTemp,GETIBPOINTER(buffer) + 4,sizeof(uint32_t));
_currentFPVersion = ntohl(uTemp);     再重新编译,运行,果然烦人的Alignment trap消失了。这也提醒我们,平时在写代码的时候,在内存访问上,尽量使用memcmp,memcpy,memset等函数,
而不要为了方便,直接对指针内容进行访问。这样的代码在x86上可能没问题,但是运行到arm上,就可能会出问题。
关于为什么在arm上会出现Alignment trap,可以参考http://hi.baidu.com/simplejoy/blog/item/cf456c8b1549e617c8fc7ad6.html

Alignment trap 解决方法  【转 结合上一篇的更多相关文章

  1. 盘点10个CAD难点,看看有没有让你崩溃的,解决方法一并奉上

    蜀道难,难于上青天”,对于很多学习CAD的小伙伴来说CAD就跟蜀道一样,太难了,下面小编分享几个在学习CAD过程中会遇到的问题以及解决的方法,一起来看看吧! 1. 如何替换找不到的原文字体? 答:复制 ...

  2. linux上备份Oracle时EXP-00091的错误解决方法

    unix/linux上备份Oracle时EXP-00091的错误解决方法 unix/linux上备份数据时的错误解决方法 EXP-00091: Exporting questionable stati ...

  3. php_admin_value open_basedir 引起的上传文件失败解决方法

    为了安全,我们通常会在虚拟主机设置中,加入这一行php_admin_value open_basedir "/usr/local/apache/htdocs/www"但这会导致mo ...

  4. ARMLinux下Alignment trap的一些测试 【转自 李迟的专栏 CSDN http://blog.csdn.net/subfate/article/details/7847356

    项目中有时会遇到字节对齐的问题,英文为“Alignment trap”,如果直译,意思为“对齐陷阱”,不过这个说法不太好理解,还是直接用英文来表达. ARM平台下一般是4字节对齐,可以参考文后的给出的 ...

  5. Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  6. mvc项目问题清单以及解决方法

    项目开发中遇到的一些问题以及解决方法. 1. 脚本相关 mvc中RemoteAttribute使用,在IE浏览器下面会将结果缓存起来(304).因为IE浏览器判断Url的链接参数都没有变化,所以直接返 ...

  7. Java并发编程:Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  8. FTP出现211-Extension supported 停止的解决方法

    FTP出问题211-Extension supported 停止的解决方法 FTP出问题211-Extension supported 停止的解决方法 FLASHFXP FTP上传登录时提示Exten ...

  9. 【解决方法】VS 丢失模板

    今天要用VS2008做一个报表,可是在添加新建项的时候却没有报表(rdlc)模板. 解决方法: 1 拷贝文件 1.1 32位windows 将 C:\Program Files\Microsoft V ...

随机推荐

  1. 阿里的maven私服

    <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://maven ...

  2. SQL SERVER 2008 评估期已过

    开始-->运行-->regedit 修改注册表: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Config ...

  3. swift_Dictionary 字典

    // //  main.Swift //  字典 // //  Created by zhangbiao on 14-6-15. //  Copyright (c) 2014年 理想. All rig ...

  4. Centos 与本地终端 上传、下载 文件

    首先安装lrzsz # yum -y install lrzsz 1.上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可. # rz 运行rz命令后弹出选择文件窗口,找到要上传的文件 ...

  5. Unity3d copy gameobject from one scene to another

    scene-copy-game-objects-from-one-scene-to-anotherhttp://forum.unity3d.com/threads/scene-copy-game-ob ...

  6. Java开发常用的在线工具

    原文出处: hollischuang(@Hollis_Chuang) 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中 ...

  7. js 表单验证

    不错的JS验证~~~~~~~~~~~~~~~~~~~~~~~~~ 用途:校验ip地址的格式 输入:strIP:ip地址 返回:如果通过验证返回true,否则返回false: */ function i ...

  8. CentOS_7.2安装PHP_5.6

    一.安装依赖包和开发工具: yum install vim vim-enhanced wget zip unzip telnet ntsysv compat* apr* nasm* gcc gcc* ...

  9. [原创]Win7、Win8、Win10始终以管理员身份运行程序。

    在Win7.Win8.Win10系统中,以管理员身份运行程序很麻烦,一般有以下几种方式: 1.在可执行程序或快捷方式上右键,以管理员身份运行: 2.在可执行程序或快捷方式上右键->属性-> ...

  10. 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法

    这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不 ...