VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: larrydeng

函数调用堆栈查看

[复制链接]

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-6 09:30:01 | 显示全部楼层
楼上,从你的示例程序看来,是否必须要在编译的时候自动生成一个symbol table.c ,就像你的全局变量name_rcd[]一样,并且symbol地址是递增存储的,才可以使用这种方式呢?

是否还有别的实现方法?
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-6 15:45:02 | 显示全部楼层
不用生成 symbol , link 时会生成 .pdb  .map 里都有, 不过得想个办法搞清楚 .pdb 的格式
回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-8-6 17:00:01 | 显示全部楼层
学习
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-6 20:15:01 | 显示全部楼层
我不清楚是否有这样的API函数,但我知道实现起来也是很简单的:

创建一个链表,每个节点记录当前的函数名(可以通过宏__FUNCTION__得到函数名);

具体实现过程如下
每进入一个函数,增加一个节点;退出该函数的时候,删除该节点

这样的话,每个函数被调用时,它在链表中的上一个节点就表示调用它的函数,上上一个节点表示上上一个调用它的函数...以次类推,所有的调用关系都出来了
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-7 01:15:01 | 显示全部楼层
楼上你的方法理论上也是可以的,不过实在是太麻烦了……而且增加了许多不必要的开销。

就我所知,vxworks应该是用了和yy偶不会类似的办法,在编译整个系统的过程中,生成了一个symbol table的.c文件,最后这个.c文件也被连接进了最终生成的文件中,trace stack的时候就可以到那个table里去查找了。我想那个table的作用还不止是trace stack, vxworks提供的命令行系统允许我们输入函数名来调用函数,应该也是那个.c文件的功劳。至于pdb、map之类的文件应该只在手工查找的时候有意义吧。
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-8-8 17:45:01 | 显示全部楼层
mark
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-8 18:00:01 | 显示全部楼层
.map 是给人看的, .pdb 是给调试器看的, 里面的东西比你想象的多, 数据类型啊啥的都有, 应该是最方便的 ....
这样做不是很好的, 一旦开了编译器优化就不能用这种办法获得 call stack 了, 因为很多函数都没有生成栈帧 ...
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-8 19:30:01 | 显示全部楼层
楼主好像补充过,不是调试的时候,就只在运行中要用函数看trace stack,总不会让一个可执行文件去找自己的pdb吧……

编译器优化不会一刀切地不生成

push bp
mov bp , sp

吧,不知道gcc优化到几级的时候开始会这样...
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-8 22:15:01 | 显示全部楼层
查了一下,gcc的各项优化说明里都没有提及不建立栈帧,试验结果同样没有发现不建立栈帧的情况
vc会么?
回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-8-8 22:45:01 | 显示全部楼层
gcc 编译优化是做的稍微差了点, cl -O2 时几乎所有的函数都不生成栈帧, 除非函数里调用了 _alloca ...

gcc -O3 -Os 竟然能给函数 int foo() { return f(); } 生成:  
pushl   %ebp
movl    %esp, %ebp
popl    %ebp
jmp     _r
晕死了, 看来是版本太低, 得升级了 .....
回复

使用道具 举报

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

本版积分规则

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

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