gpt4 book ai didi

c++ - gdb 从哪里获取代码行?

转载 作者:IT王子 更新时间:2023-10-29 01:26:33 25 4
gpt4 key购买 nike

当我使用 -g 编译程序并获得核心转储时,我可以使用 gdb读取可执行文件和核心转储以调试程序在崩溃前遇到的情况。特点之一gdb优惠是list选项,可以列出使用可执行文件和核心转储编译的源代码。我用了strings -a使用可执行文件和核心转储,我什至找不到一个 iffor语句,而我确定代码中有很多语句。那么代码是从哪里来的呢?我在一台计算机上编译代码并在另一台计算机上运行它,因此生成核心转储的计算机上没有源代码,而且它似乎不在可执行文件或核心转储中。有什么建议么?我真的很想打印可执行文件和核心转储中的所有源代码,这可能吗?我的意思是不运行 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) break main(gdb) run(gdb) list1       in bla.c

.debug_info DWARF 部分有一些关于编译时源文件所在路径的信息,可用于查找相关文件:

$objdump -Wi -wa ./a.out ./a.out:     file format elf64-x86-64./a.outContents of the .debug_info section:  Compilation Unit @ offset 0x0:   Length:        0x4e (32-bit)   Version:       4   Abbrev Offset: 0x0   Pointer Size:  8 : Abbrev Number: 1 (DW_TAG_compile_unit)       DW_AT_producer    : (indirect string, offset: 0x0): GNU C 4.9.1 -mtune=generic -march=x86-64 -g       DW_AT_language    : 1        (ANSI C)       DW_AT_name        : (indirect string, offset: 0x59): bla.c       DW_AT_comp_dir    : (indirect string, offset: 0x31): /home/myself/temp/bla       DW_AT_low_pc      : 0x4004b6       DW_AT_high_pc     : 0xb       DW_AT_stmt_list   : 0x0 : Abbrev Number: 2 (DW_TAG_subprogram)       DW_AT_external    : 1       DW_AT_name        : (indirect string, offset: 0x2c): main       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 byte block: 9c         (DW_OP_call_frame_cfa)       DW_AT_GNU_all_call_sites: 1 : Abbrev Number: 3 (DW_TAG_base_type)       DW_AT_byte_size   : 4       DW_AT_encoding    : 5        (signed)       DW_AT_name        : int : Abbrev Number: 0

每个 DW_TAG_compile_unit 都有关于源文件名和路径的信息,用于查找相关的源文件。

如果您想自己完成,您可能应该阅读 DWARF specifications 的一些相关部分并使用诸如 libdw 之类的库(它是 elfutils 的一部分)。

关于c++ - gdb 从哪里获取代码行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27722578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com