您的位置:首页 > 其它

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

2015-03-18 22:23 211 查看
首发http://blog.csdn.net/chenbb8 转载请注明

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

在IAR中,将一个数组名添加到watch窗口,是可以点开数组查看到数组内容的。

比如有全局变量:

[code]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指向的缓冲区:

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


效果:





方法二:定义一个指向数组类型的指针,然后通过这个指针来查看pData指向的缓冲区:

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


效果:



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

[code]#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中也没问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: