【发布时间】:2018-09-15 18:23:03
【问题描述】:
目前,我正在编写一些日志记录逻辑,并想做一些缩进。了解是否存在任何函数调用或某个函数是否已完成的最简单方法是查看堆栈/帧的当前地址。假设堆栈倒置增长,那么如果log() 调用中的堆栈地址较小,那么在上一次调用期间我们可以增加缩进,因为存在一些函数调用。我知道有像backtrace() 这样的函数知道如何转储它,或者您可以使用一些程序集,但是,我记得读取可用于检索此信息的外部变量。有人可以命名这些变量或提供参考我在哪里可以找到它们(据我所知,它是在一些计算机系统书籍中,如“计算机系统:程序员的观点”)。否则,获取此信息最方便/快捷的方式是什么?
【问题讨论】:
-
如果你想知道当前正在执行什么函数,我想你想查看当前的 RIP(程序计数器),而不是 RSP(堆栈指针)。
libm中的log()可能是一个叶子函数,所以它不会调用其他函数。还是您正在编写自己的函数,其名称与执行无关操作的数学库函数的名称相同? -
'log()' 只是我的宏/函数,它应该查看帧地址(在其中调用它)并将其与以前的地址进行比较,因此 RIP 对我没有兴趣
-
gcc下可以使用特殊功能:__builtin_return_address、__builtin_frame_address等。详见gcc信息页面 -
就像@R 所说的,这是一个高度专业化的领域。 GCC 提供 Backtrace API 来遍历堆栈。请参阅 GCC 手册中的 34.1 Backtraces。我不记得用于 MSVC 和 Windows 的类似 API。 John Robbin 的Debugging Applications 书可能有一些建议,但我手头没有。它可能是调试工具 SDK 的一部分。