快速总结
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:
- [他们还推荐
-O0
,我同意]gdb 中的 是什么意思? https://stackoverflow.com/questions/5497855/what-does-value-optimized-out-mean-in-gdb/5497906#5497906