转载请注明出处,谢谢。

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. MySql接口API函数综述

    C API函数概述 函数 描述 mysql_affected_rows() 返回上次UPDATE.DELETE或INSERT查询更改/删除/插入的行数. mysql_autocommit() 切换 a ...

  2. Redis添加访问密码

    进入Redis的安装目录,找到redis.conf文件. 1.修改密码:使用vi命令打开redis.conf文件,先使用字符匹配查找到requirepass foobared对应的位置, 然后修改fo ...

  3. htm5 手机自适应问题 文本框被激活(获取焦点)时,页面会放大至原来尺寸。

    加上这句话就ok啦 <meta name="viewport" content="width=device-width, initial-scale=1.0, mi ...

  4. 在windows平台上构建自己的PHP(php5.3+)

    这是一篇翻译的文章,原文参见:https://wiki.php.net/internals/windows/stepbystepbuild 顺便提一句,wiki.php.net有很多精彩的内容,想深入 ...

  5. ListView实现下拉刷新(二)隐藏头布局

    一.问题分析 在上一篇中,我们将头布局加到了ListView上.但是没有隐藏他.你可能会想,隐藏还不简单,直接给它设置为GONE属性不就可以了吗,在需要的时候再设定为可见.没错,这正是ListView ...

  6. UVa 12265 - Selling Land

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. PHP------文件------文件整体操作

    文件整体操作 [1]创建文件 touch("路径");   touch("./test.docx");//当前路径创建文件,创建的文档 显示的结果: touch ...

  8. 在网页中使用Markdown

    在网站中使用markdown有两种方式,一种是通过后端(php等)把markdown语法文本转换为html代码,输出到浏览器:另一种是通过javascript代码直接在浏览器中转换. 我在这里使用的是 ...

  9. 解决pycharm无法导入本地包的问题

    在用python写爬虫程序时,import 行无法通过,具体情况如下: pycharm运行程序后,程序pass了,但是出现了警告,如下图所示: 这是由于该程序不在根目录下,无法导入本地包,解决办法如下 ...

  10. Docker 三种UI管理平台

    docker集中化web管理平台 一.shipyard 1.启动docker,下载镜像 # systemctl restart docker # docker pull alpine # docker ...