原文:https://blog.csdn.net/gmpy_tiger/article/details/50395719

MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope>

原因:编译器把代码优化掉了,直接导致在仿真中变量根本没有分配内存,也就无法查看变量值

进一步原因分析:想要观察的变量在代码中没有被使用,因此被编译器自动优化

PS:注意的是,被使用可以理解为:代码执行时,需要读取变量所在内存

例如:

 int temp;
int num;
temp=;
//到此为止,仅仅是给变量赋值,而不需要读取temp的内存值,因此编译器优化掉此变量
num=temp;
//这一步,把temp的值赋值给num,有读取temp的内存值,但是无读取num内存值,因此编译器把此句给优化掉了,导致temp也相当于没读取内存值,因此num和temp都被优化掉

使用变量temp后:

 int temp;
int num;
temp=;
//到此为止,仅仅是给变量赋值,编译器优化掉此变量
num=temp;
//这一步,把temp的值赋值给num<span style="font-family: Arial, Helvetica, sans-serif;">,有读取temp的内存值</span>
for(temp=;temp<;temp++);
//这一步,在for循环中无论是大小比较(temp<10)还是自加(temp++)都需要读取temp所在的内存值,因此temp不会被优化,而num由于后续没有读取内存值,被优化了

变量temp与num均使用:

 int temp;
int num;
temp=;
//到此为止,仅仅是给变量赋值,编译器优化掉此变量
num=temp;
//这一步,把temp的值赋值给num<span style="font-family: Arial, Helvetica, sans-serif;">,有读取temp的内存值</span>
for(temp1=;temp1<;temp1++)
num++;
//这一步<span style="font-family: Arial, Helvetica, sans-serif;">在for循环中无论是大小比较(temp<10)还是自加(temp++)都需要读取temp所在的内存值,因此temp不会被优化,而num由于自加(num++)也被使用,也不会被优化</span>

以后调试中遇到这种情况的解决办法:

核心思想是:让变量值在代码中被读取其内存值

1、把变量定义为全局变量,全局变量编译器貌似不会太多干扰,但是在项目中总不能定义太多全局变量,而且经常为了调试而改代码,太麻烦了

2、使用变量,让编译器不优化掉,例如在for循环中使用。更简单的方法是把变量定义为 volatile。
例如:int temp;    =>   volatile int temp;//volatile变量会使得cpu每次使用该值时都一定会从内存读取而不是直接使用cpu寄存器里的值,相当于提高了变量的级别,编译器不会优化此变量

 

解决办法:
所在的函数初有这个参数才行,或者设置断点,或者是全局变量.

J-Link调试查看变量值总是显示<not in scope> 和<cannot evaluate>问题的更多相关文章

  1. MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope>

    转载请注明出处,谢谢. MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope> 原因:编译器把代码优化掉了,直接导致在仿真中变量根本没有分配内存,也就无法查看 ...

  2. delphi 调试查看变量值

    在debug状态,打开run下的add watch就可以添加需要查看的变量,可以各种格式显示非常方便

  3. Eclipse 中 Debug 时鼠标悬停无法查看变量值

    问题描述:Eclipse在Debug模式下,当鼠标移动到某个变量上面时不自动显示该变量对应的值. 解决方法:在Eclipse中点击 Window->Preferences->Java-&g ...

  4. Eclipse中Debug时鼠标悬停不能查看变量值解决办法

    问题描述:Eclipse在Debug模式下,当鼠标移动到某个变量上面时不自动显示该变量对应的值. 解决方法:在Eclipse中点击 Window->Preferences->Java-&g ...

  5. nginx查看变量值

    nginx查看变量值 location / { echo $host; #域名 echo $remote_addr; echo $remote_user; echo $time_local; echo ...

  6. 解决:eclipse 断点调试进入到class文件,无法查看变量值问题

    今天团队一小伙伴调试项目时,一不小心选错了源文件目录(maven分模块项目),选到了顶层父项目下的文件,结果调试时发现无法查看调试过程中的变量值,要解决这个问题,其实很简单,稍稍配置一下就可以了,为了 ...

  7. 解决debug到jdk源码时不能查看变量值的问题

    目录 如何跟踪jdk源码 1. 编译源码 2. 关联源码 3. 大功告成 如何跟踪jdk源码 看到这个标题大概大家都会在心里想谁还跟踪个源码呀,在eclipse中打个断点,以debug的方式运行,然后 ...

  8. Qt5.3.2(VS2010)_调试_查看变量值

    1.菜单栏 -->控件(W) --> 视图 2.在"Debug"状态下,选择一个变量(或者 按住左键 选择变量及其属性/方法)--> 右键 --> 添加表达 ...

  9. xcode在调试时无法查看变量值

    现象:在xcode中调试程序的时候,无论是鼠标指在变量上,还是在gdb中po命令都看不到内存中变量的值. 解决办法:在Project的Build中把 Optimization Level 设置成 No ...

随机推荐

  1. class文件打包成jar

    电脑左下角“开始”——“运行”——输入cmd——cd+空格+clss文件所在文件夹的路径——jar+空格+-cf+空格+“jar包的名字”.jar+空格+*.class.好了...

  2. Asp.Net里关于Session过期跳转页面的一些小技巧

    这里算是自己的个人随笔吧,仅供参考使用,后续有更好的方法再做补充 之前在Aspx页面里面,在Session过期的时候我经常会使用 Server.Transfer("b.aspx") ...

  3. HDU3622(二分+2-SAT)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. JavaScript--表单处理(27)

    一 表单介绍 // 在HTML中,表单是由<form>元素来表示的,而在JavaScript中,表单对应的则是HTMLFormElement类型; // HTMLFormElement继承 ...

  5. JavaSE——线程同步

    为什么需要线程同步? 同步就是协同步调,按预定的先后次序进行运行.如:你说完,我再说而并非一起动作.“同”字应是指协同.协助.互相配合. 如进程.线程同步,可理解为进程或线程A和B一块配合,A执行到一 ...

  6. C#版Aliyun DNS API

    阿里云解析API,是为域名开发者.注册商.域名代理商等提供的开放和便捷的解析服务接口.API依托于万网云解析服务,可以方便的管理域名和解析记录,让你的解析管理变的随心省时自由舒畅. 一.先附上Aliy ...

  7. 如何选型商业智能和分析平台,Gartner给了这些建议!

    文 | 水手 在2017年1月20日Gartner发布的<China Summary Translation: 'Survey Analysis: Customers Rate Their BI ...

  8. SQLServer SQL连接查询深度探险(摘录

    SQL连接查询深度探险[摘录] 测试环境: Windows XP Profession MySQL 5.0.45 Oracle 9i DB2 UDB 9.1 测试的SQL脚本如下:此脚本适合MySQL ...

  9. SQLServer 常见SQL函数

    SQL Server SQL函数 by:授客 QQ:1033553122 字符函数 日期函数 数学函数 系统函数

  10. 解决跨域问题之anywhere

    anywhere搭建服务,ionic PC端和手机端可以通过网址来查看网页效果.解决跨域问题 大家都知道编写完HTML代码后,可以直接在pc端的浏览器查看,但现在手机端越来越广泛了,想跟在pc端查看网 ...