bitcalc 发表于 2008-6-19 03:29:29

Memory error

我有一个ARM程序,是由一个二进制改写程序改写成的。原二进制程序可以顺利运行,可是改写程序,一启动给出如下错误:

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

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

想问一下能不能看到详细的TRACE记录,比如一个导致错误的地址是从程序的哪个指令来的。其它好的调试方法也欢迎推荐。

bitcalc 发表于 2008-6-19 03:33:08

下面是GDB的一个栈显示,可是我不明白怎么样找到导致错误的改写程序指令。lpc2210_io_write_word 的参数addr含有错误地址。

(gdb) bt
#0lpc2210_io_write_word (state=0x9d96458, addr=4294963202, data=76)
    at mach/skyeye_mach_lpc2210.c:604
#10x08055560 in a71_mmu_write (state=0x9d96458, virt_addr=4294963202, data=76,
    datatype=0) at common/mmu/arm7100_mmu.c:242
#20x08054a86 in PutByte (state=0x9d96458, address=4294963202, data=76)
    at common/armvirt.c:157
#30x08054b44 in ARMul_ICE_WriteByte (state=0x9d96458, address=4294963202, data=76)
    at common/armvirt.c:647
#40x080500e2 in arm_ICE_write_byte (addr=4294963202, v=76 'L')
    at common/arm_arch_interface.c:110
#50x08049b0f in tea_load_exec (file=<value optimized out>,
    only_check_big_endian=<value optimized out>) at utils/main/skyeye.c:235
#60x0804a003 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 编辑 ]

bitcalc 发表于 2008-6-19 17:40:32

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

      dest = e2h32(segments.p_paddr);

[ 本帖最后由 bitcalc 于 2008-6-19 17:42 编辑 ]
页: [1]
查看完整版本: Memory error