我被分配的任务是在许多 C 文件中的所有指针变量名称中添加 p_
前缀。这必须应用于函数参数、本地函数数据和全局变量。
一旦获得列表,我就可以使用 sed
来做我想做的事情。
但是我怎样才能获得列表呢?
最佳答案
一切都在调试信息中。
请参阅这个简单的示例 ( ptr.c
)。
int *global_pointer;
float global_scalar;
int main(int arg_scalar, char **arg_pointer) {
void *local_pointer;
char local_scalar;
}
让我们编译它并检查 objdump
的结果
gcc -g ptr.c && objdump --dwarf=info a.out
这并不难理解。 (DW_TAG_pointer_type)
出现了几次。在我的示例中,有四个。
<1><8d>: Abbrev Number: 6 (DW_TAG_pointer_type)
<1><93>: Abbrev Number: 6 (DW_TAG_pointer_type)
<1><a0>: Abbrev Number: 8 (DW_TAG_pointer_type)
<1><b8>: Abbrev Number: 6 (DW_TAG_pointer_type)
注意它们前面的十六进制数字,并以 DW_AT_type : <0xb8>
的形式查找包含它们的部分。 。类型为 0xb8 的整个部分是:
<1><a2>: Abbrev Number: 9 (DW_TAG_variable)
<a3> DW_AT_name : (indirect string, offset: 0x3a): global_pointer
<a7> DW_AT_decl_file : 1
<a8> DW_AT_decl_line : 1
<a9> DW_AT_type : <0xb8>
<ad> DW_AT_external : 1
<ae> DW_AT_location : 9 byte block: 3 78 8 60 0 0 0 0 0 (DW_OP_addr: 600878)
有变量的名称,以及声明它的行。还有文件号,但我只有一个源文件,所以它始终是 1。这就是您查找它所需的全部内容,也许可以使用awk
的帮助,除非你做了一些非常丑陋的事情,比如声明一个全局变量,然后声明一个具有相同名称的本地变量,所有这些都在一行中。如果有某种编码标准就不太可能:)
关于c - 如何从C文件中获取所有指针变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31744639/