我正在编写一个堆栈跟踪程序,类似于gdb中的backtrace
。
Example Program
void bar(int x, int y){
trace(stdio);
}
void foo(){
bar(1, 2);
}
int main(int argc, char*argv[]){
foo();
}
它会打印出来
Function bar..
Function foo..
问题是我不知道当我到达主要时如何停止。我有一个存储函数起始地址的表,包括main
。
我的方法是trace
函数,我将首先通过编写一个小的汇编代码来阅读ebp
。因此我得到return addr
trace
bar
。
所以我可以通过在trace
中添加offset
{由CALL
指令确定)到bar
的返回地址来获取trace
的起始地址(这利用了相对IP)
但是当我到达main时,我不能使用相同的技术,main
的返回地址将我带到一些我无法访问的内存区域。
如何确定main
函数中的Im? (我希望得到main
)的起始地址
答案 0 :(得分:0)
有很多库可以解决这个问题,即libunwind或libc回溯函数:http://www.gnu.org/software/libc/manual/html_node/Backtraces.html
如果你想自己实现它,你可以解析可执行文件的ELF头。这样您就可以获得函数名称和起始地址/长度。因此,您可以检查您是否已经在名为" main"。
的函数中