关于gcc:调试选项-g如何更改二进制可执行文件?

关于gcc:调试选项-g如何更改二进制可执行文件?

How Does The Debugging Option -g Change the Binary Executable?

在编写C / C ++代码时,为了调试二进制可执行文件,必须在编译器/链接器上启用debug选项。 对于GCC,该选项为-g。 启用调试选项后,对二进制可执行文件有何影响? 文件中还存储哪些其他数据,以允许调试器功能正常运行?


-g告诉编译器将符号表信息存储在可执行文件中。除其他外,这包括:

  • 符号名称
  • 输入符号信息
  • 符号来自的文件和行号

调试器使用此信息为符号输出有意义的名称,并将指令与源代码中的特定行相关联。

对于某些编译器,提供-g将禁用某些优化。例如,除非明确指出-O [123],否则icc会使用-g将默认优化级别设置为-O0。此外,即使您确实提供了-O [123],仍会禁用阻止堆栈跟踪的优化(例如,从堆栈帧中删除帧指针。这对性能的影响很小)。

对于某些编译器,-g将禁用可能混淆符号来源的优化(指令重新排序,循环展开,内联等)。如果要通过优化进行调试,则可以在gcc中使用-g3来解决一些问题。有关宏,扩展和可能内联的功能的其他调试信息将包括在内。这可以使调试器和性能工具将优化的代码映射到原始源,但这是最大的努力。一些优化确实使代码混乱。

有关更多信息,请查看DWARF,它最初是与ELF一起使用的调试格式(Linux和其他OS的二进制格式)。


将符号表添加到可执行文件中,该表将函数/变量名称映射到数据位置,以便调试器可以报告回有意义的信息,而不仅仅是指针。这不会影响程序的速度,您可以使用" strip"命令删除符号表。


除了调试和符号信息
Google DWARF(有关ELF的开发人员笑话)

默认情况下,启用调试后,大多数编译器优化功能均处于关闭状态。
因此,代码是源代码到机器代码的纯翻译,而不是应用于发行二进制文件的许多高度专业化转换的结果。

但是最重??要的区别(在我看来)
通常将Debug构建中的内存初始化为某些编译器特定的值,以利于调试。在发行版中,除非应用程序代码明确进行初始化,否则不会初始化内存。

检查您的编译器文档以获取更多信息:
但是DevStudio的示例是:

  • 0xCDCDCDCD Allocated in heap, but not initialized
  • 0xDDDDDDDD Released heap memory.
  • 0xFDFDFDFD "NoMansLand" fences automatically placed at boundary of heap memory. Should never be overwritten. If you do overwrite one, you're probably walking off the end of an array.
  • 0xCCCCCCCC Allocated on stack, but not initialized

-g在可执行文件中添加调试信息,例如变量名,函数名和行号。这使调试器(例如gdb)可以逐行逐步执行代码,设置断点并检查变量的值。由于存在这些附加信息,因此-g会增加可执行文件的大小。

同样,gcc允许将-g与-O标志一起使用,这会打开优化。调试优化的可执行文件可能非常棘手,因为可能会优化掉变量或以不同的顺序执行指令。通常,使用-g时关闭优化是一个好主意,即使这样做会使代码慢得多。


某些操作系统(如z / OS)会生成一个包含调试符号的"辅助文件"。这有助于避免使用额外信息使可执行文件膨胀。


只是出于兴趣,您可以打开一个hexeditor并查看使用-g生成的可执行文件和不使用-g生成的可执行文件。您可以看到符号和添加的内容。它也可能会更改程序集(-S),但是我不


这个问题有些重叠,从另一个方面涵盖了这个问题。


推荐阅读

    linux下进程调试命令?

    linux下进程调试命令?,系统,工作,软件,信息,命令,基础,地址,状态,进程,实时,L

    linux网口调试命令?

    linux网口调试命令?,系统,工作,地址,信息,网络,技术指标,状态,电脑,命令,网

    linux命令多个选项?

    linux命令多个选项?,系统,工作,基础,信息,命令,工具,数据,不了,名称,环境,Lin

    linux常用命令选项?

    linux常用命令选项?,工作,系统,信息,地址,管理,命令,标准,网络,目录,常用命

    linux命令行调试代码?

    linux命令行调试代码?,环境,代码,信息,平台,程序,编辑,版本,步骤,体系结构,

    linux下单步调试命令?

    linux下单步调试命令?,信息,系统,代码,工程,地址,工具,工作,数据,管理,环境,l

    linux串口调试命令?

    linux串口调试命令?,设备,数据,信息,数字,系统,标准,通讯,软件,通用,状态,lin

    linux没有命令行选项?

    linux没有命令行选项?,系统,首页,命令,工具,分析,第一,软件,异常,终端,空格,

    linux启用命令模式?

    linux启用命令模式?,系统,密码,数字,首页,电脑,情况,终端,界面,模式,命令,安

    linux启用6g命令?

    linux启用6g命令?,系统,工作,情况,信息,设备,指标,管理,地址,命令,状态,在lin

    linux二进制执行命令?

    linux二进制执行命令?,系统,工作,情况,代码,信息,位置,地址,命令,文件,目录,L

    linux调试终端命令?

    linux调试终端命令?,系统,工作,地址,首页,电脑,终端,命令,标准,信息,基础,求L

    linux命令选项说明?

    linux命令选项说明?,系统,标准,地址,设备,命令,工作,软件,工具,基础,数据,Lin

    linux脚本调试的命令?

    linux脚本调试的命令?,工作,系统,管理,命令,地址,标准,脚本,底部,代码,官网,l

    linux7个命令选项?

    linux7个命令选项?,标准,管理,系统,基础,地址,命令,环境,单位,工具,信息,linu

    linux命令调试模式?

    linux命令调试模式?,系统,工作,信息,地址,工程,命令,工具,环境,设备,地方,lin

    linux常用命令及选项?

    linux常用命令及选项?,工作,系统,地址,管理,信息,网络,命令,目录,文件,操作,l

    linux调试驱动的命令?

    linux调试驱动的命令?,系统,网络,官网,百度,地址,下来,第一,官方网站,软件,

    linux命令调试过程?

    linux命令调试过程?,代码,通用,地方,信息,系统,程序,进程,命令,编辑,断点,如

    linux命令选项是什么?

    linux命令选项是什么?,系统,地址,工作,管理,命令,信息,选项,检测,标准,简介,