2020-07-07

运行异常的debug方法

通常发生异常会打出一串backtrace 信息,如:

  1. 只打出函数+偏移+文件
    PC is at MDrv_Data + 0x350/0x520 [dtv_driver.ko]
  2. 只打出函数+偏移
    PC is at mdp_s_ctrl+0x2f4/0x3b8
  3. 打出有pc地址
    pc:[] lr:[] pstate:60000145

对于第一种stack trace只印出函数+偏移+文件的情况,我们可以有两个方向来debug
1.nm+addr2line
2.objdump+addr2line

1.nm+addr2line
1.1首先应该是先在代码里面找到与log对应带symbol的lib/so
find binary or .so in your local folder(with debug symbols)
1.2 用nm命令找到函数代码地址addr
locate the crash function’s address by:
nm *.so | grep function
1.3 计算出出错的地方
crash_address = addr + offset
1.4 find out which line in source code by:
addr2line -e *.so creash_address

2.1 去source code找对应的带symbol 的文件
2.2使用objdump 反编译dtv_driver.o
objdump -dSI dtv_driver.o > dtv_driver.asn -rn
2.3找到函数在dtv_driver.ko的相对地址
$ 00000002ea508 ;
2.4找到挂在哪句代码
addr2line -Cfe dtv_driver.ko -a ‘00002ea508+0x350’

二、对于第二种log中只能看到PC is at mdp_s_ctrl+0x2f4/0x3b8,需要借助于nm命令先定位到哪个函数。
nm vmlinux | grep mdp_s_ctrl
把得到的该函数首地址加上偏移就可以得出引起crash 的代码行。0xffffff80087b6768+0x2f4=0xffffff8087b6aac.再用addr2line定位:
addr2line -f -e vmlinux 0xffffff80087b6aac

三、对于打出有PC地址的的情况
我们可以直接定位:
symbol可能是包含在vmlinux或者某个driver的ko中,下面以vmlinux 为例来说明
addr2linux -f -e vmlinux 0xffffff80087b6aac

注意事项
若以上nm,addr2line看到的信息全是问号,说明kernel不包含debug信息。需要在deconfig中打开:CONFIG_DEBUG_INFO=y,再来编译kernel

user space也一样

你可能感兴趣的:(笔记)