编译器的“-O0”选项和“-Og”选项有什么区别?

2024-03-17

当我想要调试 C 或 C++ 程序时,我被教导使用-O0关闭优化,以及-ggdb将符号插入到为使用 GNU 而优化的可执行文件中gdb调试器,我使用它(或者,你可以使用-glldb对于 LLVM/clang 来说lldb调试器,或者只是-g对于一般调试符号,但这不会那么好-ggdb显然...)。然而,我最近偶然发现有人说要使用-Og(代替-O0),这让我措手不及。果然,它在man gcc!:

-Og优化调试体验。-Og启用不干扰调试的优化。它应该是标准编辑-编译-调试周期选择的优化级别, 提供合理的优化水平,同时保持快速编译和良好的调试体验。

那么,有什么区别呢?这是-O0描述来自man gcc:

-O0减少编译时间并使调试产生预期结果。这是默认设置。

man gcc清楚地说-Og不过,“应该是标准编辑-编译-调试周期选择的优化级别”。

这听起来像-O0确实是“没有优化”,而-Og是“进行了一些优化,但仅限于那些不干扰调试的优化。”它是否正确?那么,我应该使用哪个,为什么?

Related:

  1. 相关,但不重复! (仔细阅读,它根本不是重复的):-O0、-O1 和 -g 有什么区别 https://stackoverflow.com/questions/9663838/what-is-the-difference-between-o0-o1-and-g
  2. 我对调试的回答--copt=与 Bazel 一起使用的设置:gdb:当前上下文中没有符号“i” https://stackoverflow.com/questions/3758614/gdb-no-symbol-i-in-current-context/63386031#63386031

快速总结

Do not use -Og. -Og中断调试。

Use -ggdb -O0(如果使用的话首选gdb调试器),或-g3 -O0反而。

Using -g -O0也没关系,但是-g单独默认为调试级别 2 (-g2),这意味着相比-g3, -g缺少“额外信息,例如程序中存在的所有宏定义”。 (看man gcc并搜索-glevel).

Details

@kaylum 刚刚在我的问题下的评论中提供了一些很棒的见解!我最关心的关键部分是:

[-Og] 对于生成可调试代码来说是比 -O0 更好的选择,因为一些收集调试信息的编译器传递在 -O0 处被禁用。

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

So, from now on I'm using -Og (NOT -O0) in addition to -ggdb.


2020 年 8 月 13 日更新:

见鬼!没关系。我坚持-O0.

With -Og I get <optimized out> and Can't take address of "var" which isn't an lvalue.到处都是错误!我无法再打印我的变量或检查它们的内存!前任:

(gdb) print &angle
Can't take address of "angle" which isn't an lvalue.
(gdb) print angle_fixed_p
$6 = <optimized out>

With -O0不过,一切正常!

(gdb) print angle
$7 = -1.34869879e+20
(gdb) print &angle
$8 = (float *) 0x7ffffffefbbc
(gdb) x angle
0x8000000000000000:     Cannot access memory at address 0x8000000000000000
(gdb) x &angle
0x7ffffffefbbc: 0xe0e9f642

所以,回到使用-O0代替-Og it is!

Related:

  1. [他们还推荐-O0,我同意]gdb 中的 是什么意思? https://stackoverflow.com/questions/5497855/what-does-value-optimized-out-mean-in-gdb/5497906#5497906
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器的“-O0”选项和“-Og”选项有什么区别? 的相关文章

随机推荐

  • DynamoDB 如何同时支持 Key-Value 和 Document 数据库属性

    根据 DynamoDB 的文档 它支持 NoSQL 的键值和面向文档的属性 即使其他 NoSQL 数据库仅属于一种类型 键值 文档 图形或面向列 它还说 Amazon DynamoDB 基于 Dynamo 的原则构建 3 是 AWS 基础设
  • 必须调用“render :layout => false”才能在 Rails 2.3.3 中正确渲染 js.erb 模板

    我正在运行最新的 Rails 2 3 stable 分支 当前为 2 3 3 我正在使用 JQuery 将 AJAX 请求发布到我的 创建 操作 其中有以下块 respond to do format format js end 我创造了c
  • 如何设置应用内购买(非消耗品)?

    我正在使用一些在线教程在我的应用程序中实现应用程序内购买 但该教程适用于消费品应用内购买 但就我而言 用户只需要购买一次 我修改了代码 在购买应用内购买后禁用 购买按钮 现在一切正常 但问题是 如果我关闭并打开应用程序 购买按钮 就会启用
  • 使用 java 中的参数执行 shell 脚本

    我已经用谷歌搜索了一段时间 每个人似乎都有不同的解决方案 但似乎没有一个对我有用 我都尝试过ProcessBuilder and Runtime 两者都调用 sh直接文件并将其输入 bin bash 没有运气 回到基础 我当前的代码如下 S
  • 如何将 org.w3c.dom.Document 对象转换为字符串?

    我想将 org w3c dom Document 对象转换为字符串 我正在使用 Java 6 并且愿意使用任何能够完成任务的 完全免费 技术 我尝试了这个线程的解决方案 有没有比这段代码更优雅的方法将 XML 文档转换为 Java 中的字符
  • 在 TFS 中获取特定父级的子工作项

    如何在 TFS 中获取特定父级的子工作项 我需要一个平面列表 它将父 ID 作为查询参数并返回子工作项 注意 到目前为止 我只能通过 工作项和直接链接 查询来执行此操作 我们无法通过 工作项平面列表 查询来实现这一点 因为没有字段 条件来查
  • Start-Process 在 powershell 远程处理中不起作用

    我一直在尝试使用 powershell 远程处理来运行计算器 我进入了 powershell 会话 Enter PSSession 并输入以下命令 Start Process calc exe 我查看了远程计算机 但没有显示任何内容 当我尝
  • 如何检查字符串是否只包含大写字母或小写字母?

    当且仅当 s 中至少有一个字母字符且 s 中的字母字符全部大写或全部小写时 才返回 True def upper lower s str gt bool gt gt gt upper lower abc True gt gt gt uppe
  • 如何在 Xampp 安装的 Windows 上的 Apache 中禁用 SSLv3

    我正在尝试在 Apache 中禁用 SSLv3 该 Apache 是通过 xampp 安装在 Windows 上的 但我很难弄清楚如何做 有人告诉我我需要添加 SSLProtocol All SSLv2 SSLv3 到我的 ssl 配置文件
  • Haskell 函数名称中允许使用哪些字符?

    函数的有效名称是什么 Examples works let x x x let x x x doesn t work let x x x let x x x 我不确定 但我的预感是 Haskell 不允许 Unicode 函数名称 是吗 U
  • 如何从pairwise.t.test获取df和t值?

    有没有办法从a中获取t值和dfpairwise t test对于相关数据 Example data lt c 2 3 2 2 5 2 4 2 4 3 4 2 time lt c 1 1 1 1 2 2 2 2 3 3 3 3 pairwis
  • 如何在 .COM 可执行文件中以相反顺序打印字符串?

    我刚刚开始学习汇编语言 我正在尝试以相反的顺序打印 hello world 这意味着 dlrow olleh 问题是我只得到第一个字母作为输出 并且顺序仍然相同 没有任何变化 作为一个新手 很多事情对我来说都是未知的 我犯了很多错误 由于缺
  • keytool如何保护密钥?

    当您使用 Java Keytool 实用程序构建密钥存储时 如何保护密钥 我通读了文档 我意识到每个私钥都有一个密钥密码 然后商店有一个商店密码 但是使用什么机制来保护数据呢 它是加密密码吗 如果是的话 算法是什么 我特别关注 keytoo
  • 即使我完全信任,WebPermission 异常

    我正在尝试执行我认为简单的 HttpWebRequest 代码位于 dll 深处 因此我无法提供小代码片段 但它应该相对简单 但我遇到了安全异常 System Security SecurityException Request for t
  • 如何解决客户端-服务器应用程序中的无状态问题?

    我读过一些有关创建无状态网站的书籍 也读过一些有关有状态客户端应用程序的书籍 但是当您必须将两者结合起来时 就会出现很多复杂性 我们有一个 Flex 应用程序 需要通过 NET 服务将数据保存到数据库中 需要记住的事情是 并发 乐观 悲观
  • Android:通过套接字接收到的图像已损坏

    嗨 问题是 服务器正确地将图像发送到客户端 我认为 从客户端接收到的文件与服务器电话上存在的文件大小相同 因此我猜每个字节都已传输 但图像仍然不可见 服务器和客户端都是安卓手机 预先感谢我希望你能帮助我 服务器代码 public class
  • 使用 catimg 并排显示两个内容(就像在 neofetch 中一样)

    我正在尝试使用 bash 创建类似 neofetch 的东西 我想在右侧显示一张图像和一张 ASCII 艺术图 使用 cat 当我对某些机器进行 ssh 时 我想将其用作登录欢迎屏幕 所以我能够通过以下方式展示 ascii 艺术 cat l
  • 将对象附加到序列化文件

    假设您有一些 AppendObjectOutputStream 类 它是一个 ObjectOutputStream 它重写了 writeStreamHeader 如下所示 Override public void writeStreamHe
  • ObjectContext.Refresh()?

    如何从数据存储中更新所有脏实体 并将其更改后的值重置为原始存储值 方法对象上下文刷新 http msdn microsoft com en us library bb503718 aspx需要将要刷新的实体作为参数 以下通常有效 Conte
  • 编译器的“-O0”选项和“-Og”选项有什么区别?

    当我想要调试 C 或 C 程序时 我被教导使用 O0关闭优化 以及 ggdb将符号插入到为使用 GNU 而优化的可执行文件中gdb调试器 我使用它 或者 你可以使用 glldb对于 LLVM clang 来说lldb调试器 或者只是 g对于