C++面试宝典:__FILE__,__func__,__LINE__

C语言中,__FILE__,__func__,__LINE__常用于logout,debug调试。

注意:其使用不需要定义,__FILE__指示当前文件名,__func__指示当前函数名,__LINE__指示当前运行到的行数。

printf("%s %d\n",__FILE__,__LINE__);

在这里插入图片描述

如果`Dl_info`结构体中的`dli_saddr`字段为空,无法获取函数的起始地址,可以尝试使用其他方法来获取函数地址。 一种可行的方法是使用反汇编器来分析目标文件或库中的符号表和代码段,从而获取函数的地址。常用的反汇编器包括objdump、readelf、IDA等,它们可以解析目标文件或库中的符号表、重定位表和代码段等信息,帮助我们分析和理解程序的执行过程。通过分析符号表和代码段,我们可以找到目标函数的代码地址,并根据函数的调用约定等信息来确定函数的起始地址。 以下是一个示例代码,演示了如何使用objdump工具来获取目标函数的地址: ```c++ #include <stdio.h> #include <stdlib.h> #include <string.h> void foo() { printf("Hello World!\n"); } int main(int argc, char** argv) { if (argc < 2) { printf("Usage: %s <function name>\n", argv[0]); return -1; } const char* func_name = argv[1]; char cmd[256]; sprintf(cmd, "objdump -t a.out | grep %s", func_name); FILE* fp = popen(cmd, "r"); if (!fp) { printf("Failed to execute command: %s\n", cmd); return -1; } char line[256]; while (fgets(line, sizeof(line), fp)) { char* p = strtok(line, " \t"); for (int i = 0; i < 3; ++i) { p = strtok(NULL, " \t"); } void* addr = (void*)strtoull(p, NULL, 16); printf("%s: %p\n", func_name, addr); break; } pclose(fp); return 0; } ``` 在这个示例代码中,我们通过执行`objdump -t a.out | grep <function name>`命令来获取目标函数的符号表信息,然后从中提取出函数的地址信息。这种方法虽然比较繁琐,但是它可以在无法获取符号表等调试信息的情况下仍然能够找到函数的地址。需要注意的是,这种方法可能会受到编译器和平台的限制,不同的编译器和平台可能会有不同的实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值