VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
123
返回列表 发新帖
楼主: larrydeng

函数调用堆栈查看

[复制链接]

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-8 23:15:01 | 显示全部楼层
没看懂,-r 是什么东东?是优化出问题了?

我这边是这样的结果
int foo(3){return foo2();}
foo3:
        pushl   %ebp
        movl    %esp, %ebp
        leave
        jmp     foo2
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-8 23:45:01 | 显示全部楼层
讨论到现在,似乎除了利用bp,没有别的方法可以在一个可执行的程序内部自身实现trace stack么。
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-9 09:45:01 | 显示全部楼层
贴错了... int foo() { return r(); }
晕是因为 gcc 把个数进栈又立刻出栈竟然没有优化掉, 比较有趣 ...
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-9 10:30:01 | 显示全部楼层
嗯嗯,确实
顺便问下我那个leave啥意思……
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-9 11:30:02 | 显示全部楼层
enter leave 本来是 intel 设计的用来管理栈框架的两条指令, 不过失败的是当时这两条指令竟然比经典的 push ebp ; mov ebp , esp ;  .... pop ebp ; 慢了不少, 满搞笑的, 基本上所有的设计编译器的家伙都无视, 你的是啥版本的 gcc ...

leave == ( esp = ebp , pop ebp ) .....

回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-9 15:00:03 | 显示全部楼层
gcc 好像基本上没做这种优化, cl 特别喜欢做这个优化, -O2 下一般的函数就没见产生栈帧,  除非函数里调用了 _alloca , 都是用 esp 访问局部变量 ....

回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-9 15:45:01 | 显示全部楼层
不明白,像这种优化能有什么好处
_alloca是什么东东,在栈上分配空间么?
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-9 23:45:01 | 显示全部楼层
_alloca 就是在 栈上分配空间, C99 的变长数组就是用这个, 有了这个就很难用 esp 定位局部变量和参数 ...

这样应该性能会稍微好点吧, 也多出个寄存器可以用,不过好像没见过M$生成的代码里用过 ebp ...
void foo( int a ) { int a[100] ; a = 1 ; }
-------------------------------------------------
esp -= 400;
*(esp + 400 + 4) = 1;

esp += 400;
ret;

比标准的栈帧少了条指令, 不过往栈里压入数据后, 所有的局部变量和参数的偏移都会改变, 编译器实现起来比较麻烦些 ....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表