- 论坛徽章:
- 0
|
这个问题已经差不多解决了,也给大家分享下我所知道的,不对的请大家指正。
4楼的朋友说的很对啊,使用__builtin_return_address是可以获取到函数返回地址的,这里所说的返回地址并不是函数的地址,是我们使用call function以后要压栈的下一条指令的地址,但是根据此地址查找符号文件找到距此地址最近的函数名称。我在gdb调试中发现,当__builtin_return_address的参数为零的时候返回值实际上是调用它的函数(caller)中的地址,所以我理解这里参数为零是在当前函数栈中存储的返回地址,依次类推。
另外我也用汇编实现了下类似__builtin_return_address的功能,也请大家指正!
int get_return_address(int iLevel)
{
__asm__("pushl %%ebx\n\t"
"movl %%ebp,%%eax\n\t"
"movl 12(%%esp),%%ebx\n\n"
"__next:\n\t"
"test %%ebx,%%ebx\n\t"
"je __break\n\t"
"dec %%ebx\n\t"
"movl (%%eax),%%eax\n\t"
"jmp __next\n\n"
"__break:\n\t"
"movl 4(%%eax),%%eax\n\t"
"pop %%ebx\n\t"
::
);
}
小弟还有个问题,希望有高人能指点下!
在我们程序运行的当前栈中,如何定位到main函数,因为我们c程序执行都是从main函数开始执行的,我们通过在栈中找上一层函数的地址,如何判断哪一层已经是main函数的栈了呢?就像gdb里面一样,使用bt(backtrace)以后我们可以得到当前栈的信息。 |
评分
-
查看全部评分
|