调试小技巧:在仿真时查看指向数组的指针的内容

首发http://blog.csdn.net/chenbb8 转载请注明
PS:本技巧是在设置优化等级为low时候测试的,原因是测试用到的变量在high优化等级的时候,可能会被优化掉。谁知道怎么突破这个优化的请告诉我~~,不可以修改内存中的值哦。

在IAR中,将一个数组名添加到watch窗口,是可以点开数组查看到数组内容的。
比如有全局变量:

uint8_t TestReadTbl[31] = "123456789";

并在某个地方使用一下,防止优化:TestReadTbl[0] = TestReadTbl[0];
那么将TestReadTbl添加到watch窗口后,效果如下:
这里写图片描述
但今天在调试CC2451的主机程序的时候,仿真进入到一个原型为
static bool simpleBLEFindSvcUuid( uint16 uuid, uint8 *pData, uint8 dataLen )的函数内部时,想查看pData指向子机广播数据的数组却甚是麻烦,如上图所示一样,只能显示出第一个字节的数据,就算将参数中的pData定义改成uint8 pData[31]效果也是一样。而将pData[0]-pData[31]一个一个的添加到watch窗口实在不是我等懒人的风格。
经过摸索后,找到了两种查看的方式。

方法一:定义一个包含数组的结构体类型kankan_t,然后通过它定义的变量来查看pData指向的缓冲区:

  typedef struct{ uint8_t pRead[31];} *kankan_t;
  kankan_t kankan;
  kankan = (kankan_t)pData;
  kankan->pRead[0] = kankan->pRead[0]; //在这个位置打断点,查看缓冲区值。

效果:
这里写图片描述
方法二:定义一个指向数组类型的指针,然后通过这个指针来查看pData指向的缓冲区:

uint8_t (*kankantbl)[31] = (uint8_t (*)[31])pData;
  (*kankantbl)[0] =  (*kankantbl)[0]; //在这个位置打断点,查看缓冲区值。

效果:
这里写图片描述

另外还做了一个宏,喜欢就拿去吧:

#define DEBUG_READ_BUFF_CHAR(WATCH, PDATA, LENG) \
  uint8_t (*(WATCH))[(LENG)] = (uint8_t (*)[(LENG)])(PDATA)
#define DEBUG_READ_BREAK(WATCH)  (*(WATCH))[0] = (*(WATCH))[0]

使用方法:
这里写图片描述

PS:如果优化等级是none,那么将DebugReadBreak宏合并到DebugReadBuff中也没问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值