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

最近在调试一次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成功。这是个经验也是个教训,以后在碰到有关字符串的数据处理时,一定要提前看是否将其作为字符串来处理的。

猜你喜欢

转载自www.cnblogs.com/szhb-5251/p/12168965.html