调试器可以帮助跟踪应用程序中的问题。设置断点并逐步执行代码可以帮助开发人员理解应用程序的实际工作方式,并查看可能出现问题的地方。这种方法的问题是,许多应用程序都是时间敏感的,在操作过程中停止它们可能是灾难性的。例如,在电机控制应用程序中间碰到一个断点可能会对高速旋转的转子造成不良影响,因为它不再被实时控制。同样地,跟踪GPU中运行的数百个线程也同样具有挑战性。
跟踪工具是传统调试器的补充,但它们经常被开发人员忽略。这些工具通常是开发套件的一部分,但采用不同的调试方法,因为跟踪工具捕获大量信息,这些信息有时可以在接近实时或在后期分析期间进行分析。当然,原始的跟踪数据往往是巨大的,有成千上万的条目和大量的细节(图1).
例如,青山软件的SuperTrace Probe可以捕获高达4 g字节的跟踪数据在核心时钟速率高达1.2 GHz和跟踪端口速度超过300 MHz。仪器化软件是捕获跟踪信息的另一种方法。硬件具有开销低或没有开销的优点,而仪器仪表则会带来一些开销。劳特巴赫的Trace32系列硬件平台甚至支持管理程序感知。
利用所有这些跟踪信息的诀窍是拥有良好的表示和分析工具。Percepio的TraceAnalyzer(图2),可以利用的LTTng项目的Linux跟踪工具(LTT)输出并以各种图形格式显示它,以突出显示工作流和时间考虑事项,并识别错误。Percepio有超过20种方法可以图形化地查看跟踪细节,这使得识别不同类型的问题更加容易。
软件跟踪工具可以添加到应用程序中,一些操作系统也内置了它。这允许跟踪操作系统事件,如线程上下文切换、服务API调用和系统中断。Express Logic自己的TraceX与ThreadX RTOS一起工作,这也是瑞萨的协同作用提供微控制器硬件和匹配软件(包括ThreadX)的解决方案。
跟踪信息的粒度会影响信息的分析和利用方式。例如,Green Hills Software TimeMachine调试套件(MULTI IDE的一部分)捕获指令计数器,因此可以在执行的代码中向前和向后步进。该接口类似于开发人员使用调试器所拥有的接口,但传统的调试器只能在程序执行过程中向前移动。当然,TimeMachine仅限于跟踪已经完成执行的线程,但这正是开发人员想要检查的。
Green Hills路径分析仪(图3)提供应用程序调用堆栈随时间变化的更紧凑的视图。它允许开发人员确定程序可能偏离预期路径的位置。它还可以突出显示中断或随机错误如何影响所需的应用程序操作。一个称为EventAnalyzer的补充工具使用跟踪信息来跟踪死锁等问题。
为开发环境寻找跟踪支持并不总是容易的。有些平台,特别是嵌入式开发平台,通常有多种选择。有些环境可能有更有限的选择。例如,微软的Visual Studio (VS) IntelliTrace处理Visual Basic和Visual c#应用程序。当然,VS是使用这些语言开发应用程序的唯一方法。
NVidia的Nsight IDE用一组跟踪工具来瞄准它的gpu(图4)包括OpenCL内核跟踪、Direct3D 11/12、OpenGL、CUDA C/ c++和OpenCL API跟踪,以及OpenGL工作负载跟踪。这种系统分析方法往往比步进调试器更有用,因为涉及到大量的线程和数据。图形界面允许检查在跟踪流中显示的相关操作的源代码。
在多核或非对称处理器环境中使用跟踪工具可能具有挑战性,但非常有用,因为使用传统方法很难调试通信和同步问题。同步跟踪信息是一个更有挑战性的方面,但是基于硬件的解决方案往往很容易做到这一点。纯软件的解决方案问题更大,而且依赖于硬件,这可能会也可能不会使这成为可能。
跟踪工具在分析延迟和截止日期等问题时非常有用,这些问题很难用其他方法进行检查。它们还可以方便地检查处理器利用率和查找内存泄漏。