我正在编写一个类似于 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 时我不知道如何停止。我有一个存储函数起始地址的表,包括 main
。
我的方法是针对trace
函数,我会先通过编写一个小的汇编代码来读取ebp
。因此,我得到了 bar
中 trace
的 return addr
。
所以我可以通过添加一个偏移量
来获取trace
的起始地址(由bar
中的CALL
指令决定) >) 到 trace
的返回地址(这里使用相对 IP)
但是当我到达 main 时,我不能使用相同的技术,main
的返回地址将我带到一些我无法访问的内存区域。
如何确定 Im 已经在 main
函数中? (希望得到main
的起始地址)
最佳答案
有很多可用的库已经解决了这个问题,即 libunwind 或 libc backtrace 函数:http://www.gnu.org/software/libc/manual/html_node/Backtraces.html
如果您想自己实现它,您可以解析可执行文件的 ELF header 。这样你就可以获得函数名称和起始地址/长度。所以你可以检查你是否已经在一个名为“main”的函数中。
关于c - 如何确定main的起始地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21056200/