我想知道是否有任何方法可以知道当前执行的函数在哪里被调用,这是在什么文件和行中。 我正在使用C语言,我正在寻找类似于__FUNCTION __,__ LIN__或__FILE__宏的东西。
答案 0 :(得分:12)
重命名您的功能
void Function(param1)
{
}
到
void Function_debug(param1, char * file, char * func, unsigned long line)
{
}
然后#define像这样的宏:
#define Function(param1) Function_debug(param1, __FILE__, __FUNCTION__, __LINE__)
答案 1 :(得分:3)
C本身没有什么可以提供这些信息。您可以自己跟踪信息(在进入/退出时)或依赖特定于平台的API来遍历调用堆栈并确定调用函数,但不能更多。
答案 2 :(得分:2)
__FILE__
,__LINE__
等是预处理器宏,可以在编译时轻松扩展到正确的值。可以从许多可能的位置调用函数,因此无法通过预处理器完成。找出来电者的姓名将非常困难;它涉及遍历堆栈并将地址与符号匹配。
如果你能忍受一个小黑客,这可能会有效(未经测试):
/* Add a called argument to your function */
void _myFunction(char *caller, int more_args)
/* And define a macro that adds it automagically */
#define myFunction(a) _myFunction(__FUNCTION__, a)
答案 3 :(得分:1)
在所有实现中都没有任何支持可以执行您想要的操作。我偶尔会发现自己处于同样的情况,我需要跟踪呼叫者的一些方法并执行以下操作:
#ifdef TRACKBACK
int foo(int arg1, int arg2, const char * file, int line)
{
SEND_TO_LOG("foo", file, line);
#else
int foo(int arg1, int arg2)
{
#endif
...
...
当然,它在通话结束时会让人头疼,所以你会想做类似的事情:
#ifdef TRACKBACK
#define TRACKING, __FILE__, __LINE__
#else
#define TRACKING
#endif
然后是电话:
foo(arg1, arg2 TRACKING); //note the lack of the comma
当其他所有方法都失败时,它就会成功。
答案 4 :(得分:0)
如果您需要在运行时了解它,我认为不可能。
如果您需要在调试时知道它,可以在所需的函数上放置一个断点,然后使用GDB(使用 bt 命令)或Vistual Studio的调试器,检查当前的STACK TRACE
答案 5 :(得分:0)
这实际上有点复杂。您最好的选择是在调试器上获得回溯,或者为您的平台找到与pstack类似的内容。手动方式包括遍历调用堆栈并使用调试符号将其转换为文件和行。
答案 6 :(得分:0)
您可以使用日志。
#define BEGIN_FUNC(X,Y,Z) printf("Function %s Entered at line %d from file %s",X,Z,Y)
#define END_FUNC(X) printf("Function %s Exited at line %d from file %s",X,Z,Y)
foo()
{
BEGIN_FUNC(__func__,__FILE__,__LINE__);
//Your code here
END_FUNC(__func___FILE__,__LINE__);
}
OR
在gdb中使用bt。我称之为回溯。