卢家顺的笔记 https://bbs.21ic.com/?513681 [收藏] [复制] [RSS]

日志

AXD使用技巧

已有 2327 次阅读2009-8-9 08:08 |个人分类:arm7|系统分类:ARM| 调试, axd, ads1.2

我最近用H-JTAG调试一个程序。此程序经常莫名复位,因为还算菜鸟的原因,不知道怎么去调试。刚开始的方法,将H-JTAG打开,然后用axd进行调试。当发生复位的时候,我认真的查看所有的全局变量,没有找到原因。我用register命令,发现是data abort导致的。根据我的经验,我将data abort的r14的值减去8赋值给pc,程序停在了memcpy函数里。那肯定是这个函数出现了问题。然后我就用一个笨法子,将我修改的代码的memcpy函数分别用全局变量,比如在执行前为1,在memcpy执行后,全局变量为2。后来发现复位的时候,这些值都是2,也就是说memcpy在我添加的函数里没有问题。难道是影响了其他的程序了?我用backtrace,跟踪不到。搞了半天,一筹莫展,后来发现register的usr有个r14,我就将这个值直接赋给pc,发现程序停在了一个memcpy附近,问题找到。


由此我,我进一步感到了调试技巧的重要性,也进一步在思路上整理了用ads1.2的AXD的调试技巧。
    1)axd的单步运行,跳进函数,跳出函数,调到光标处,设置断点,这些就不说了,看到明白了。
    2)register的使用,我觉得用2个方面,一是当你想重启复位程序的时候,pc赋值为0,二是当你的程序出现prefectch或者 data  abort的时候,可以通过异常的r14查到是在哪里出现异常的,然后将user得r14-8赋值到pc,可以找到这个函数的上一个函数是哪个。有时导致异常的往往是在库函数,你不容易发现时那里出错的,比如我上面所讲的。
    3)memory的使用,这个也是重要的调试技巧,直接查看内存,有时候,你可能调试的时候,希望改变某个变量的值,希望测试程序的另一个跳转程序的正确性,你可以直接在内存中修改。比如 if(a){b}else{c},假设a为真,测试的是代码b,如果你想测试代码a,你可以修改a的值,当然通过variable来修改更容易。
   4)variable的使用,在查找变量的值是很重要,可以查看全局变量和局部变量,很实用。


此外,本人在对设置断点的时候,也有一点心得。比如if(a){b},其中b是一行c语言代码。我在b设断点,但是a不成立的时候,b也执行,我后来用汇编查看,发现了汇编后的结果,才晓得原因,因为断点式可以设置在一行汇编代码,而我这设置的断点,被分成多于一条汇编。我建议如果设置断点有问题,可以汇编看看,就知道该怎么办了,或者在汇编上加断点,或者把b再多些一行,如if(a){bb}。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)