转载请注明出处,谢谢。

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

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

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

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

PS: 测试截图已经丢失,实在不好意思。请各位自己尝试。

例如:

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

使用变量temp后:

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

变量temp与num均使用:

int temp;
int num;
temp=30;
//到此为止,仅仅是给变量赋值,编译器优化掉此变量
num=temp;
//这一步,把temp的值赋值给num<span style="font-family: Arial, Helvetica, sans-serif;">,有读取temp的内存值</span>
for(temp1=0;temp1<10;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寄存器里的值,相当于提高了变量的级别,编译器不会优化此变量

MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope>的更多相关文章

  1. J-Link调试查看变量值总是显示<not in scope> 和<cannot evaluate>问题

    原文:https://blog.csdn.net/gmpy_tiger/article/details/50395719 MDK/Keil 中,J-Link调试查看变量值总是显示<not in ...

  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. keil中的串口调试:

    keil中串口的虚拟调试信息在通过View-serial windows-#usart1/2/3/4/debug(printf)可以看到.当然也可以通过虚拟串口VSPD+串口调试助手在外部实现,方法如 ...

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

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

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

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

  9. 怎样在Ubuntu手机应用中得到全部的环境变量值

    我们在先前的例程中已经通过一些方法得到我们应用的一些环境变量值.这些值有的很实用.比方我们能够得到我们应用所仅仅能訪问的文件夹.在今天的例程中,我们来展示一种方法能够得到应用全部的环境变量.在我们的实 ...

随机推荐

  1. 一个典型的后台软件系统的设计复盘——(二)如何id一个事物

    这个话题,可以从类与对象说起. Dog dog1 = new Dog(); 哪个是类,哪个是对象?这个问题搞不清楚,后面就无从说起了.然后两个程序员之间沟通说,那个狗有问题.除非两人很默契,不然另一人 ...

  2. Carbon中文使用手册

    Introduction Carbon 继承了PHP的 Datetime 类和JsonSerialiable.所以 Carbon 中没有涉及到的,但在 Datetime 和JsonSerializab ...

  3. HDU 3420 -- Bus Fair ACM

    Bus Fair Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  4. 查看Oracle表中的指定记录在数据文件中的位置

    查看Oracle表中的指定记录位置select rowid,user_id from sshr.xx_user where user_id=3010586 select rowid,       db ...

  5. electricity meter就是电表

    英式英语metre意思是度量衡里面的单位:米 美式英语拼为 meter 除了“米”,还有一个意思是“计量器”,比如 parking meter就是是路边停车投币计时器,cab meter就是出租车的计 ...

  6. 【ACM】那些年,我们挖(WA)过的最短路

    不定时更新博客,该博客仅仅是一篇关于最短路的题集,题目顺序随机. 算法思想什么的,我就随便说(复)说(制)咯: Dijkstra算法:以起始点为中心向外层层扩展,直到扩展到终点为止.有贪心的意思. 大 ...

  7. Executor线程池框架

    Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致 ...

  8. css层叠样式表总结

    一.css css里注释只有一种 /*  */ 二.css与HTML四种结合方式 1.行内样式 在标签中加入style属性 内部的写法:key1:value;key2:value; <div s ...

  9. TunSafe使用分享

    体验还是很棒的,关于使用中遇到的一些问题在此分享下 官网打不开? 这个真的很不解,科学以后遇到的, 后来在手机上同样的环境测试可以打开 最后居然使用ie浏览器解决了,看来是国产浏览器在作怪 ie终于打 ...

  10. Cesium.js学习第三天(模型展示)

    var viewer = new Cesium.Viewer('cs'); viewer.scene.primitives.add(Cesium.Model.fromGltf({ url : '/Ce ...