在ARM9新塘平台运行应用程序时,总是输出Alignment trap,但是并不影响程序的运行。通过查找资料,发现cpu在处理内存对齐的时候,有几种方式可以设置。

cat /proc/cpu/alignment
User: 0
System: 0
Skipped: 0
Half: 0
Word: 0
DWord: 0
Multi: 0
User faults: 2 (fixup)
我的嵌入式linux系统下的默认处理方式是第2级处理方式:修复。

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上,就可能会出问题。

更多相关文章

  1. CUDA统一内存工作(具体来说,cudaMallocManaged();)
  2. linux 下使用 vim+cscope+ctags+taglist+NERDtree实现代码阅读编
  3. 如何查看linux命令源代码和函数源代码
  4. UNIX网络编程之源代码的编译和使用
  5. mt7620的u-boot 代码
  6. Linux内存管理 (10)缺页中断处理
  7. 进程实际内存占用: 私有驻留内存数(Private RSS)介绍
  8. 在arcpy中删除或删除表的代码是什么?
  9. iBatis中sqlmap resultclass="java.lang.Integer",在代码中如何

随机推荐

  1. c#对xml的CURD操作的代码示例
  2. 详解xml与Java之间的转换
  3. xml在powerbuilder中应用的代码示例
  4. 在asp下通过xml打包网站文件的方法
  5. Android开发中关于2个Xml合并问题的实例
  6. 在xml中写动画的实例详解
  7. 通过javascript xml xsl取值及数据修改第
  8. 分享如何订阅没有RSS输出的网站教程
  9. jscript和vbscript对XML元素属性进行操作
  10. 实例详解如何配置Web.xml