CN104156311B - 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 - Google Patents
一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 Download PDFInfo
- Publication number
- CN104156311B CN104156311B CN201410381755.0A CN201410381755A CN104156311B CN 104156311 B CN104156311 B CN 104156311B CN 201410381755 A CN201410381755 A CN 201410381755A CN 104156311 B CN104156311 B CN 104156311B
- Authority
- CN
- China
- Prior art keywords
- output
- tested
- address
- file
- cpu emulator
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于CPU模拟器的嵌入式C语言目标码级单元测试方法。本发明采用CPU模拟器技术,解决了不同嵌入式处理器的目标码在通用PC机上的执行问题,使得可以在通用PC机上进行嵌入式C语言目标码级的单元测试,本发明利用CPU模拟器,配合测试驱动程序的编写约定,实现了被测函数目标码覆盖率的自动记录和输出,能够统计测试用例执行的目标码语句和分支覆盖率。本与现有技术相比,本发明保证被测试的C语言目标码与真实处理器上执行的目标码一致,确保了测试结果的有效性,同时与现有的C语言单元测试工具结合可以构建自动化的嵌入式C语言目标码级单元测试解决方案。
Description
技术领域
本发明涉及一种嵌入式C语言单元测试方法,尤其涉及一种基于CPU模拟器的嵌入式C语言目标码级单元测试方法,属于计算机软件检测技术领域。
背景技术
单元测试目的是完成对软件的最小设计单元进行验证,充分的单元测试对发现软件中的缺陷,以及定位和排除这些缺陷都相对比较容易,所花的成本最小,这是因为单元测试中只包含较少的软件代码,所以软件缺陷比较容易隔离出来,因此对于排除软件缺陷,单元测试是最有效的一类测试。经验表明,单元测试具有不可替代的重要性,这个阶段发现的问题有相当大的一部分是在其后的测试阶段中很难发现的。
对于安全性和可靠性要求较高的嵌入式系统,单元测试是软件开发过程中的重要环节,日益受到软件设计师的重视。C语言目前仍是嵌入式软件开发的主流编程语言。C语言等高级语言编写的程序不能直接在目标系统上运行,其必须经过编译器的编译生成特定处理器的目标码才可以执行。而由于编译器的解释、优化等因素,使得编译器产生的目标码的控制流结构多少会与源代码不一致,二者之间控制流结构的不同在测试过程中会产生较大的差异。因此,仅对高级语言源代码验证并不能保证目标码执行的正确性。
目前,很多安全性和可靠性要求高的软件,都要求进行目标码级的验证。目标码验证确保真正在处理器上执行的代码是正确的,并建议在单元测试阶段就开始进行目标码验证,在开发阶段的早期识别出目标码和源代码结构覆盖的差异/不足,通过设计针对性的测试用例来对目标码进行验证。
针对嵌入式C语言的单元测试方案一般是手工或者利用C语言单元测试工具,如CANTATA、TestBed TBRun、Rational TestRealTime等辅助编写测试C语言函数用的测试驱动程序,然后利用PC机上的x86C语言编译器将测试驱动程序编译成可执行程序,执行该程序后,查看结果和统计C语言级的覆盖率。利用这种方法,被测试的程序实际是编译后的x86处理器上的程序,如果目标机的处理器与x86处理器不同,则测试的程序并不是真实的目标程序。目前,嵌入式系统的中使用的处理器多为TSC695、8051、C3X、PowerPC等不同于x86的处理器。因此,利用上述方法由于实际测试的目标码不同于真实的目标码,测试结果只对C语言源代码级的程序有效,而不能保证对真实的目标码有效。
发明内容
本发明解决的技术问题是:克服现有技术的不足,提供一种基于CPU模拟器的嵌入式C语言目标码级单元测试方法,该方法利用CPU模拟器解决被测的真实目标码在宿主机(通用PC机)上的运行以及目标码覆盖率统计问题。
本发明的技术解决方案是:一种基于CPU模拟器的嵌入式C语言目标码级单元测试方法,步骤如下:
(1)利用C语言单元测试工具生成被测程序的测试驱动程序;
(2)调用与目标处理器对应的嵌入式C语言编译器,将测试驱动程序编译成目标处理器运行的带调试信息的目标码;
(3)调用与目标处理器对应的CPU模拟器软件运行带调试信息的目标码,生成输出端口输出文件、反汇编程序和覆盖率文件;
(4)利用结果及覆盖率分析工具对CPU模拟器软件生成的输出端口输出文件、反汇编程序和覆盖率文件进行分析,获得测试结果和测试覆盖信息。
步骤(1)中测试驱动程序的基本结构包括将被测函数名称赋值给一个全局变量tested_proc_name的句柄、测试用例输入句柄Input_handle、调用被测函数test_proc句柄、测试结果输出句柄Output_handle和调用退出点函数EXIT_POINT句柄。
所述步骤(3)中的CPU模拟器软件为一个命令行程序,包括3个参数:
参数1:为输出信息的地址,为16进制,记为OUT_PORT;
参数2:为目标码的全路径名,记为Target_File;
参数3:为输出结果保存的路径,记为Out_Path;
CPU模拟器软件的工作过程为:
(1)CPU模拟器软件解析带调试信息的目标码,从带调试信息的目标码的路径Target_File中,获得EXIT_POINT函数的地址并记录在Stop_Addr变量中;获得tested_proc_name变量的地址并记录在ProcPointer变量中;
(2)CPU模拟器软件逐条执行Target_File中的目标码指令;
(3)在执行目标码的过程中,CPU模拟器软件监视输出信息的地址OUT_PORT,当该地址有输出时,在输出缓冲中记下输出值,当输出值为0时,将输出缓冲中记录的值输出到文件中,并清除输出缓冲;
(4)在执行目标码的过程中,CPU模拟器软件监视ProcPointer存储的tested_proc_name变量的地址,当tested_proc_name变量被写入时,获得写入的值,写入的值为包含被测函数名称的字符串地址,根据字符串地址获得被测函数名称的字符串,根据被测函数名称从调试信息中获得被测函数的开始地址和结束地址,并记录在开始地址Func_Start_Addr和结束地址Func_End_Addr中,CPU模拟器软件记录开始地址Func_Start_Addr和结束地址Func_End_Addr之间的语句和分支覆盖信息;
(5)在执行目标码的过程中,CPU模拟器软件监视当前运行的PC指针,当PC指针不等于Stop_Addr时,返回执行步骤(2),当PC指针等于Stop_Addr时,CPU模拟器软件停止运行,输出被测试函数的反汇编语句到文件中、输出被测试函数的覆盖率信息到文件中、输出OUT_PORT端口到文件中,三个文件保存在Out_Path目录中。
本发明与现有技术相比的优点在于:本发明充分利用现有的常用C语言单元测试工具的功能,构建自动化的嵌入式C语言目标码级单元测试解决方案。例如,步骤(1)可利用商用C语言单元测试工具都提供的测试驱动程序的辅助生成功能。步骤(2)可利用现有的商用C语言单元测试工具都提供的调用编译器编译源代码的功能;步骤(3)可利用现有的商用C语言单元测试工具都提供的调用程序执行的功能。针对不同的目标处理器只需要开发对应的CPU模拟器软件。利用商用C语言单元测试工具和CPU模拟器软件就可以形成自动化的嵌入式C语言目标码级单元测试解决方案。
本发明采用CPU模拟器技术,解决了不同嵌入式处理器的目标码在通用PC机上的执行问题,使得可以在通用PC机上进行嵌入式C语言目标码级的单元测试,本发明利用CPU模拟器,配合测试驱动程序的编写约定,实现了被测函数目标码覆盖率的自动记录和输出,能够统计测试用例执行的目标码语句和分支覆盖率。
本发明利用CPU模拟器运行被测试的真实目标码,并利用CPU模拟器输出运行时的目标码覆盖率信息,可以在宿主机(通用PC机)上进行C语言目标码级的单元测试。与现有技术相比,本发明保证被测试的C语言目标码与真实处理器上执行的目标码一致,确保了测试结果的有效性,同时与现有的C语言单元测试工具结合可以构建自动化的嵌入式C语言目标码级单元测试解决方案。
附图说明
图1是本发明的流程示意图;
图2是CPU模拟器软件执行的流程示意图;
图3是输出端口OUT_PORT地址监视的流程示意图;
图4是函数地址ProcPointer地址监视的流程示意图。
具体实施方式
如图1所述,本发明的实现方法为:
(1)利用C语言单元测试工具生成被测程序的测试驱动程序;
(2)调用与目标处理器对应的嵌入式C语言编译器,将测试驱动程序编译成目标处理器运行的带调试信息的目标码;
(3)调用与目标处理器对应的CPU模拟器软件运行带调试信息的目标码,生成输出端口输出文件、反汇编程序和覆盖率文件;
(4)利用结果及覆盖率分析工具对CPU模拟器软件生成的输出端口输出文件、反汇编程序和覆盖率文件进行分析,获得测试结果和测试覆盖信息。
步骤(1)中测试驱动程序的基本结构包括将被测函数名称赋值给一个全局变量tested_proc_name、测试用例输入Input_handle、调用被测函数test_proc、测试结果输出Output_handle和调用退出点函数EXIT_POINT。
步骤(3)中的CPU模拟器软件为一个命令行程序,包括3个参数:
参数1:为输出信息的地址,为16进制,记为OUT_PORT;
参数2:为目标码的全路径名,记为Target_File;
参数3:为输出结果保存的路径,记为Out_Path;
CPU模拟器软件的工作过程为:
(a)CPU模拟器软件解析带调试信息的目标码,从带调试信息的目标码的路径Target_File中,获得EXIT_POINT函数的地址并记录在Stop_Addr变量中;获得tested_proc_name变量的地址并记录在ProcPointer变量中;
(b)CPU模拟器软件逐条执行Target_File中的目标码指令;
(c)如图3所示,在执行目标码的过程中,CPU模拟器软件监视输出信息的地址OUT_PORT,当该地址有输出时,在输出缓冲中记下输出值,当输出值为0时,将输出缓冲中记录的值输出到文件中,并清除输出缓冲;
(d)如图4所示,在执行目标码的过程中,CPU模拟器软件监视ProcPointer存储的tested_proc_name变量的地址,当tested_proc_name变量被写入时,获得写入的值,写入的值为包含被测函数名称的字符串地址,根据字符串地址获得被测函数名称的字符串,根据被测函数名称从调试信息中获得被测函数的开始地址和结束地址,并记录在开始地址Func_Start_Addr和结束地址Func_End_Addr中,CPU模拟器软件记录开始地址Func_Start_Addr和结束地址Func_End_Addr之间的语句和分支覆盖信息;
(e)在执行目标码的过程中,CPU模拟器软件监视当前运行的PC指针,当PC指针不等于Stop_Addr时,返回执行步骤(b),当PC指针等于Stop_Addr时,CPU模拟器软件停止运行,输出被测试函数的反汇编语句到文件中、输出被测试函数的覆盖率信息到文件中、输出OUT_PORT端口到文件中,三个文件保存在Out_Path目录中。
在下面结合实例来进一步说明本发明的技术方案,在以下的说明中,将针对TSC695处理器上执行的C语言程序说明目标码级的单元测试方法。
被测函数的示例如下:
该函数的名称为add_proc,输入参数为两个单精度浮点数,功能为执行两个单精度浮点数的加,并返回。
步骤(1):编写测试驱动程序的示例如下:
该测试驱动程序中具有约定语句:
1)tested_proc_name="add_proc";对tested_proc_name变量的赋值语句。
2)EXIT_POINT();退出空函数的调用语句。
为了方便记录测试结果,在测试驱动程序中增加了info_output这样一个输出函数。该函数向0xE000地址输出字符串,并以0为输出结束标志。
步骤(2):调用支持TSC695处理器的GCC C语言编译器,将测试驱动程序编译为带调试信息的目标码,目标文件名为a.out。
步骤(3):调用TSC796处理器的CPU模拟软件。
调用已开发的TSC695处理器的CPU模拟器软件,软件名称为Sim695.exe。它是一个命令行程序,其参数包括3个。
参数1:为输出信息的地址,为16进制,记为OUT_PORT;
参数2:为目标码的全路径名,记为Target_File;
参数3:为输出结果保存的路径,记为Out_Path。
Sim695.exe运行结束后,会在Out_Path目录下生成四个文件,分别为:
1)disassemble.txt为被测函数的反汇编文件;
2)coverage.cov为被测函数执行后的覆盖率文件;
3)outInfo.txt为out_port地址的输出信息文件。
调用Sim695.exe执行目标文件。命令调用为:
Sim695.exe0xE000a.out c:\out_path
其中0xE000为输出信息的地址;a.out为目标文件名;c:\out_path为输出文件名。
Sim695.exe执行结束后,在c:\out_path目录下生成三个文件,分别为:
disassemble.txt为被测函数add_proc的反汇编文件;
在disassemble.txt反汇编文件中的函数名称为add_proc,反汇编文件中第一行对应的地址为0x2001518,第二行对应的地址为0x200151C,….,其中第8行对应的地址为0x2001534,并且该地址的语句是一个分支语句。
根据这个文件可以统计出被测函数中总的目标码语句数和分支数。
coverage.cov为被测函数执行后的覆盖率文件;
覆盖率文件的具体格式如下:
1)覆盖率文件是一个DWORD类型数组的存储。
2)每个DWORD的值与0xFFFFFFFC0为执行过的地址;
3)DWORD&0x3!=0x0表示该地址为一个条件跳转;
4)DWORD&0x1==0x1表示执行了条件跳转的真分支;
5)DWORD&0x2==0x2表示执行了条件跳转的假分支。
根据这个文件中,可以统计出测试驱动程序执行后,被测函数执行过的目标码语句数和分支数,并根据被测函数中总目标码语句数和分支数,获得本次执行的目标码语句和分支覆盖率。
outInfo.txt为out_port地址的输出信息。
该文件记录了从0xE000地址输出的字符串。可以用于记录测试状态,分析测试结果。在以上示例中,记录了测试用例的输入和输出,可用于分析测试用例执行结果是否通过。
步骤(4)通过分析disassemble.txt、disassemble.txt.line、coverage.cov、outInfo.txt文件,可以得到测试用例是否通过的结论,以及测试用例执行后的目标码级的语句和分支覆盖率。
以上所述,仅为本发明的较佳实例而已,并非用于限定本发明的保护范围。本发明说明书中未作详细描述的内容属于本领域专业技术人员的公知技术。
Claims (1)
1.一种基于CPU模拟器的嵌入式C语言目标码级单元测试方法,其特征在于步骤如下:
(1)利用C语言单元测试工具生成被测程序的测试驱动程序;所述测试驱动程序的基本结构包括将被测函数名称赋值给一个全局变量tested_proc_name的句柄、测试用例输入句柄Input_handle、调用被测函数test_proc句柄、测试结果输出句柄Output_handle和调用退出点函数EXIT_POINT句柄;
(2)调用与目标处理器对应的嵌入式C语言编译器,将测试驱动程序编译成目标处理器运行的带调试信息的目标码;
(3)调用与目标处理器对应的CPU模拟器软件运行带调试信息的目标码,生成输出端口输出文件、反汇编程序和覆盖率文件;
(4)利用覆盖率分析工具对CPU模拟器软件生成的输出端口输出文件、反汇编程序和覆盖率文件进行分析,获得测试结果和测试覆盖信息;
所述步骤(3)中的CPU模拟器软件为一个命令行程序,包括3个参数:
参数1:为输出信息的地址,为16进制,记为OUT_PORT;
参数2:为目标码的全路径名,记为Target_File;
参数3:为输出结果保存的路径,记为Out_Path;
CPU模拟器软件的工作过程为:
(a)CPU模拟器软件解析带调试信息的目标码,从带调试信息的目标码的路径Target_File中,获得EXIT_POINT函数的地址并记录在Stop_Addr变量中;获得tested_proc_name变量的地址并记录在ProcPointer变量中;
(b)CPU模拟器软件逐条执行Target_File中的目标码指令;
(c)在执行目标码的过程中,CPU模拟器软件监视输出信息的地址OUT_PORT,当该地址有输出时,在输出缓冲中记下输出值,当输出值为0时,将输出缓冲中记录的值输出到文件中,并清除输出缓冲;
(d)在执行目标码的过程中,CPU模拟器软件监视ProcPointer存储的tested_proc_name变量的地址,当tested_proc_name变量被写入时,获得写入的值,写入的值为包含被测函数名称的字符串地址,根据字符串地址获得被测函数名称的字符串,根据被测函数名称从调试信息中获得被测函数的开始地址和结束地址,并记录在开始地址Func_Start_Addr和结束地址Func_End_Addr中,CPU模拟器软件记录开始地址Func_Start_Addr和结束地址Func_End_Addr之间的语句和分支覆盖信息;
(e)在执行目标码的过程中,CPU模拟器软件监视当前运行的PC指针,当PC指针不等于Stop_Addr时,返回执行步骤(b),当PC指针等于Stop_Addr时,CPU模拟器软件停止运行,输出被测试函数的反汇编语句到文件中、输出被测试函数的覆盖率信息到文件中、输出OUT_PORT端口到文件中,三个文件保存在Out_Path目录中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410381755.0A CN104156311B (zh) | 2014-08-05 | 2014-08-05 | 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410381755.0A CN104156311B (zh) | 2014-08-05 | 2014-08-05 | 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104156311A CN104156311A (zh) | 2014-11-19 |
CN104156311B true CN104156311B (zh) | 2017-09-29 |
Family
ID=51881816
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410381755.0A Active CN104156311B (zh) | 2014-08-05 | 2014-08-05 | 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104156311B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105677557A (zh) * | 2014-11-20 | 2016-06-15 | 国核(北京)科学技术研究院有限公司 | 核电软件测试系统和方法 |
CN106445803B (zh) * | 2016-08-17 | 2019-03-01 | 中国航空工业集团公司西安飞行自动控制研究所 | 一种安全关键嵌入式软件目标码覆盖率分析方法 |
CN106843993B (zh) * | 2016-12-26 | 2019-07-30 | 中国科学院计算技术研究所 | 一种逆向解析gpu指令的方法及系统 |
CN106844221B (zh) * | 2017-03-10 | 2020-05-22 | 深圳航天科技创新研究院 | 一种实现虚拟验证系统覆盖率分析的方法 |
CN107977315B (zh) * | 2017-12-07 | 2021-02-09 | 中国航发控制系统研究所 | 一种基于Bootloader方式的嵌入式软件目标码单元测试方法 |
CN110647467B (zh) * | 2019-09-23 | 2021-05-28 | 上海创景信息科技有限公司 | 基于单步异常的目标码覆盖率测试方法、系统及介质 |
CN112597007B (zh) * | 2020-12-14 | 2023-10-03 | 中国航发控制系统研究所 | 一种嵌入式软件集成测试完整性分析方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN201392526Y (zh) * | 2009-03-25 | 2010-01-27 | 大连海事大学 | 用于移动应用程序的机上测试系统 |
CN101706750A (zh) * | 2009-11-16 | 2010-05-12 | 西安邮电学院 | 一种基于嵌入式模拟器的测试桩获取方法 |
-
2014
- 2014-08-05 CN CN201410381755.0A patent/CN104156311B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN201392526Y (zh) * | 2009-03-25 | 2010-01-27 | 大连海事大学 | 用于移动应用程序的机上测试系统 |
CN101706750A (zh) * | 2009-11-16 | 2010-05-12 | 西安邮电学院 | 一种基于嵌入式模拟器的测试桩获取方法 |
Non-Patent Citations (1)
Title |
---|
汇编语言自动单元测试工具设计方法研究;郭向英,刘景炜;《质量与可靠性》;20061231;第2006年卷(第3期);第50-53页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104156311A (zh) | 2014-11-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104156311B (zh) | 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 | |
CN101739339B (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
CN105678169B (zh) | 一种二进制程序漏洞挖掘方法和系统 | |
CN102147764B (zh) | 测试代码质量评估 | |
US6430741B1 (en) | System and method for data coverage analysis of a computer program | |
US9898387B2 (en) | Development tools for logging and analyzing software bugs | |
US7503037B2 (en) | System and method for identifying bugs in software source code, using information from code coverage tools and source control tools to determine bugs introduced within a time or edit interval | |
RU2473115C2 (ru) | Способ автоматического генерирования сценария для проверки правильности функционального программного обеспечения системы, установленной на борту летательного аппарата, и устройство для применения способа | |
Pereira et al. | SPELLing out energy leaks: Aiding developers locate energy inefficient code | |
KR102537875B1 (ko) | 차량 ecu 소프트웨어 검증을 위한 동적 결함 주입 방법 및 장치 | |
US9183114B2 (en) | Error detection on the stack | |
CN103257919B (zh) | 脚本程序检查方法和装置 | |
JP6342129B2 (ja) | 混合モードプログラムのソースコードエラー位置検出装置及び方法 | |
CN106529304B (zh) | 一种安卓应用并发漏洞检测系统 | |
CN104375941A (zh) | 可执行程序测试用例集二进制代码覆盖率自动化评估方法 | |
CN102567164A (zh) | 用于处理器的指令集批量测试装置与方法 | |
CN109145534B (zh) | 针对软件虚拟机保护的反混淆系统及方法 | |
CN104850411A (zh) | 存储系统基准评测程序生成方法及装置 | |
CN104699605B (zh) | 一种驱动程序的代码覆盖率测量方法及装置 | |
CN112925524A (zh) | 一种检测驱动程序中不安全直接存储器访问的方法及装置 | |
US20180322033A1 (en) | Code Coverage Tracking For A Microcontroller Program | |
CN113836023B (zh) | 一种基于体系结构交叉检查的编译器安全性测试方法 | |
Gerasimov et al. | An approach to reachability determination for static analysis defects with the help of dynamic symbolic execution | |
CN103365772B (zh) | 软件测试自动评价装置以及方法 | |
US9176846B1 (en) | Validating correctness of expression evaluation within a debugger |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |