编译器的“-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”选项有什么区别? 的相关文章

  • 命名管道客户端无法连接到作为网络服务运行的服务器

    我有一个服务在网络服务帐户下运行 该服务只是设置一个命名管道并侦听连接 NamedPipeServerStream listeningPipe new NamedPipeServerStream ourservicepipe PipeDir
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 如何用另一个静态变量初始化一个静态变量?

    静态1 hpp include
  • 阻止特定 URL 进行测试的最佳方法是什么?

    我正在使用 Google Chrome 和 Fiddler 版本 4 4 观察一个网站 该页面正在使用 AJAX 来更新其数据 我想阻止特定的 URL 以测试如果它不起作用会发生什么 阻止 URL 最简单的方法是什么 你希望发生什么 转到自
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 如何生成可变参数包?

    给定不相关的输入是否可以生成非类型参数包 我的意思是 我想改变这一点 template
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 如何在 C 语言中获取输入中的空格

    我想从控制台获取字符数组 它还包含空格 我在 C 中知道的唯一方法是 scanf 但是一旦遇到空格 它就会停止接受输入 我该做什么 这就是我正在做的事情 char address 100 scanf s address 尝试使用 fgets
  • 解析连接字符串

    是否有标准库或代码片段可以使用这样的连接字符串获取值 string connstr DataServiceUrl http localhost foo RemoteServerConnection server http localhost
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • 如何解决 boost::multi precision::cpp_dec_float 除法错误

    除以boost multiprecision cpp dec float有某种舍入误差 如下 include
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • 如何从 C# 中的 Web Api 方法正确获取字节数组?

    我有以下控制器方法 HttpPost Route SomeRoute public byte MyMethod FromBody string ID byte mybytearray db getmybytearray ID working
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal

随机推荐

  • 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对于