软件调试学习摘录

592 篇文章 9 订阅 ¥99.90 ¥299.90
280 篇文章 6 订阅
本文摘自《软件调试》,探讨了调试符号在软件调试中的作用,详细介绍了PDB文件、调试符号表、修饰名称以及不同的调试信息格式如CodeView和DWARF。讲解了VC编译器的调试信息处理,包括如何生成公共PDB文件,并提到了WinDBG、DbgHelp函数库和DIA SDK等调试工具。
摘要由CSDN通过智能技术生成

摘录自 张银奎《软件调试》


17 WHEA

Windows中用于处理硬件错误的基本框架,它定义了系统中的硬件、固件,以及软件应该如何相互协作来报告、处理和记录各种硬件错误。
WHEA之前,Windows系统对硬件错误的最典型处理方法就是立即发起Bug Check,即蓝屏崩溃BSOD。
固件层、硬件抽象层、内核、驱动程序,都有WHEA的部件。
PSHED是Windows Vista为了实现WHEA而引进的一个内核模块(DLL),其作用是与固件中的硬件错误处理脚本和代码相交互。
WHEA输出的函数可以:错误恢复,发起蓝屏,清除错误记录,将错误记录填写完整、或增加补充信息,枚举所有错误源,读取错误源信息,初始化,读取错误信息,读取错误记录,保存错误记录、即错误记录持久化。
AER(Advanced Error Reporting)是PCI Express总线定义的一种高级的错误报告方式。
WHEA处理硬件错误的过程:LLHEH通过轮询或接收到系统通知或中断而感知到错误,然后调用PSHED的函数读取错误信息,而后根据错误的严重程度采取处理措施。
必须借助一定的数据结构来共享信息,一个是WHEA_ERROR_PACKET,一个是WHEA_ERROR_RECORD。
错误持久化就是将错误信息记录到可长久保存的介质中。大多数情况使用磁盘。但有时会磁盘故障。WHEA设计了一种方式,要求系统固件提供一个接口,操作系统可以调用这个接口将错误信息保存到系统的NVRAM中。
ERST,Error Record Serialization Table,即错误记录序列化表。它是ACPI标准3.10b版本引入的用来支持WHEA的一个系统描述表。
为了测试WHEA的各个模块和系统对WHEA的支持情况,WHEA定义了一种模拟产生硬件错误的方法,称为错误注入Error Injection。

25 调试符号

调试符号是将被调试程序的二进制信息与源程序信息联系起来的桥梁。
这些信息以表格的形式记录在符号表中,是对源程序的概括。
调试符号既可以存储在单独的文件中,也可以与目标代码共享一个文件。
PDB是Program Database的缩写。
微软提供了两种方式来访问调试符号文件中的符号,一种是DbgHelp函数库,一种是DIA SDK(Debug 


Interface Access Software Development Kit)。
VC编译器,修饰名称,Decorated Name,将函数的本来名称、调用协议、返回值等信息按照一定的规则


编排成一个新的名字。
以下两行分别是TestTry函数的原型和它的修饰名称:
int TestTry(HWND hWnd, int n)
?TestTry@@YAHPAUHWND__@@H@Z
设置编译器的/FA选项使其输出汇编文件。
对于void__cdecl test(void)函数,按照C规范编译产生的修饰名称是_test,按照C++规范编译产生的修


饰名称是?test@@ZAXXZ。
C++的修饰名称都是以问号开始的。


因为COFF可以存储各种数据对象,人们很自然想到用它来存储调试信息。
WinDBG的lm命令在显示模块列表时会显示每个模块所使用的符号文件信息。
使用rebase工具可以将exe文件中的调试信息剥离到一个单独的.dbg文件中。
CodeView是与MSC编译器一起使用的调试器,它使用的调试符号格式被称为CodeView格式,简称CV格式。
CV是微软自己定义的调试符号存储格式。
Borland公司的编译器和调试器所使用的调试信息格式与CodeView格式类似,但做了一些扩展,典型的版


本签名有FB09和FB0A。


根据所包含符号的完整程度,PDB格式的调试符号文件又分为私有Private和公共Public。
私有是由编译器和链接器产生的,公共是在私有的基础上使用工具产生的,公共剔除了与源程序文件关


系密切的私有信息。
使用DDK中的binplace工具可以成批地产生公共PDB文件。
VC2005或更高,可使用链接选项/PDBSTRIPPED:<公共PDB文件名>来产生公共PDB文件。
DWARF是一种公开的调试信息格式规范,是由DWARF组织定义的;主要用在Unix和Linux中,gcc和gdb都支


持DWARF格式。
VC编译器的目标文件使用的是COFF格式,整个文件分成多个数据块。
行号信息用来描述源代码行与目标代码的对应关系。
每条源代码行信息是一个IMAGE_LINENUMBER结构。
PE规范定义了4种用于存储调试数据的节。
使用DumpBin工具可以列出目标文件符号表中所包含的所有符号。
根据调试目录结构中的信息可以找到各个调试数据块;其方法就是将PointerToRawData字段所指定的文


件偏移加上PE模块的基地址。
PDB签名是一个可读的字符串,其长度不固定,但是一定以0x1A结束。在ASCII中,0x1A即EOF(End Of 


File)。
一个典型PDB文件包含6种数据表:符号表,源文件表,节贡献表,段信息表,注入代码表,帧数据表。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值