QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1300|回复: 2

Memory error

[复制链接]
发表于 2008-6-19 03:29:29 | 显示全部楼层 |阅读模式
我有一个ARM程序,是由一个二进制改写程序改写成的。原二进制程序可以顺利运行,可是改写程序,一启动给出如下错误:

ERROR:io_write a non-exsiting addr:addr = fffff001, data = 45

我设置了LOG选项,可是当这个错误出现时,日志文件尺寸为零。怀疑是改写的二进制程序地址访问错误,于是想用GDB调试,可是搞不清楚这地址是从程序的什么地方来的。

想问一下能不能看到详细的TRACE记录,比如一个导致错误的地址是从程序的哪个指令来的。其它好的调试方法也欢迎推荐。
 楼主| 发表于 2008-6-19 03:33:08 | 显示全部楼层
下面是GDB的一个栈显示,可是我不明白怎么样找到导致错误的改写程序指令。lpc2210_io_write_word 的参数addr含有错误地址。

(gdb) bt
#0  lpc2210_io_write_word (state=0x9d96458, addr=4294963202, data=76)
    at mach/skyeye_mach_lpc2210.c:604
#1  0x08055560 in a71_mmu_write (state=0x9d96458, virt_addr=4294963202, data=76,
    datatype=0) at common/mmu/arm7100_mmu.c:242
#2  0x08054a86 in PutByte (state=0x9d96458, address=4294963202, data=76)
    at common/armvirt.c:157
#3  0x08054b44 in ARMul_ICE_WriteByte (state=0x9d96458, address=4294963202, data=76)
    at common/armvirt.c:647
#4  0x080500e2 in arm_ICE_write_byte (addr=4294963202, v=76 'L')
    at common/arm_arch_interface.c:110
#5  0x08049b0f in tea_load_exec (file=<value optimized out>,
    only_check_big_endian=<value optimized out>) at utils/main/skyeye.c:235
#6  0x0804a003 in main (argc=3, argv=0xbf9f9b44) at utils/main/skyeye.c:718

(gdb) p /x addr
$1 = 0xfffff002

再有,SKYEYE会让地址递增从0xfffff001到0xffffffff。然后给出如下信息:
......
ERROR:io_write a non-exsiting addr:addr = fffffffe, data = 0
SKYEYE:NumInstrs 0, mem_write_byte addr = ffffffff no bank

估计NumInstrs 0  是导致日志文件尺寸为零的原因。

[ 本帖最后由 bitcalc 于 2008-6-19 03:40 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-6-19 17:40:32 | 显示全部楼层
在栈显示中发现导致错误的入口函数是utils/main/skyeye.c中的tea_load_exec。给出导致错误地址。原来是改写的程序一个内存段地址有误导致代码被放到一个不存在的高地址位。通过修正LINKER脚本杀死此错误。

      dest = e2h32(segments.p_paddr);

[ 本帖最后由 bitcalc 于 2008-6-19 17:42 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-6-5 00:04 , Processed in 0.169649 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表