代码之家  ›  专栏  ›  技术社区  ›  jdizzle

有没有在运行时访问调试符号的方法?

  •  3
  • jdizzle  · 技术社区  · 15 年前

    下面是一些示例代码,用于说明我想要什么。

    int regular_function(void)
    {
         int x,y,z;
         /** do some stuff **/
         my_api_call();
         return x;
    }
    ...
    void my_api_call(void)
    {
        char* caller = get_caller_file();
        int line = get_caller_line();
        printf("I was called from %s:%d\n", caller, line);
    }
    

    有没有办法实现 get_caller_file() get_caller_line() ?我见过/使用过这样的技巧 #define 惯性导航与制导 my_api_call 作为函数调用传入 __FILE__ __LINE__ 宏。我想知道是否有一种方法可以在运行时而不是编译时访问这些信息(假设它存在)?像Valgrind这样的公司难道不需要做这样的事情来获取它返回的信息吗?

    3 回复  |  直到 15 年前
        1
  •  5
  •   qrdl    15 年前

    如果已经用调试符号编译了二进制文件,则可以使用特殊的库访问它,例如 libdwarf 对于DWARF调试格式。

        2
  •  1
  •   wallyk    15 年前

    这是高度特定于环境的。在大多数提供调试符号的Windows和Linux实现中,工具供应商提供或记录了一种实现这一点的方法。为了得到更好的答案,请提供实现细节。

        3
  •  0
  •   Community Mohan Dere    8 年前

    调试符号(如果可用)需要存储在某个地方,以便调试器能够找到它们。它们可能存储在可执行文件中,也可能不存储在可执行文件中。

    您可能知道或不知道可执行文件名( argv[0] 不需要程序名的完整路径,或者 任何 其中的有用信息-请参阅 here 详细信息)。

    即使可以找到调试符号,也必须对它们进行解码,以尝试找出从何处调用调试符号。

    您的代码可能会被优化到信息无用的程度。

    答案很长。简短的回答是你应该依靠传球 __FILE__ __LINE__ 和你一样。它更轻便,更可靠。