【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成功。这是个经验也是个教训,以后在碰到有关字符串的数据处理时,一定要提前看是否将其作为字符串来处理的。
【UEFI】---记录一次debug过程中的调试经验的更多相关文章
- Debug过程中的mock (及display窗口的使用)
转载:http://m.blog.csdn.net/blog/u012516903/18004965 在debug的时候,有3个地方可以进行mock测试 测试代码如下: 1.使用display窗口 W ...
- 记录visual Studio使用过程中的两个问题
Visual Studio是Windows平台下进行项目管理和开发的终极利器.除了微软自家的技术外,新版的VS不但支持Javascript, Python的开发调试,甚至还支持了Android, iO ...
- 如何在Eclipse和Tomcat的Debug过程中启用热部署
参考的地址是 http://blog.redfin.com/devblog/2009/09/how_to_set_up_hot_code_replacement_with_tomcat_and_ecl ...
- dubbo debug过程中一个有趣的问题
最近在debug dubbo代码过程中遇到的很有趣的问题 我们都知道dubbo ReferenceBean是消费者的spring bean包装,为了查一个consumer端的问题,在Reference ...
- ios逆向过程中lldb调试技巧
在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f 看看各个模块在内存中的基址 2.register read r0 读取寄存器r0的 ...
- vue生命周期updated的触发时机之debug过程中发现的firefox问题
现象描述: 断点位置1 谷歌debug的过程: 火狐debug的过程: 只要在改变数据之后有断点停顿,就会先去执行updated函数 断点位置2 此时火狐和谷歌是一样的效果,但是执行顺序是不一致的 谷 ...
- 记录自己运行eShopOnContainers过程中遇到的坑
由于各种各样的问题,依照官方文档运行eShopOnContainers项目遇到了好多莫名其妙的错误. 好在最后都解决了,在此记录,以防自己以后再遇到,也为遇到同样问题的同学提供参考. 参考的官方文档 ...
- IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退
大家在Debug程序的时候,是否遇到过因为"下一步"按太快,而导致跳过了想要深入分析的那段代码?是不是很想要有"回到上一步"这样的操作呢? 在IDEA中就提供了 ...
- 记录下安装ES过程中遇到的错误及解决
1.集群配置 需要修改 cluster.name .node.name .network.host: 0.0.0.0[此处默认localhost].http.port: 9200 只要集群名相同,且机 ...
随机推荐
- vue在渲染之前拿到数据操作.......vue数据获取
异步请求数据,但是生命周期函数也是异步的,怎么才能保证渲染之前就能拿到数据呢? 官方给了两种方案, 我们可以在异步获取数据的时候加上一个loading表示现在在获取数据..... 由于ajax是异步操 ...
- 【t085】Sramoc问题
Time Limit: 1 second Memory Limit: 128 MB [问题描述] Sramoc(K,M)表示用数字0,1,2,...,K-1组成的自然数中能被M整除的最小数.给定K,M ...
- Vue-axios 在vue cli中封装
common/post.js import axios from 'axios' // 引入axios import qs from 'qs' // 引入qs axios.defaults.baseU ...
- P1008 对齐输出
题目描述 读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们. 输入格式 输入的一行包含三个整数 \(a,b,c(1 \le a,b,c \le 10^6)\) . 输出格式 输出一行包含三个整 ...
- ESB总线的核心架构
根据近期对开源ESB产品的研究,已经对Oracle和Tibco的ESB总线产品的实施经验积累,对ESB总线的核心产品架构有了进一步的清晰认识,将ESB的核心架构整理为上图,上图中看到的内容也是做为一款 ...
- SpringBoot项目改变图片临时文件的存储路径
springboot项目,部署到服务器后,运行一段时间后,处理文件上传的接口时,后报异常. Could not parse multipart servlet request; nested exce ...
- linux 在 open 时复制设备
管理存取控制的另一个技术是创建设备的不同的私有拷贝, 根据打开它的进程. 明显地, 这只当设备没有绑定到一个硬件实体时有可能; scull 是一个这样的"软件"设备 的例子. /d ...
- 2019-9-20-SharpDx-的代替项目
title author date CreateTime categories SharpDx 的代替项目 lindexi 2019-09-20 09:13:59 +0800 2019-09-20 0 ...
- tab选项卡平滑滚动vue
<html lang="en"> <head> <meta charset="UTF-8"> <title>Ti ...
- 与正则有关的JS方法结合其在项目中的应用
与正则有关的JS方法结合其在项目中的应用 前言 最近项目中用到正则匹配比较多,因此打算深入理解和总结下各个与正则有关的方法,再结合在项目中使用的情况.与正则有关的JS方法共有7个,分别是RegExp对 ...