linux下C语言如何在运行时得到调用我的函数的文件名和行号

时间:2021-09-28 09:07:02
          linux系统下C语言写了一个函数,我想在这个函数里面打印出调用这个函数的文件的文件名和调用所在行的行号。
          请不要告诉我用__FILE__和__LINE__宏,他们只能得到自己所在的文件名和行号,无法得到调用方的文件名和行号。
          比如:
          file1.c

          void my_fun()
          {
                    /*打印file2.c的文件名和行号(这里应该为5)*/
           }


           file2.c

            extern void my_fun();

            int main()
            {
                    my_fun();
                    return 0;
             }


           谢谢!!!

16 个解决方案

#1


做不到。要不然你再做一件错误的事情,要不然你在用错误的方式。

#2


#include <stdio.h>

void fun(int a)
{
printf("%d\n", a);
}

int main()
{
fun(__LINE__);

return 0;
}

#3


问题解决结贴吧
拿次分真的很难~~

#4


// 这样声明
void* fun(char const* file, int line);

// file2.c main函数中调用
fun(__FILE__, __LINE__);

这样在file1.c中的fun函数就得到了调用方的文件名的行号

#5


不好意思,不能修改参数表。是这样的,我想用我自己的my_malloc函数代替malloc函数来实现对程序动态内存使用的跟踪,而这种替换又必须是自动的,不能让程序员察觉,所以我通过使用
#define malloc my_malloc
这样的方式来替换名字,参数表要和malloc一模一样,也就意味着参数表不能更改。

#6


如果不能做到,那像valgrind这样的内存跟踪工具是怎样做到的呢?

#7


linux下应该有打印函数调用堆栈的函数吧?
像win32有StackWalk64函数,linux应该有类似的吧?

#8


引用 7 楼 demon__hunter 的回复:
linux下应该有打印函数调用堆栈的函数吧?
像win32有StackWalk64函数,linux应该有类似的吧?

看错了lz需求,请无视吧。

#9


大虾们帮帮忙啊。。。

#10


#define m_fun(args)  fun(__FILE__,__LINE__, args)

#11


不定参数能用吗?
类似于这样的?
int test(char *str, int flag, ...);

#12


谢谢“南宫笨耗子”,用你的方法实现了。我想多问一句,为什么预编译的时候没有把#define m_fun(args) fun(__FILE__,__LINE__, args)这句宏定义里面的__FILE__和__NAME__宏替换掉呢,而是到了m_fun函数那里才替换。这种嵌套的宏定义有什么要注意的吗?

#13


引用 12 楼 caomiao2006 的回复:
谢谢“南宫笨耗子”,用你的方法实现了。我想多问一句,为什么预编译的时候没有把#define m_fun(args) fun(__FILE__,__LINE__, args)这句宏定义里面的__FILE__和__NAME__宏替换掉呢,而是到了m_fun函数那里才替换。这种嵌套的宏定义有什么要注意的吗?

我也想知道,求教~

#14


可以详细点吗 我还是看不懂  我也需要这个问题的答案了  

#15


可以写个小程序么  给我看看么  我有点不懂

#16


引用 12 楼 caomiao2006 的回复:
谢谢“南宫笨耗子”,用你的方法实现了。我想多问一句,为什么预编译的时候没有把#define m_fun(args) fun(__FILE__,__LINE__, args)这句宏定义里面的__FILE__和__NAME__宏替换掉呢,而是到了m_fun函数那里才替换。这种嵌套的宏定义有什么要注意的吗?


能解释一下这个函数的用法吗?

#1


做不到。要不然你再做一件错误的事情,要不然你在用错误的方式。

#2


#include <stdio.h>

void fun(int a)
{
printf("%d\n", a);
}

int main()
{
fun(__LINE__);

return 0;
}

#3


问题解决结贴吧
拿次分真的很难~~

#4


// 这样声明
void* fun(char const* file, int line);

// file2.c main函数中调用
fun(__FILE__, __LINE__);

这样在file1.c中的fun函数就得到了调用方的文件名的行号

#5


不好意思,不能修改参数表。是这样的,我想用我自己的my_malloc函数代替malloc函数来实现对程序动态内存使用的跟踪,而这种替换又必须是自动的,不能让程序员察觉,所以我通过使用
#define malloc my_malloc
这样的方式来替换名字,参数表要和malloc一模一样,也就意味着参数表不能更改。

#6


如果不能做到,那像valgrind这样的内存跟踪工具是怎样做到的呢?

#7


linux下应该有打印函数调用堆栈的函数吧?
像win32有StackWalk64函数,linux应该有类似的吧?

#8


引用 7 楼 demon__hunter 的回复:
linux下应该有打印函数调用堆栈的函数吧?
像win32有StackWalk64函数,linux应该有类似的吧?

看错了lz需求,请无视吧。

#9


大虾们帮帮忙啊。。。

#10


#define m_fun(args)  fun(__FILE__,__LINE__, args)

#11


不定参数能用吗?
类似于这样的?
int test(char *str, int flag, ...);

#12


谢谢“南宫笨耗子”,用你的方法实现了。我想多问一句,为什么预编译的时候没有把#define m_fun(args) fun(__FILE__,__LINE__, args)这句宏定义里面的__FILE__和__NAME__宏替换掉呢,而是到了m_fun函数那里才替换。这种嵌套的宏定义有什么要注意的吗?

#13


引用 12 楼 caomiao2006 的回复:
谢谢“南宫笨耗子”,用你的方法实现了。我想多问一句,为什么预编译的时候没有把#define m_fun(args) fun(__FILE__,__LINE__, args)这句宏定义里面的__FILE__和__NAME__宏替换掉呢,而是到了m_fun函数那里才替换。这种嵌套的宏定义有什么要注意的吗?

我也想知道,求教~

#14


可以详细点吗 我还是看不懂  我也需要这个问题的答案了  

#15


可以写个小程序么  给我看看么  我有点不懂

#16


引用 12 楼 caomiao2006 的回复:
谢谢“南宫笨耗子”,用你的方法实现了。我想多问一句,为什么预编译的时候没有把#define m_fun(args) fun(__FILE__,__LINE__, args)这句宏定义里面的__FILE__和__NAME__宏替换掉呢,而是到了m_fun函数那里才替换。这种嵌套的宏定义有什么要注意的吗?


能解释一下这个函数的用法吗?