【发布时间】:2012-07-01 11:14:34
【问题描述】:
如何防止 GCC 消除 if(0) 块内的代码?
当我使用 Visual Studio 时,我的调试技巧之一就是将这样的代码放入我的程序中:
if (0)
do_some_debug_printing_and_checking();
然后,当一个断点被命中时,我点击 do_some_debug_printing_and_checking() 行,选择“设置下一条语句”并强制它执行。
当我使用 gcc/gdb 作为后端时,“设置下一条语句”不再起作用,因为 GCC 只是从 if(0) 语句中删除了代码。 p>
我当然使用 -O0 标志来禁用优化。我还尝试了 -fno-dce -fno-tree-dce 标志来明确禁用死代码消除,但它没有效果: if(0) 的内容只是不存在于二进制文件中,我无法使用 set next statement 跳转到它。
有什么好的方法可以告诉 gcc 禁止删除 if(0) 内容吗?
编辑:
感谢“附加变量”解决方法,但是有两点我不喜欢它:
- 还是多出一行代码
- 当我构建发布版本并希望那些调试内容消失时,它不会自动优化。我当然可以使用#ifdef-s,但那是更多的额外行。
真的,绝对没有办法让 GCC 保留那些死代码?
【问题讨论】:
-
我知道这不是您要的,但请尝试为您的 ifs 使用设置为 false 的全局变量。这样编译器就不会优化你的 if 语句。
-
当你想运行那个函数时,为什么不直接在 gdb 中
call do_some_debug_printing_and_checking()呢?
标签: c++ optimization gcc gdb