CN105074671B - 用于在内核模块和设备驱动程序中检测并发编程错误的方法和系统 - Google Patents

用于在内核模块和设备驱动程序中检测并发编程错误的方法和系统 Download PDF

Info

Publication number
CN105074671B
CN105074671B CN201380073923.3A CN201380073923A CN105074671B CN 105074671 B CN105074671 B CN 105074671B CN 201380073923 A CN201380073923 A CN 201380073923A CN 105074671 B CN105074671 B CN 105074671B
Authority
CN
China
Prior art keywords
event
memory
context
record
user
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
Application number
CN201380073923.3A
Other languages
English (en)
Other versions
CN105074671A (zh
Inventor
马志强
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Intel Corp
Original Assignee
Intel Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Intel Corp filed Critical Intel Corp
Publication of CN105074671A publication Critical patent/CN105074671A/zh
Application granted granted Critical
Publication of CN105074671B publication Critical patent/CN105074671B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3632Software debugging of specific synchronisation aspects

Abstract

在内核空间中操作的设备驱动程序和其它软件中错误和缺陷的存在可能难以发现和消除。一种用于调试计算机程序的系统和方法可以涉及使用若干不同模块。在内核空间中运行的是事件监视器。在用户空间中运行的是事件收集器、事件播放器和并发错误检测器。该设置允许使用存在的用户空间错误检测器调试在内核空间中执行的设备驱动程序软件和其它软件。

Description

用于在内核模块和设备驱动程序中检测并发编程错误的方法 和系统
技术领域
实施例涉及软件。一些实施例涉及用于检测软件中的错误的方法。
背景技术
操作系统是管理计算设备的资源且为计算机程序提供服务用以在内部操作的软件集合。存在许多现今在使用中的操作系统。现今在使用中的常见操作系统包括MicrosoftWindows®、OS X®、iOS®、开源(open-source)Linux®OS和Android®。应当理解,计算设备可以包括桌上型计算机、服务器、膝上型计算机、诸如电话和平板之类的便携式设备、游戏机、数字视频记录器、包含计算元件的其他设备等等。
设备驱动程序是在操作系统内操作且用来操作或控制附连至计算机的设备的计算机程序。设备驱动程序与附连至计算机的设备通信。即使计算机程序不具体知道什么类型的外部设备,设备驱动程序也允许该程序与外部设备通信。例如,当计算机程序向打印机发出打印命令时,设备驱动程序处理信息至打印机可以理解的格式的转换。用户可以将来自不同制造商的不同打印机附连至计算机,但是程序仍然可以打印到不同的打印机,这是因为设备驱动程序处理至每个打印机的通信。许多不同的设备使用设备驱动程序,其包括打印机、视频适配器、网络适配器、声卡、存储设备、相机等等。
附图说明
在不一定按比例绘制的附图中,同样的附图标记在不同的视图中可以描述类似的部件。具有不同字母后缀的同样附图标记可以表示类似部件的不同实例。在附图的图中,一些实施例通过示例且非限制性地予以图示,其中:
图1是图示实施例的框图。
图2是图示样本代码的操作的部分次序图。
图3是图示在实施例中事件播放器的主线程的操作的流程图。
图4是图示在实施例中事件播放器内的代理线程(surrogate thread)的操作的流程图。
图5是图示示例机器的框图,其中本文所论述的技术(例如,方法论)中的任一个或更多个可以在所述示例机器上被执行。
具体实施方式
以下描述和附图充分地图示具体实施例用以使本领域技术人员能够实践所述具体实施例。其他实施例可以结合结构的、逻辑的、电气的过程以及其他改变。示例仅仅代表可能的变动。单独的部件和功能是可选的,除非明确要求,以及操作的顺序可以变化。一些实施例的部分和特征可以被包括在其他实施例的部分和特征中,或者代替它们。权利要求中阐述的实施例包括那些权利要求的所有可获得的等效物。
在以下详细描述中,阐述了众多具体细节以便提供对本发明的透彻理解。然而,本领域技术人员将理解的是,本发明可以在没有这些具体细节的情况下被实践。在其他实例中,没有详细地描述众所周知的方法、进程、部件和电路以便不使本发明难理解。
尽管在这方面不限制本发明的实施例,但是如本文所使用的术语“多数”和“多个”例如可以包括“多”或“两个或更多个”。可以贯穿整个说明书使用术语“多数”或“多个”来描述两个或更多个部件、设备、元件、单元、参数等等。例如,“多个站”可以包括两个或更多个站。
典型的计算机操作系统将可用的存储器隔离成内核空间和用户空间。内核空间典型地用来运行操作系统和设备驱动程序。用户空间是大多数其他应用(例如,音乐播放器、电影播放器、游戏、浏览器、商业软件等等)进行操作的地方。虽然与用户空间相比,对在内核空间中运行设备驱动程序存在性能优点,但是对在内核空间中运行设备驱动程序也存在缺点。可能包含用户空间中的错误或缺陷。使在用户空间中操作的一款软件崩溃的大多数缺陷仅使该特定程序崩溃——在用户空间中操作的其他程序不受影响。与此相反,在内核空间中正运行的设备驱动程序内的错误或缺陷可能在内核空间中引起问题,诸如重写内核空间存储器的重要区域。这样的问题可能引起整个操作系统崩溃,这可能导致每个程序崩溃。这个的结果是在Microsoft Windows OS®中系统的大约80%崩溃是由设备驱动程序中的缺陷引起的。类似地,Linux®中的设备驱动程序的缺陷率是内核的其余部分的缺陷率的大约7倍。
现在(以及可能将来)的操作系统和计算机常常能够同时执行多条指令。这通常使用诸如多个处理器和/或多个线程之类的技术来完成。这些技术增加了计算机的性能,但是它们可能导致可能难以检测的错误。
可能难以检测的这样的错误的一个示例是竞争状况。当分开的过程或线程依赖于共享状态时出现竞争状况。当两个分开的线程尝试访问共享数据并且数据访问中的至少一个是写入时,这可能发生。
作为简单的示例,假定两个线程分别具有简单任务—使变量y递增1。假定,在线程发生之前y==1。在第一示例中,线程一在线程二之前执行。线程一读取变量y为1,使y递增到2,然后将变量y=2写入存储器。然后线程二执行。它从存储器读取变量y,发现值为2,把值递增至3,然后把变量y=3写入存储器。
在第二示例中,线程一和线程二并发地操作。线程一和线程二这两者读取y的值为1。两个线程于是使值y递增,然后将该值写入存储器。但是线程一和线程二这两者把y=2的值写入存储器。因此,如果线程一个接一个地执行,则与线程并发操作(在第二示例中y=2)时相比,结果可能不同(在第一示例中y=3)。虽然所有这样的错误难以检测,但是在设备驱动程序中它们甚至更难以再现和调试,这是因为设备驱动程序可能在内核空间中执行,其更难调试。
参照图1,呈现实施例可以如何被实施的框图。实施例可以在内核空间102和用户空间104内操作。实施例可以包含若干部件:事件监视器110(在内核空间102中)、事件收集器120(在用户空间104中)、事件播放器130(在用户空间104中)以及并发错误检测器140(在用户空间104中)。在实施例中,事件监视器110和事件收集器120可以运行在计算设备上,而事件播放器130和并发错误检测器140可以运行在开发主机上。在图1中还图示了插装式内核模块(instrumented kernel module)或设备驱动程序150和跟踪器(trace)152。插装式设备驱动程序150是通过实施例测试的设备。跟踪器152用来从事件收集器120收集信息并且转发给事件播放器130。
事件监视器
事件监视器110是在目标设备上的内核空间内部运行的设备驱动程序。为了图示事件监视器如何工作以及正在监视什么事件,驱动程序上下文(context)的概念应当首先被论述。使用具有代码的示例来更好地解释驱动程序上下文的概念。
清单1是针对该论述的程序“testfoo.c”的示例清单。
/* testfoo.c
这是打开设备驱动程序/dev/foo
然后创建两个线程、即
write_foo线程和read_foo线程
并且在关闭文件之前等待所述
线程完成的主程序 */
清单1。
参考清单1,呈现了称为testfoo.c的程序的样本C代码。在清单1中,应用testfoo.c首先打开设备/dev/foo,然后创建两个子线程、即write_foo()和read_foo()。一个子线程(write_foo())用来向设备写入数据,以及另一个子线程(read_foo())用来从设备读取数据。一旦testfool.c完成了读取任务和写入任务,它就关闭该设备。清单1中的线程的使用示出了read_foo()和write_foo()能够并行操作。针对设备dev/foo的内核驱动程序可以具有open()、read()、write()和release()操作。
针对内核驱动程序的样本代码示例示出在清单2中。对在驱动程序代码中的 foo_write()和foo_read()中的共享变量x的访问可以创建竞争状态,这在下面更详细地解释。
/* 以下代码示例来自针对设备/dev/foo的内核驱动程序,
该代码可以由程序testfoo.c调用
*/
/* 当进行open()系统调用时,调用该函数 */
/* 当进行read()系统调用时调用该函数 */
/* 当进行write()系统调用时调用该函数 */
/* 当进行close()系统调用时调用该函数 */
/* 当中断发生时调用该中断处理程序 */
清单2。
每个文件操作或处理程序可以视为上下文(context)。当操作或处理程序开始时,上下文开始,并且当操作或处理程序完成时,该上下文结束。例如,当调用foo_open()时,针于/dev/foo的驱动程序进入打开上下文,以及当foo_open()返回时,该驱动程序离开打开上下文。(见清单2)。类似地,当调用foo_interrupt()时,驱动程序进入中断上下文,以及当foo_interrupt()返回时,该驱动程序离开中断上下文。(见清单2)。
每个上下文均具有类型。在该示例中,上下文例如可以包括CONTEXT_OPEN、CONTEXT_RELEASE、CONTEXT_READ、CONTEXT_WRITE、 CONTEXT_INTERRUPT等。每个上下文还具有标识符(“id”),其是用于文件操作的文件指针(例如,参数结构体文件(argumentstruct file)*file的值)或用于中断处理程序的中断号(例如,中断请求(irq))。
事件监视器110监视在所分析的目标设备上发生的各种事件。这些被监视的事件包括但不限于以下内容:上下文进入/退出(context entry/exit);存储器读取/写入;存储器分配/解除分配(每(per-)中央处理单元(CPU)存储器和全局存储器);同步(线程创建/联合(join)、互斥_创建、互斥加锁/解锁、中断处理程序注册/撤销注册等);以及函数调用/返回。
为了监视这些事件,可以插装(instrumented)驱动程序代码(见图1的块150)。换言之,对于每个感兴趣的事件,在运行时间可以插入和执行额外的代码以在内部缓冲器中记录感兴趣的事件。可以以各种各样不同的方式来执行插装。一般而言,在源级别,例如使用编译器,或者在二进制级别,例如使用内核探针,或者这二者的组合,来完成插装。
对于每个感兴趣的事件,可以由事件监视器110记录以下信息:事件类型、线程标识符(“id”)、CPU id和指令指针。对于上下文进入和退出事件,可以记录上下文类型(CONTEXT_OPEN、 CONTEXT_RELEASE、CONTEXT_READ、CONTEXT_WRITE、 CONTEXT_INTERRUPT等)和上下文id。对于存储器读取和写入事件,可以记录所访问的存储器的地址和所访问的存储器的大小。对于存储器分配/解除分配,可以记录存储器的地址、存储器的大小和存储器的类型(每CPU存储器或全局存储器)。对于同步事件,可以记录同步对象(例如,线程、互斥(mutex)、信号量等)的地址和同步的类型。对于函数调用/返回事件,可以记录函数进入点的地址和线程堆栈指针。
事件收集器
继续参考图1,事件收集器120读取从缓冲器移动到事件监视器110中的事件数据。事件数据可以存储在磁盘文件中以使事件播放器后来读取。在替代方案中,可以使事件数据直接流到事件播放器130。实质上,事件收集器120将事件数据从内核空间102移动到用户空间104。事件收集器120被布置成发送数据到事件跟踪器152。
事件播放器
事件播放器130重放来自事件跟踪器152的每个事件。然而,事件播放器130不重放驱动程序代码的执行。相反,事件播放器重放每个事件的出现以及按照遵从部分次序图的次序把每个事件发送到并发错误检测器140。
事件播放器130可以是多线程的。正执行的每个驱动程序线程在事件播放器130中具有至少一个对应线程(称为代理线程)。每个代理线程在事件播放器130中还具有事件队列。
为了图示事件播放器130的操作,可以检查较早地在清单1和2中呈现的针对/dev/foo的示例驱动程序的事件跟踪器。当该示例驱动程序操作时,进入以及退出以下上下文:
这些上下文的部分次序图在图2中示出。CONTEXT_OPEN事件210导致CONTEXT_WRITE事件220和CONTEXT_READ事件230。CONTEXT_WRITE事件220和CONTEXT_READ事件230导致CONTEXT_RELEASE事件240。
注意的是,在图2中CONTEXT_WRITE事件220和CONTEXT_READ事件230是并行地图示的。这不仅仅是因为在测试程序testfoo.c中对于read()调用和write()调用这二者同时创建线程并且保持激活。另外,在语义上,foo_read()和foo_write()函数可以并行地操作。例如,可以容易地构建两个单线程程序,其中一个程序打开、读取和关闭设备的一个文件,而另一个程序打开、写入和关闭具有相同设备驱动程序的相同设备的第二文件。这两个程序可以潜在地并行运行。
类似地,CONTEXT_OPEN事件210在CONTEXT_RELEASE事件240之前发生,这是因为可以被关闭的文件必须先前已经打开。然后,如果CONTEXT_OPEN 210和CONTEXT_RELEASE 240分别具有不同的上下文id(换言之,它们在不同的文件上进行操作),则它们可以无任何冲突地并行操作。换言之,第一文件上的foo_open()函数可以与第二文件上的foo_close()函数并行操作。这是为什么对于每个上下文需要上下文id。
每个类型的驱动程序定义该类型的驱动程序可以具有的一列文件操作。文件操作的语义典型地被良好定义——通常相对容易确定两个文件操作(具有相同文件指针或不同文件指针)究竟是否可以并行运行。因此,给定事件跟踪器,事件播放器可以在重放事件时构建部分次序上下文图。如果两个上下文并行运行,则事件播放器创建并行运行的两个代理线程,并且每个代理线程重放一个上下文。如果两个上下文不并行运行,则上下文按顺序被执行。
图3是图示在实施例中事件播放器的主线程的操作的流程图。检查事件以看该事件是否是上下文的进入(例如,CONTEXT_WRITE 进入)(302)。如果事件不是上下文进入,则代理线程已经在运行。找到可应用的代理线程(350)以及把该事件放到代理线程的事件队列中(352)。
如果该事件是上下文进入,则确定对于该上下文是否已经存在代理线程(304)。如果代理线程存在,则找到正确的代理线程和相关联的id(308)以及在代理线程中对该事件排队列(320)。否则,创建代理线程并且保存相关信息(例如,驱动程序线程id和代理线程id)(310)以及为代理线程创建事件队列(312)。此后,基于部分次序上下文图排定代理线程运行(320)。
图4是图示在实施例中在事件播放器内的代理线程的操作的流程图。把该事件从队列移除(402)。此后,用代理线程id替代线程id(404)。此后,把事件发送给并发错误检测器(406),其操作在下面更详细地描述。
并发错误检测器
并发错误检测器140分析来自事件播放器中的每个代理线程的每个事件。从并发错误检测器140的角度看,事件从在用户空间102中运行的程序中获取,因而简化并发错误检测器140的操作。当前存在的工具或将来创建工具、诸如在线或离线线程检查器,可以被用作并发错误检测器。
实施例把在内核空间中存在的问题转换成在用户空间中存在的问题。实施例检测用户空间中的数据竞争,而不是通过使用内核调试器检测例如在内核空间中的数据竞争。使用内核调试器来调试数据竞争要求数据竞争实际发生。即使内核空间中的数据竞争未实际发生,实施例也检测用户空间中的数据竞争。
图5是图示本文所论述的技术(例如,方法论)中的任一个或更多个可以执行于其上的示例机器500的框图。在替代实施例中,机器500可以作为独立设备操作或者可以连接(例如,联网)到其他机器。在联网的部署中,机器500可以作为服务器机器、客户端机器或者这二者在服务器-客户端网络环境中操作。在示例中,机器500在对等(P2P)(或其他分布式)网络环境中可以充当对等机。机器500可以是个人计算机(PC)、平板PC、机顶盒(STB)、个人数字助理(PDA)、移动电话、网络装备(web appliance)、网络路由器、交换机或电桥、或者能够(顺序地或以其他方式)执行指定要由该机器采取的动作的指令的任何机器。此外,虽然只图示了单个机器,但是术语“机器”也应当被认为包括单独地或联合地执行指令集或(多个指令集)用以执行本文所论述的任何一个或更多个方法论的任何机器集合,诸如云计算、作为服务的软件(SaaS)、其他计算机集群配置。
如本文所描述的,示例可以包括逻辑或多个部件、模块或机制或者可以在逻辑或多个部件、模块或机制上操作。模块是能够执行指定操作的有形实体(例如,硬件)以及可以以一定的方式进行配置或布置。在示例中,电路可以以指定方式作为模块布置(例如,在内部或相对于外部实体,所述外部实体诸如其他电路)。在示例中,一个或更多个计算机系统(例如,独立的客户端或服务器计算机系统)或一个或更多个硬件处理器的整体或一部分可以由固件或软件(例如,指令、应用部分、或应用)作为操作用以执行指定操作的模块来配置。在示例中,软件可以驻留在机器可读媒介上。在示例中,软件当由模块的基础硬件执行时促使该硬件执行指定操作。
因此,术语“模块”被理解为包括有形实体,是在物理上被构建、特定地被配置(例如,被硬接线)或者临时(例如,暂时)被配置(例如,被编程)用以以指定方式操作或用以执行本文所描述的任何操作的一部分或全部的实体。考虑临时配置模块的示例,模块中的每一个都不需要在任何一个时刻及时被实例化。例如,在模块包括使用软件配置的通用硬件处理器的情况下,通用硬件处理器可以在不同时间被配置为相应的不同模块。软件因此可以配置硬件处理器,例如用以在一个时间阶段构成特定模块以及在不同的时间阶段构成不同的模块。
机器(例如,计算机系统)500可以包括硬件处理器502(例如,中央处理单元(CPU)、图形处理单元(GPU)、硬件处理器核、或其任何组合)、主存储器504和静态存储器506,它们中的一些或全部可以经由相互链接508彼此通信。相互链接508可以是任何类型的通信路径,诸如点对点互连或多点分支总线或其组合。机器500可以进一步包括显示设备510、字母数字输入设备512(例如,键盘)、以及用户接口(UI)导航设备514(例如,鼠标或跟踪板)。在示例中,显示设备510、输入设备512和UI导航设备514可以是实现所有三个任务的触摸屏显示器。机器500另外可以包括大容量存储设备(例如,驱动单元)516、信号生成设备518(例如,扬声器)以及网络接口设备520。机器500可以包括输出控制器(未示出),诸如串行(例如,通用串行总线(USB))、并行或其他有线或无线(例如,红外(IR))连接,用来传送或控制一个或更多个外围设备(例如,打印机、读卡器等等)。
大容量存储设备516可以包括机器可读媒介522,在其上存储有体现本文所描述的技术或功能中的任何一个或更多个或者被本文所描述的技术或功能中的任何一个或更多个利用的一组或更多组数据结构或指令524(例如,软件)。指令524在通过机器500对其执行期间还可以完全或者至少部分地驻留在主存储器504内、静态存储器506内、或硬件处理器502内。在示例中,硬件处理器502、主存储器504、静态存储器506、或大容量存储设备516中的一个或任何组合可以构成机器可读媒介。
虽然将机器可读媒介522图示为单个媒介,但是术语“机器可读媒介”可以包括被布置成存储一个或更多个指令524的单个媒介或多个媒介(例如,集中式或分布式数据库、和/或相关联的高速缓冲存储器和服务器)。
术语“机器可读媒介”可以包括能够存储、编码或承载指令用于由机器500执行或者促使机器500执行本公开的技术中的任何一个或更多个或者能够存储、编码或承载被这样的指令使用或与这样的指令相关联的数据结构的任何媒介。非限制性机器可读媒介示例可以包括固态存储器和光学及磁性媒介。在示例中,大规模机器可读媒介包括带有具有静止质量(resting mass)的多个粒子的机器可读媒介。大规模机器可读媒介的具体示例可以包括:非易失性存储器,诸如半导体存储装置(例如,电可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM))和闪速存储装置;磁盘,诸如内置硬盘和可移动盘;磁光盘;以及CD-ROM、DVD-ROM和蓝光光盘。
指令524可以进一步使用传输媒介经由利用多个传送协议(例如,帧中继、因特网协议(IP)、传输控制协议(TCP)、用户数据报协议(UDP)、超文本传送协议(HTTP)等)中的任何一个的网络接口设备520通过通信网络526被发送或接收。示例通信网络可以尤其包括局域网(LAN)、广域网(WAN)、分组数据网(例如,因特网)、移动电话网(例如,蜂窝式网络)、普通老式电话(Plain Old Telephone, POTS)网和无线数据网(例如,已知为Wi-Fi®的电气与电子工程师协会(IEEE)802.11标准族、已知为WiMAX®的IEEE 802.16标准族)、对等(P2P)网络。在示例中,网络接口设备520可以包括一个或更多个物理插孔(例如,以太网、同轴或电话插孔)或一个或更多个天线,用来连接到通信网络526。在示例中,网络接口设备520可以包括多个天线,用来使用单输入多输出(SIMO)、多输入多输出(MIMO)或多输入单输出(MISO)技术中的至少一个无线地通信。术语“传输媒介”应被认为包括能够存储、编码或承载指令用于由机器500执行并且包括数字或模拟通信信号的任何无形媒介,或用来促进这样的软件的通信的其他无形媒介。
以下示例涉及另外的实施例。
示例1包括用于调试计算机软件的主题(诸如设备,装置,或用户设备(UE)),其包括:事件监视器;事件收集器,其耦合到所述事件监视器;事件播放器,其耦合到所述事件收集器;以及并发错误检测器,其耦合到所述事件播放器;其中被调试的计算机软件包括多个事件;所述事件监视器被布置成在系统存储器的内核空间部分中执行被调试的计算机软件;所述事件收集器、所述事件播放器和所述并发错误检测器分别被布置成在系统存储器的用户空间部分中执行;以及所述事件播放器被布置成在系统存储器的所述用户空间部分中重放所述多个事件中的每一个。
在示例2中,示例1的主题可以可选地包括:其中所述系统被布置成对设备驱动程序软件进行调试。
在示例3中,示例1和2中的任一个或这二者的主题可以可选地包括:其中所述被调试的计算机软件被插装。
在示例4中,示例1至3中的任一个或更多个的主题可以可选地包括:其中所述事件监视器被布置成记录事件类型、线程标识符、CPU标识符、以及指令指针信息。
在示例5中,示例1至4中的任一个或更多个的主题可以可选地包括:其中所述事件监视器进一步被布置成记录上下文进入事件、上下文退出事件、上下文类型、以及与所述上下文进入事件和上下文退出事件有关的上下文标识符信息。
在示例6中,示例1至5中的任一个或更多个的主题可以可选地包括:其中所述事件监视器进一步被布置成记录用于存储器读取和存储器写入事件的存储器地址信息和存储器大小信息;以及所述事件监视器进一步被布置成记录用于存储器分配和存储器解除分配事件的存储器地址信息、存储器大小信息和存储器类型信息。
在示例7中,示例1至6中的任一个或更多个的主题可以可选地包括:其中所述事件监视器进一步被布置成记录用于同步事件的同步对象地址和同步类型。
在示例8中,示例1至7中的任一个或更多个的主题可以可选地包括:其中所述事件收集器被布置成从所述事件监视器读取事件数据。
在示例9中,示例1至8中的任一个或更多个的主题可以可选地包括:其中所述事件收集器进一步被布置成可从系统存储器的所述用户空间读取。
在示例10中,示例1至9中的任一个或更多个的主题可以可选地包括:其中所述事件播放器被布置成从所述事件收集器读取事件。
在示例11中,示例1至10中的任一个或更多个的主题可以可选地包括:其中所述事件播放器进一步被布置成:创建所述事件收集器中的事件的部分次序图;确定事件是否是上下文进入事件;如果所述事件是上下文进入事件,则创建代理线程和用于所述代理线程的事件队列;以及基于所述部分次序图对所述代理线程的执行进行排定。
在示例12中,示例1至11中的任一个或更多个的主题可以可选地包括:其中创建部分次序图包括确定来自所述事件收集器的事件是否能够被并行执行。
在示例13中,示例1至12中的任一个或更多个的主题可以可选地包括:其中所述并发错误检测器被布置成分析来自事件播放器中的代理线程的每个事件。
示例14可以包括或可以可选地与示例1-13中的任何一个的主题相组合以包括主题(诸如用于执行动作的方法、装置,包括当由机器执行时促使机器执行动作的指令的机器可读媒介,或者被配置用以执行的装置),用于调试计算机程序代码,其包括插装所述计算机程序代码,其中所述计算机程序代码包括多个事件;在系统存储器的内核空间中执行所述程序代码;在执行所述计算机程序代码期间监视每个事件;记录关于每个事件的数据;在系统存储器的用户空间中读取关于每个事件的数据;在系统存储器的所述用户空间中重放每个事件;以及在系统存储器的所述用户空间中分析每个事件。
在示例15中,示例14的主题可以可选地包括:其中监视每个事件包括记录事件类型、线程标识符、CPU标识符、以及指令指针信息。
在示例16中,示例14和15中的任一个或这二者的主题可以可选地包括:其中监视每个事件进一步包括:记录上下文进入事件、上下文退出事件、上下文类型、以及与所述上下文进入事件和上下文退出事件有关的上下文标识符信息;记录用于存储器读取和存储器写入事件的存储器地址信息和存储器大小信息;记录用于存储器分配和存储器解除分配事件的存储器地址信息、存储器大小信息和存储器类型信息;记录用于同步事件的同步对象地址和同步类型。
在示例17中,示例14至16中的任一个或更多个的主题可以可选地包括:其中重放系统存储器的所述用户空间中的每个事件包括:创建所述多个事件的部分次序图;确定所述多个事件中的事件是否是上下文进入事件;如果事件是上下文进入事件,则创建代理线程和用于所述代理线程的事件队列;以及基于所述部分次序图对所述代理线程的执行进行排定。
在示例18中,示例14至17中的任一个或更多个的主题可以可选地包括:其中创建部分次序图包括确定所述多个事件中的哪些事件能够被并行执行。
在示例19中,示例14至18中的任一个或更多个的主题可以可选地包括:为能够并行执行的每个事件创建代理线程。
上面的详细描述包括对形成该详细描述的一部分的附图的参考。附图通过图解的方式示出了可以被实践的具体实施例。这些实施例在本文也称为“示例”。这样的示例可以包括除了所示出或所描述的那些之外的元素。然而,还预期到的是包括所示出的或所描述的元素的示例。此外,还预期到的是相对于特定示例(或其一个或更多个方面))或者相对于本文所示出的或所描述的其他示例(或其一个或更多个方面)使用所示出的或所描述的那些元素(或其一个或更多个方面)的任何组合或置换的示例。
在该文档中所提到的出版物、专利和专利文档通过引用以其整体合并于此,好像通过引用单独合并。在该文档与那些通过引用如此合并的文档之间的不一致的用途情况下,在所合并的(多个)参考文献中的用途是对该文档的用途的补充;对于不可调和的不一致性,在该文档中的用途进行控制。
在该文档中,独立于任何其他实例或“至少一个”或“一个或更多个”的使用,如在专利文档中常见的,使用术语“一”或“一个”用来包括一个或一个以上。在该文档中,术语“或”用来指的是非排他性或,因此“A或B”包括“A而非B”、“B而非A”以及“A和B”,除非另外指示。在所附权利要求中,术语“包括”和“其中”用作相应术语“包含”和“其中”的简明英语等效物。同样,在以下权利要求中,术语“包括”和“包含”是开放式的,也就是说,包括除了在权利要求中这样的术语之后列出的那些之外的元素的系统、设备、物品或过程仍被视为落入该权利要求的范围之内。而且,在以下权利要求中,术语“第一”、“第二”和“第三”等仅仅用作标号,并且不意图暗示用于其对象的数字次序。
上面的描述意图是说明性的,而非限制性的。例如,上面描述的示例(或其一个或更多个方面)可以与其他组合地使用。在检阅上面的描述时,诸如由本领域普通技术人员可以使用其他实施例。摘要允许读者快速地探知技术公开的性质,例如用以遵从美国的37C.F.R. § 1.72(b)。在摘要将不用来解释或限制权利要求的含义或范围的理解的情况下提交该摘要。同样,在上面的详细描述中,可以将各个特征聚集以使本公开流线型。然而,权利要求可能未阐述本文所公开的每个特征,因为实施例可以以所述特征的子集为特征。此外,实施例可以包括与特定示例中所公开的那些相比更少的特征。因而,以下权利要求特此合并到详细描述中,其中权利要求作为单独的实施例而独立存在。本文所公开的实施例的范围要参考所附权利要求连同这样的权利要求被授权于的等效物的全部范围来确定。
虽然本文已经图示和描述了本发明的某些特征,但是对于本领域技术人员而言可以想到许多修改、替代、改变和等效物。因此应当理解的是,所附权利要求意图涵盖落入本发明范围内的所有这样的修改和改变。尽管已经论述了使用实施例来调试设备驱动程序软件,但是应当理解的是,实施例可以被用来调试任何类型的软件程序。

Claims (25)

1.一种用于调试计算机软件的系统,包括:
事件监视器(110);
事件收集器(120),其耦合到所述事件监视器(110);
事件播放器(130),其耦合到所述事件收集器(120);以及
并发错误检测器(140),其耦合到所述事件播放器(130),其中:
被调试的计算机软件包括对应于多个事件的指令;
所述事件监视器(110)被布置成在系统存储器的内核空间部分(102)中执行被调试的计算机软件并且作为数据记录所述多个事件;
所述事件收集器(120)被布置成在系统存储器的用户空间部分(104)中执行并且从所述事件监视器(110)读取所记录的数据以及从系统存储器的所述用户空间部分(104)是可读取的;其特征在于,
所述事件播放器(130)被布置成在系统存储器的用户空间部分(104)中执行并且从所述事件收集器(120)读取所记录的数据并且在系统存储器的所述用户空间部分(104)中从所记录的数据播放所述多个事件中的每一个,创建所述多个事件的部分次序图,确定(302)所述多个事件中的事件是否是上下文进入事件(210),并且如果所述事件是上下文进入事件(210),则创建(310,312)代理线程和用于所述代理线程的事件队列;以及
基于所述部分次序图对所述代理线程的执行进行排定(320);以及
所述并发错误检测器(140)被布置成在系统存储器的用户空间部分(104)中执行并且以与部分次序图一致的次序对从所述事件播放器(130)中接收的所述多个事件中的每一个执行并发错误检测。
2.如权利要求1所述的系统,其中,所述系统被布置成对设备驱动程序软件进行调试。
3.如权利要求1所述的系统,其中,被调试的计算机软件被插装。
4.如权利要求1所述的系统,其中:
所述事件监视器被布置成记录事件类型、线程标识符、CPU标识符、以及指令指针信息。
5.如权利要求4所述的系统,其中:
所述事件监视器进一步被布置成记录上下文进入事件、上下文退出事件、上下文类型、以及与所述上下文进入事件和上下文退出事件有关的上下文标识符信息。
6.如权利要求4或5之一所述的系统,其中:
所述事件监视器进一步被布置成记录用于存储器读取和存储器写入事件的存储器地址信息和存储器大小信息;以及
所述事件监视器进一步被布置成记录用于存储器分配和存储器解除分配事件的存储器地址信息、存储器大小信息、以及存储器类型信息。
7.如权利要求4或5之一所述的系统,其中:
所述事件监视器进一步被布置成记录用于同步事件的同步对象地址和同步类型。
8.如权利要求6所述的系统,其中:
所述事件监视器进一步被布置成记录用于同步事件的同步对象地址和同步类型。
9.如权利要求1所述的系统,其中,创建部分次序图包括确定来自所述事件收集器的事件是否能够被并行执行。
10.如权利要求1所述的系统,其中,所述并发错误检测器被布置成分析来自事件播放器中的代理线程的每个事件。
11.一种调试计算机程序代码的方法,包括:
插装所述计算机程序代码,其中所述计算机程序代码包括对应于多个事件的指令;
在系统存储器的内核空间(102)中执行所述程序代码;
在执行所述计算机程序代码期间监视所述多个事件中的每一个;
记录关于所述被监视的多个事件中的每一个的数据;
将关于每个事件的所记录的数据读取到系统存储器的用户空间(104)中;其特征在于,
在系统存储器的所述用户空间(104)中通过事件播放器(130)从系统存储器的用户空间(104)中的所记录的数据重放每个事件,其中在存储器的用户空间(104)中重放每个事件包括:
创建所述多个事件的部分次序图;
确定(302)所述多个事件中的事件是否是上下文进入事件(210);
如果所述事件是上下文进入事件(210),则创建(310,312)代理线程和用于所述代理线程的事件队列;以及基于所述部分次序图对所述代理线程的执行进行排定(320);以及
在系统存储器的用户空间部分(104)中以与部分次序图一致的次序对从所述事件播放器接收的所述多个事件中的每一个执行并发错误检测。
12.如权利要求11所述的方法,其中,监视每个事件包括记录事件类型、线程标识符、CPU标识符、以及指令指针信息。
13.如权利要求12所述的方法,其中,监视每个事件进一步包括:
记录上下文进入事件、上下文退出事件、上下文类型、以及与所述上下文进入事件和上下文退出事件有关的上下文标识符信息;
记录用于存储器读取和存储器写入事件的存储器地址信息和存储器大小信息;
记录用于存储器分配和存储器解除分配事件的存储器地址信息、存储器大小信息和存储器类型信息;
记录用于同步事件的同步对象地址和同步类型。
14.如权利要求12所述的方法,其中,创建部分次序图包括确定所述多个事件中的哪些事件能够被并行执行。
15.如权利要求14所述的方法,进一步包括:
为能够被并行执行的每个事件创建代理线程。
16.一种包括用于调试计算机程序代码的指令的机器可读媒介,所述指令当由计算设备执行时促使所述计算设备:
在所述计算设备的系统存储器的内核空间(102)中执行所述程序代码;
在执行所述计算机程序代码期间监视多个事件中的每一个;
记录关于所述被监视的多个事件中的每一个的数据;
将关于每个事件的所记录的数据读取到系统存储器的用户空间(104)中;其特征在于,
在系统存储器的所述用户空间(104)中通过事件播放器(130)从系统存储器的用户空间(104)中的所记录的数据重放每个事件,其中在存储器的用户空间(104)中重放每个事件包括:
创建所述多个事件的部分次序图;
确定(302)所述多个事件中的事件是否是上下文进入事件(210);
如果所述事件是上下文进入事件(210),则创建(310,312)代理线程和用于所述代理线程的事件队列,以及基于所述部分次序图对所述代理线程的执行进行排定(320);以及
以与部分次序图一致的次序对从所述事件播放器接收的所述多个事件中的每一个执行并发错误检测。
17.如权利要求16所述的机器可读媒介,其中,用以监视每个事件的指令包括当由所述计算设备执行时促使所述计算设备记录事件类型、线程标识符、CPU标识符、以及指令指针信息的指令。
18.如权利要求17所述的机器可读媒介,其中,用以监视每个事件的指令进一步包括当由所述计算设备执行时促使所述计算设备执行下列内容的指令:
记录上下文进入事件、上下文退出事件、上下文类型、以及与所述上下文进入事件和上下文退出事件有关的上下文标识符信息;
记录用于存储器读取和存储器写入事件的存储器地址信息和存储器大小信息;
记录用于存储器分配和存储器解除分配事件的存储器地址信息、存储器大小信息和存储器类型信息;以及
记录用于同步事件的同步对象地址和同步类型。
19.如权利要求16所述的机器可读媒介,其中,用以创建部分次序图的指令包括当由所述计算设备执行时促使所述计算设备确定所述多个事件中的哪些事件能够被并行执行的指令。
20.如权利要求19所述的机器可读媒介,进一步包括当由所述计算设备执行时促使所述计算设备为能够并行执行的每个事件创建代理线程的指令。
21.一种调试计算机程序代码的设备,包括:
用于插装所述计算机程序代码的装置,其中所述计算机程序代码包括对应于多个事件的指令;
用于在系统存储器的内核空间(102)中执行所述程序代码的装置;
用于在执行所述计算机程序代码期间监视所述多个事件中的每一个的装置;
用于记录关于所述被监视的多个事件中的每一个的数据的装置;
用于将关于每个事件的所记录的数据读取到系统存储器的用户空间(104)中的装置;其特征在于,
用于在系统存储器的所述用户空间(104)中通过事件播放器(130)从系统存储器的用户空间(104)中的所记录的数据重放每个事件的装置,其中在存储器的用户空间(104)中重放每个事件的装置包括:
用于创建所述多个事件的部分次序图的装置;
用于确定(302)所述多个事件中的事件是否是上下文进入事件(210)的装置;
用于如果所述事件是上下文进入事件(210),则创建(310,312)代理线程和用于所述代理线程的事件队列以及基于所述部分次序图对所述代理线程的执行进行排定(320)的装置;以及
用于在系统存储器的用户空间部分(104)中以与部分次序图一致的次序对从所述事件播放器接收的所述多个事件中的每一个执行并发错误检测的装置。
22.如权利要求21所述的设备,其中,用于监视每个事件的装置包括用于记录事件类型、线程标识符、CPU标识符、以及指令指针信息的装置。
23.如权利要求22所述的设备,其中,用于监视每个事件的装置进一步包括:
用于记录上下文进入事件、上下文退出事件、上下文类型、以及与所述上下文进入事件和上下文退出事件有关的上下文标识符信息的装置;
用于记录用于存储器读取和存储器写入事件的存储器地址信息和存储器大小信息的装置;
用于记录用于存储器分配和存储器解除分配事件的存储器地址信息、存储器大小信息和存储器类型信息的装置;
用于记录用于同步事件的同步对象地址和同步类型的装置。
24.如权利要求21所述的设备,其中,用于创建部分次序图的装置包括用于确定所述多个事件中的哪些事件能够被并行执行的装置。
25.如权利要求24所述的设备,进一步包括:
用于为能够被并行执行的每个事件创建代理线程的装置。
CN201380073923.3A 2013-03-27 2013-03-27 用于在内核模块和设备驱动程序中检测并发编程错误的方法和系统 Active CN105074671B (zh)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/US2013/034131 WO2014158151A1 (en) 2013-03-27 2013-03-27 Method and system for detecting concurrency programming errors in kernel modules and device drivers

Publications (2)

Publication Number Publication Date
CN105074671A CN105074671A (zh) 2015-11-18
CN105074671B true CN105074671B (zh) 2018-04-20

Family

ID=51624936

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201380073923.3A Active CN105074671B (zh) 2013-03-27 2013-03-27 用于在内核模块和设备驱动程序中检测并发编程错误的方法和系统

Country Status (4)

Country Link
US (1) US9235497B2 (zh)
EP (1) EP2956861B1 (zh)
CN (1) CN105074671B (zh)
WO (1) WO2014158151A1 (zh)

Families Citing this family (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9235497B2 (en) 2013-03-27 2016-01-12 Intel Corporation Method and system for detecting concurrency programming errors in kernel modules and device drivers
US9678851B2 (en) * 2013-10-14 2017-06-13 International Business Machines Corporation Continuous monitoring and analysis of software events
CN105045711B (zh) * 2015-06-30 2018-04-06 北京嘀嘀无限科技发展有限公司 一种并发的模拟测试方法及装置
US10423330B2 (en) * 2015-07-29 2019-09-24 International Business Machines Corporation Data collection in a multi-threaded processor
CN105224454B (zh) 2015-09-25 2018-06-05 华为技术有限公司 一种调试方法、多核处理器和调试设备
US9747191B1 (en) * 2015-10-05 2017-08-29 Amazon Technologies, Inc. Tool to replicate actions across devices in real time for improved efficiency during manual application testing
CN106598844B (zh) * 2016-11-17 2020-07-31 南京博雅区块链研究院有限公司 移动终端及基于移动终端代码缺陷率的计算方法
US10452459B2 (en) 2016-12-09 2019-10-22 Microsoft Technology Licensing, Llc Device driver telemetry
US10467082B2 (en) 2016-12-09 2019-11-05 Microsoft Technology Licensing, Llc Device driver verification
CN108229161A (zh) * 2016-12-15 2018-06-29 中国电信股份有限公司 应用监控方法、装置和终端
US10198341B2 (en) 2016-12-21 2019-02-05 Microsoft Technology Licensing, Llc Parallel replay of executable code
US10261925B2 (en) 2017-06-23 2019-04-16 Microsoft Technology Licensing, Llc Enhanced techniques for detecting programming errors in device drivers
US10860411B2 (en) * 2018-03-28 2020-12-08 Futurewei Technologies, Inc. Automatically detecting time-of-fault bugs in cloud systems
US10599552B2 (en) 2018-04-25 2020-03-24 Futurewei Technologies, Inc. Model checker for finding distributed concurrency bugs
CN111381980B (zh) * 2020-02-12 2023-04-07 上海机电工程研究所 用于混合仿真的互联系统、方法
CN112306819B (zh) * 2020-11-24 2022-07-12 微医云(杭州)控股有限公司 异常事件的回放方法、装置、电子设备以及存储介质
CN113051166A (zh) * 2021-03-30 2021-06-29 上海商汤科技开发有限公司 系统追踪方法、装置、设备及存储介质
CN116107846B (zh) * 2023-04-12 2023-07-25 北京长亭未来科技有限公司 一种基于EBPF的Linux系统事件监控方法及装置

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101251792A (zh) * 2006-12-19 2008-08-27 英特尔公司 用于受应用管理的线程单元的结构化异常处理

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7389497B1 (en) * 2000-07-06 2008-06-17 International Business Machines Corporation Method and system for tracing profiling information using per thread metric variables with reused kernel threads
US7028229B2 (en) 2002-09-30 2006-04-11 Sun Microsystems, Inc. Kernel event subscription and publication system and method
WO2005089400A2 (en) * 2004-03-17 2005-09-29 Riverstone Networks, Inc. Managing process state information in an operating system environment
US8516483B2 (en) * 2005-05-13 2013-08-20 Intel Corporation Transparent support for operating system services for a sequestered sequencer
US8010969B2 (en) * 2005-06-13 2011-08-30 Intel Corporation Mechanism for monitoring instruction set based thread execution on a plurality of instruction sequencers
US7917901B2 (en) * 2006-08-07 2011-03-29 International Business Machines Corporation Maintainable dynamic instrumentation technique for changing versions of software
CN100504792C (zh) * 2006-10-06 2009-06-24 国际商业机器公司 在用户空间中进行系统调用截取的方法和系统
JP5286942B2 (ja) 2008-05-30 2013-09-11 富士通株式会社 制御方法、制御プログラム及び情報処理装置
KR20100078081A (ko) * 2008-12-30 2010-07-08 (주) 세인트 시큐리티 커널 기반 시스템 행위 분석을 통한 알려지지 않은 악성코드 탐지 시스템 및 방법
US8402318B2 (en) * 2009-03-24 2013-03-19 The Trustees Of Columbia University In The City Of New York Systems and methods for recording and replaying application execution
US20130159977A1 (en) * 2011-12-14 2013-06-20 Microsoft Corporation Open kernel trace aggregation
US9235497B2 (en) * 2013-03-27 2016-01-12 Intel Corporation Method and system for detecting concurrency programming errors in kernel modules and device drivers

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101251792A (zh) * 2006-12-19 2008-08-27 英特尔公司 用于受应用管理的线程单元的结构化异常处理

Also Published As

Publication number Publication date
WO2014158151A1 (en) 2014-10-02
US9235497B2 (en) 2016-01-12
US20140331211A1 (en) 2014-11-06
EP2956861A4 (en) 2016-10-12
CN105074671A (zh) 2015-11-18
EP2956861B1 (en) 2019-06-19
EP2956861A1 (en) 2015-12-23

Similar Documents

Publication Publication Date Title
CN105074671B (zh) 用于在内核模块和设备驱动程序中检测并发编程错误的方法和系统
US11500762B2 (en) System and method for automated intelligent mobile application testing
CN104246759B (zh) 应用程序接口测试服务
US20190332521A1 (en) Providing debug information on production containers using debug containers
US20130263090A1 (en) System and method for automated testing
US9460261B2 (en) Computer-implemented verification system for performing a functional verification of an integrated circuit
US11042471B2 (en) System and method for providing a test manager for use with a mainframe rehosting platform
US9244819B2 (en) Attribute value properties for test selection with cartesian product models
US20140032641A1 (en) Virtual intelligent platform management interface for hardware components
CN103795749B (zh) 用于诊断运行在云环境中的软件产品的问题的方法和装置
US11080844B2 (en) System and method for testing an electronic device
US20090178030A1 (en) System, method and program for executing a debugger
CN109871326A (zh) 一种脚本录制的方法和装置
US10203371B2 (en) Methods and systems for generating functional test patterns for manufacture test
JP2005235019A5 (zh)
TWI566090B (zh) Debugging firmware / software to produce tracking systems and methods, recording media and computer program products
CN105308578B (zh) 状态转变的诊断
CN108182058A (zh) 一种基于云平台的软件开发方法和云开发平台
WO2019009976A1 (en) REMOTE DEBUGGING FOR ADVANCED COMPUTER ENVIRONMENTS
CN105453033A (zh) 程序测试服务
US11467946B1 (en) Breakpoints in neural network accelerator
JP2013198158A (ja) ハードウェアプロトコルスタック
US20130318499A1 (en) Test script generation
US9442826B2 (en) Kernel functionality checker
CN109542729A (zh) 设备性能参数数据分析方法及装置

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