GDB如何获取本地不存在的全局变量与函数的源文件名?
GDB如何获取全局变量对应的源文件名(源文件不在本地时)
这核心原因是调试信息在编译阶段就被嵌入到目标文件里了,和本地有没有源文件完全没关系:
编译时嵌入调试元数据:用GCC/Clang编译程序时,只要加了
-g参数,编译器就会把源文件名、变量定义的行号、类型信息等调试数据,打包进ELF可执行文件或.so库的特定段中(比如.debug_info、.debug_line这类以.debug_开头的段)。就算你把编译好的程序拷贝到没有源文件的机器上,这些调试信息依然保存在文件里。GDB直接读取ELF中的调试段:当你用gdb附加到进程后,它会去解析进程映射的主程序和所有加载的.so库,读取这些调试段里的数据,从中提取出全局变量对应的源文件名、定义位置等信息,根本不需要本地存在对应的源文件。
你可以自己验证:用
readelf -S <你的可执行文件或so文件>命令,能看到文件里的.debug_*段;或者用objdump --dwarf=info <目标文件>,直接查看调试信息里的源文件与变量的关联内容。
内容的提问来源于stack exchange,提问作者CarloC
相关产品推荐
相关产品推荐

