gdb 从哪里获取代码行
From where does gdb take the code lines?
当我使用 -g 编译程序并获得核心转储时,我可以使用gdb
读取可执行文件和核心转储来调试程序在崩溃之前遇到的情况。gdb
提供的功能之一是list
选项,可以列出使用可执行文件和核心转储编译的源代码。我将strings -a
与可执行文件和核心转储一起使用,我什至找不到一个if
或for
语句,而我确信代码有很多语句。那么代码是从哪里来的呢?我在一台计算机上编译代码并在另一台计算机上运行它,因此源代码在生成核心转储的计算机上不可用,并且它似乎不在可执行文件或核心转储中。有什么建议吗?我真的想打印可执行文件和核心转储中的所有源代码,可以吗?我的意思是不运行gdb
,我相信可以编写一个使用 gdb 并且可以列出整个代码的脚本,但我有兴趣在没有gdb
的情况下自己做,因为我想了解源代码是从哪里获取的格式,我想尽可能多地了解它。
行信息位于可执行文件的 .debug_line
个 DWARF 部分中:
$readelf -wL ./a.out
Decoded dump of debug contents of section .debug_line:
CU: bla.c:
File name Line number Starting address
bla.c 2 0x4004b6
bla.c 3 0x4004ba
bla.c 4 0x4004bf
本节将指令指针地址映射到给定文件中的行号。
为了查找文件的内容,您需要能够找到相关的源文件。如果移动/重命名源文件,GDB 将无法打印源代码:
MV bla.c bla2.cgdb ./a.out(GDB) 中断主要(GDB) 运行(GDB) 列表1 在 bla.c
.debug_info
DWARF 部分包含一些有关源文件编译时路径的信息,这些信息可用于查找相关文件:
$objdump -wi -wa ./a.out./a.out: 文件格式 elf64-x86-64./a.out.debug_info部分的内容: 编译单元 @ 偏移量0x0: 长度:0x4e(32 位) 版本: 4 缩写偏移量:0x0 指针大小:8 : 缩写号: 1 (DW_TAG_compile_unit) DW_AT_producer : (间接字符串, 偏移量: 0x0): GNU C 4.9.1 -mtune=generic -march=x86-64 -g DW_AT_language : 1 (ANSI C) DW_AT_name :(间接字符串,偏移量:0x59):bla.c DW_AT_comp_dir : (间接字符串, 偏移量: 0x31):/home/myself/temp/bla DW_AT_low_pc : 0x4004b6 DW_AT_high_pc : 0xb DW_AT_stmt_list : 0x0 : 缩写号: 2 (DW_TAG_subprogram) DW_AT_external : 1 DW_AT_name:(间接字符串,偏移量:0x2c):主 DW_AT_decl_file : 1 DW_AT_decl_line : 2 DW_AT_type : DW_AT_low_pc : 0x4004b6 DW_AT_high_pc : 0xb DW_AT_frame_base : 1 字节块: 9c (DW_OP_call_frame_cfa) DW_AT_GNU_all_call_sites: 1 : 缩写号: 3 (DW_TAG_base_type) DW_AT_byte_size : 4 DW_AT_encoding : 5 (签名) DW_AT_name : int : 缩写数: 0
每个DW_TAG_compile_unit
都有有关源文件名和路径的信息,这些信息用于查找相关的源文件。
我想自己做这一切,你可能应该阅读 DWARF 规范的一些相关部分并使用像 libdw(它是 elfutils 的一部分)这样的库。
相关文章:
- visual c++,如何获取解决方案目录中的代码
- 我无法获取以下代码的输出
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何在 WSL 上获取 VS 代码以调试我的C++代码?
- 从两个 4x64 位整数数组中获取取模
- 如何从日志文件中抓取状态代码?(在 C++ 中)
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 代码在执行之前终止,并且没有从用户那里获取输入
- 有没有办法在c ++中清除空数组,请检查下面的代码以获取说明
- 如何获取C++中的输入并将其"split"到列表中?换句话说,取 N 个输入并放入 N 长度的数组中
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 在我的以下代码中获取 MLE(内存限制错误).尝试解决 ROUND C 2019(问题 A-摆动行走)启动问题
- 虚幻引擎 - 如何通过C++代码获取轴映射
- 为代码厨师中的每个代码获取 SIGEMT 错误
- 通过查找一对项目的代码获取错误的输出,在给定的总和相等的给定列表中列表
- 如何从C 代码获取项目名称
- 指向指针的STD迭代器;为应该是等价的代码获取不同的类型
- OpenCV 2.2 VS2010 - 用非常简单的代码获取"Access violation reading"
- 无法从调用Java代码的本机代码获取类引用