在查内核驱动的音频bug时,好几次因为函数指针的引用不最终不知是哪个函数调用了当前函数(如.hw_params=XXX_XX_hw_params,然后好多地方调用hw_params就囧了)。幸好,找到了这个工具,志之:
在当前函数的任何地方调用__builtin_return_address(0)并printk返回值,在运行后得到返回值0xc1234568,再用这个值从目标文件中查找到对应的符号(arm-linux-addr2line 0xc1234568 -e vmlinux -f),此符号即为调用当前函数的调用者的函数名。
PS:网络上找到说,可以用__builtin_return_address(1)、(2)...返回更高层次调用函数的地址,为什么我用的时候返回的更高层次调用函数的地址都是0呢,要是能这么用就免去多次编译测试的步骤,多好呀。望有高手,高抬贵手指教一二,多谢。
PS2:坛子里给出了更给力的办法,调用:dump_stack();
阅读(5411) | 评论(0) | 转发(0) |