GDB调试显示< optimized_out >

最近使用GDB调试的时候,经常遇到GDB查看变量值的时候输出< optimized_out >,Google了一下,找到几个解决方法,来应对不通情况下需要查看具体变量输出的场景。

解决方案

将GCC优化选项调整为O1或是O0

GCC在O2、O3优化选项下会将代码优化的比较多,调试器有可能会找不到变量的信息。通常可以将优化级别降低到O0,完全关闭优化,可以保留所有的变量和代码信息。使用O1优化有可能也可以看得到变量的值。

当然,这种直接降低优化级别的方法还是比较暴力的。如果你的程序比较大,运行到你需要调试的地方需要很久的情况下,通常都是行不通的,毕竟所有优化选项都关掉了,程序跑的会非常慢……

输出打印信息

直接将变量的信息打印到屏幕上是最直接的方法。当然了,这种方法太糙,太繁琐了。一旦你需要看的变量比较多,输出的内容也会非常多,看起来就比较痛苦了。

用volatile修饰需要显示的变量

在需要显示值的变量前面加上volatile修饰符也是一种比较管用的方法。这种方法不需要修改编译器的优化级别,对于比较庞大的程序来说是比较合适的。如果这种方法也不管用或是也不适用的话,请往下看。

volatile修饰符请看这里:https://stackoverflow.com/questions/4437527/why-do-we-use-volatile-keyword-in-c

GCC下关闭某函数的优化选项

在GCC中,我们可以指定将某个函数的优化选项关闭,比如说你可以将some_function的优化级别设定为O0。

void some_function() attribute ((optimize(0))) {

...

}

这个方法在GCC 4.4版本以上有效

GCC下关闭一段函数的优化

在GCC中我们也可以将某一段代码(不一定是某个函数)的优化等级关掉。比如说。

void foo() {
func1();
#pragma GCC push_options
#pragma GCC optimize (0)
func2();
// do something
...
#pragma GCC pop_options
func3();
}

#pragma GCC push_options可以将当前的GCC选项暂存。

#pragma GCC optimize (0)可以调整当前GCC的优化选项。0就代表O0优化。也支持字符串:#pragma GCC optimize ("O1")

#pragma GCC pop_options将之前暂存的GCC编译选项还原出来。

转载:https://blog.zyuzhi.me/2018/10/24/gdb-value-optimized_out.html

GDB变量值显示为< optimized_out >的解决方法的更多相关文章

  1. 不同页面获取同一cookie变量值不同的问题及解决方法

    在使用cookie时发现不同页面获取到的同一个cookie变量的值不同,本篇博客介绍其中一种情况的解决方法,通过设置path的方法可使得在同一个网站下获取的cookie变量一致. 问题描述 在www. ...

  2. win7 电脑能上网,但是下面的图标显示红叉的解决方法

    win7 电脑能上网,但是下面的图标显示红叉的解决方法 任务管理器里面结束explorer.exe进程,然后,点击文件,新建任务,输入explorer回车看看

  3. Linux 下shell显示-bash-4.1$不显示用户名路径的解决方法

    Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法   问题描述:   CentOS下新增一个用户,登录进去之后shell脚本的信息如下:     而不是我们经常看 ...

  4. CentOS下shell显示-bash-4.1#不显示用户名路径的解决方法

    CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的username@hos ...

  5. winform,wpf全屏 还显示任务栏的解决方法

    原文:winform,wpf全屏 还显示任务栏的解决方法 以wpf为例: 全屏代码: this.Topmost = true; this.WindowStyle = System.Windows.Wi ...

  6. (转载)SQL Server2008附加数据库之后显示为只读时解决方法

    SQL Server2008附加数据库之后显示为只读时解决方法 啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定 ...

  7. WPF:验证登录后关闭登录窗口,显示主窗口的解决方法

    http://www.27ba.com/post/145.html WPF:验证登录后关闭登录窗口,显示主窗口的解决方法 最近想做一个基于Socket的通讯工具,想模仿QQ那样,需要先登录,登录成功后 ...

  8. DELPHI7加载UNICODE编码格式的TXT显示为乱码的解决方法

    DELPHI7的STRING默认是ANSI编码,加载UNICODE编码格式的TXT显示为乱码,解决方法如下: procedure TForm1.Button1Click(Sender: TObject ...

  9. ubuntu下Chrome谷歌浏览器部分网站图片显示不正常的解决方法

    title: ubuntu下Chrome谷歌浏览器部分网站图片显示不正常的解决方法 toc: false date: 2018-09-02 14:37:26 categories: methods t ...

  10. VS工具箱不显示DEV控件解决方法

    VS工具箱中不显示DEV控件解决方法 之前先装vs,再装dev控件,vs工具栏中自动会加载并显示dev相关组件,但是,在更新vs(我用2017版)后,原先安装好的dev控件库不显示在vs的工具栏中了. ...

随机推荐

  1. 上传代码到github和删除.git

    在本地建立目录,将想上传的代码放到该文件夹中 git init ###初始化 git add . ###将本地项目工作区的所有文件添加到暂存区 git commit -m "excu&quo ...

  2. lua完整学习笔记

    lua注释 -- 单行注释 --[[ 多行注释 ]]-- lua数据结构 nil          无效值与Java的Null类似,但是在条件表示中是false boolean      布尔值,tu ...

  3. 【matlab混沌理论】1.2.洛伦兹吸引子

    ​Lorenz洛伦兹吸引子定义洛伦兹函数组后,通过ode45函数求解此微分方程方程. input: % Lorenz函数的洛伦兹吸引子 % 2.定义模型参数 sigma = 10; beta = 8/ ...

  4. zookeeper JavaApi 删除节点

    /* * 删除节点 * 1.删除单个节点 * 2.删除带有子节点的节点 * 3.必须成功的删除 * 4.回调 * * */ @Test public void delete1() throws Exc ...

  5. Cocos2d-js 游戏切后台和返回游戏,系统监听事件

    在日常游戏开发中,我们会发现,实时类操作的游戏,在模拟器中切后台,然后切回游戏,会出现很多异常. 很幸运,Cocos官方已经为我们预留了接口 1 LogicGame.addSystemListener ...

  6. VSCode个性化的配置

    1.下载插件 Eclipse快捷键(我以前用Eclipse习惯了,大家不需要) Premitter Vetur koroFileHeader 2.修改VSCode设置 3.粘贴下面的代码 { &quo ...

  7. 如何利用烛龙和谷歌插件优化CLS(累积布局偏移)

    简介 CLS 衡量的是页面的整个生命周期内发生的每次意外布局偏移的最大突发性_布局偏移分数_.布局变化的发生是因为浏览器倾向于异步加载页面元素.更重要的是,您的页面上可能存在一些初始尺寸未知的媒体元素 ...

  8. VsCode运行与freopen与快读

    运行 g++ -o a a.cpp && ./a g++ b.cpp -o b && ./b g++ c.cpp -o c && ./c freopen ...

  9. Asp.net core Webapi 如何执行定时任务?

    前言 在计算机系统中,定时执行一些后台任务是很常见的场景,比如定时发送邮件.备份数据等等. 那么,.NET 技术如何通过编程灵活地实现项目里复杂的自定义任务呢? 如果是 Windows 生态,通常来说 ...

  10. Java多线程学习(Day02)

    目录 线程简介 线程实现(重点) 线程状态 线程同步(重点) 线程通信问题 线程实现: 方式一:继承Thread类 /** * TODO * @author 清莲孤舟 * @CreateDate 20 ...