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

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

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

 待完成函数

2. 在动态更新到SMBIOS某些type字串时,遇到不少细节问题,总结以下:debug

1)问题:一样的代码,放置位置不一样会致使代码跑飞:指针

  以下图,在得到了SmBiosType1Record的Protocol时,若是StringNumber的两个变量赋值分开,将红框代码移至下面,就会致使值改变,目前还不太清楚缘由,这个问题之后要注意。调试

 2) 有关某个SMBIOS的Handle值blog

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

3)在使用gEfiSmbiosProtocol下的函数UpdateString时,必定要注意更新的是字符串,须要注意传入String参数的格式,是要字符串格式的,仍是普通的字符数组就能够,这是不同的。string

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

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

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

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