[原创文章] 作者:whq_ddd@163.com 欢迎转载,转载请指明出处: http://blog.csdn.net/whqwhqwhq/article/details/6853084
GCC的-pg 会为每个function call 插入一个_mcount的routine 功能,这个_mcount的原型为
void _mcount(void);
在linux调试时常不知道driver死在了哪个function中, 如果写自己的 _mcount 并且在其中打印出caller那不就解决了!
需要解决的两个问题是
1. 写自己的 void _mcount(void), 并且注意此function 编译时不能加 -pg属性,否则就会自己无限调用自己,直到stack溢出死机!
2. 在_count 中查找caller的地址。这是个小难点。
经测试是可行的。我在mips平台上做的实验,以下内容的mips32平台相关。
mips利用ra寄存器保存caller的返回地址,并且保存在sp中。相当反汇编代码为
00400840 <_mcount>:
400840: 27bdffe0 addiu sp,sp,-32
400844: afbf001c sw ra,28(sp)
400848: afbe0018 sw s8,24(sp)
40084c: 03a0f021 move s8,sp