码迷,mamicode.com
首页 > 其他好文 > 详细

【UEFI】---记录一次debug过程中的调试经验

时间:2020-01-08 22:50:04      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:执行   形式   结构体   很多   问题总结   code   配置   smb   获得   

最近在调试一次SMBIOS的动态更新以及I2c设备的配置读取时,遇到了很多问题,特此总结:

1. 第一个是调试一个I2c设备的时候,遇到了一个很奇怪的问题,也由此问题总结了下SMBUS模块的知识,如下:

 待完成

2. 在动态更新到SMBIOS某些type字串时,遇到很多细节问题,总结如下:

1)问题:同样的代码,放置位置不同会导致代码跑飞:

  如下图,在获得了SmBiosType1Record的Protocol时,如果StringNumber的两个变量赋值分开,将红框代码移至下面,就会导致值改变,目前还不太清楚原因,这个问题以后要注意。

技术图片

 2) 有关某个SMBIOS的Handle值

技术图片

 原本通过笔者认为,这个handle可以通过SmbiosType1Record->Hdr->Handle的方式直接获取到,但是实际也会有问题,第一个 Smbios->UpdateString()函数可以正常执行,但是执行完之后,在执行第二个时,Handle的值就不正确了,这个问题与上面的问题类似,都是在执行完第一个函数后,SmbiosType1Record这个结构体指针的值会有所变化,因此我怀疑第一个函数执行时,会改变SmbiosType1Record的指向或者内容。要搞清楚这个问题,又要牵扯到什么是Handle什么是Protocol了,他们在代码中的呈现形式什么呢?请参照如下文章:

3)在使用gEfiSmbiosProtocol下的函数UpdateString时,一定要注意更新的是字符串,需要注意传入String参数的格式,是要字符串格式的,还是普通的字符数组就可以,这是不一样的。

一定要重视这一点,这直接决定了debug的效率。而且以后又碰到任何更新string的数据的时候,均要去查看,形参中传入的指针是否是一个字符串指针,如果是的话,那么在获取该数据时,一定要注意最后一个Byte要为‘\0‘,否则就会发生越界的问题。本次调试就遇到了这样的问题。

我将形参指针的指向的空间放置了要更新的字符串数据,但是没有按照字符‘\0’结尾,

技术图片

如上代码,仅申请了空间,copy了字符串数据,没有以‘\0‘结尾,但实际上结果错误,一直在我发现到UpdateString函数中,对于字符串长度的获取是通过‘\0‘来判断结尾的,我才意识到问题所在。

技术图片

 而后我在CopyMem数据,将最后一个数据设置成了‘\0‘,UpdateString成功。这是个经验也是个教训,以后在碰到有关字符串的数据处理时,一定要提前看是否将其作为字符串来处理的。

【UEFI】---记录一次debug过程中的调试经验

标签:执行   形式   结构体   很多   问题总结   code   配置   smb   获得   

原文地址:https://www.cnblogs.com/szhb-5251/p/12168965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!