VisionWorks学习之如何调试


VisionWorks是基于GPU加速的,不能像在cpu上调试那样方便,但是Nvidia也提供了一些方法,用于调试和分析应用程序。下面详细说明一下。

调试

visionworks有各种错误检查机制,可以帮助开发人员检测和调试由api的错误使用、无效的原始参数或资源分配问题引起的故障。这些机制包括:

  • 基于api的错误状态代码

  • 基于api的错误日志回调函数

  • 控制台消息日志

在下面的小节中,将进一步解释这些错误调试机制。

第一种方法:基于API的错误状态码

大多数VisionWorks API函数返回一个vx_status状态代码,该代码显示函数是否已完成,是否有错误。

  • 如果没有错误,这些函数返回VX_SUCCESS。

  • 当出现错误时,这些函数返回一个错误代码,指示在执行API期间遇到的问题。错误代码定义为vx_status_envx_status_e类型中的枚举值。
    例如

   vx_status status = vxVerifyGraph(graph);
    if (status != VX_SUCCESS) {
        fprintf(stderr, "Graph verification failed %d\n", status);
    }

有一些返回对象引用的函数(例如,对象创建函数),不会直接返回状态代码;在这种情况下,应用程序仍然可以通过调用vxGetStatus以返回的对象引用作为参数来查询状态。

vx_graph graph = vxCreateGraph(context);
if(vxGetStats((vx_reference)graph) != VX_SUCESS){
        fprintf(stderr, "Graph creation failed\n");
}

第二种方法:基于API的错误日志回调函数

错误状态代码对于在运行时检测意外错误很有用,但它不能传递大量信息,并且可能不足以在应用程序开发时正确理解和分析问题,一些api函数在内部执行复杂的操作序列,在这种情况下,一个简单的错误代码不能详细地告诉您实际的问题是什么。例如,这是图形验证(vxVerifyGraph)、图形执行(vxProcessGraph)和以立即模式执行任何视觉原语(如vxUopticalFlowPyrlk)的情况。

要获得有关任何错误的更多信息,可以使用vxRegisterLogCallback将日志回调函数注册到Context。当此上下文中发生任何错误时,将调用回调函数,回调必须具有由vx_log_callback_f定义的接口。

下面是一个示例程序:

/* This function has an error since input and output images of the
 * node don't have the same dimensions
 */
void function_with_error(vx_context context, vx_image in, vx_image out)
{
    /* Single node graph */
    vx_graph graph = vxCreateGraph(context);
    if (vxGetStatus((vx_reference)graph) != VX_SUCCESS) {
        fprintf(stderr, "Graph creation failed\n");
    }
    vxColorConvertNode(graph, in, out);
    vx_status status = vxVerifyGraph(graph);
    if (status != VX_SUCCESS) {
        fprintf(stderr, "Graph verification failed %d\n", status);
    }
}
void VX_CALLBACK logCallback(vx_context, vx_reference ref, vx_status status,
                             const vx_char message[])
{
    fprintf(stderr, "Error [ref=" VX_FMT_REF ", status=%d] :\n%s\n",
            ref, status, message);
}
void main_function(vx_context context, vx_image in, vx_image out)
{
    // Register a non reentrant log callback to the context
    vxRegisterLogCallback(context, &logCallback, vx_false_e);
    // Call a function that will generate an error
    function_with_error(context, in, out);
}

执行以上代码示例将生成以下信息:

Error [ref=0x2c7bbf0, status=-10] :
vxVerifyGraph: node[color_convert].parameter[1]: invalid image (dims=640x480,format=VX_DF_IMAGE_YUV4), expected dims=1920x1080,format=VX_DF_IMAGE_YUV4

能够打印哪个流程出错了,错误是什么,这个应该是非常方便的。

第三种方法:通过设置打印日志Zones设置终端消息日志内容

在某些情况下,通过API调用报告控制台消息日志错误可能不够,因为这些错误是由一系列操作组合导致的。VisionWorks提供了另一层状态报告机制,通过名为NVX_LOG的环境变量进行控制。NVX_LOG环境变量允许将各种消息直接报告到控制台中直接生成的标准输出流(stdout)。

NVX_LOG控制某些类型操作的调试消息,称为“zones”。通过将NVX_LOG环境变量设置为必须激活的区域列表(用逗号分隔),可以启用不同的区域调试消息VisionWorks定义了以下区域:

  • error:错误消息

  • warning:警告消息

  • API: API调用

  • data:关于数据对象的信息

  • graph:与图形验证、执行和在立即模式下执行原语有关的信息

  • memory:内存分配/释放信息

  • perf : 性能消息

  • misc:杂项

  • all : 激活所有控制台日志消息

例如,在linux/bash下:

export NVX_LOG=error,graph

对于上面例子将会产生以下消息:

ZONE_GRAPH: {22cd89c0} [0] Create a graph
ZONE_GRAPH: {22cd89c0}    [1] No graph options inherited from the NVX_GRAPH env variable
ZONE_GRAPH: {22cd89c0}    [1] Created graph object 0x38d8a70 OK
ZONE_GRAPH: {22cd89c0} [0] Create a node org.khronos.openvx.color_convert (enum: 1) in graph 0x38d8a70
ZONE_GRAPH: {22cd89c0}    [1] Set parameter color_convert.0 (0x38d9040) : type=IMAGE ref=0x38d7900
ZONE_GRAPH: {22cd89c0}    [1] Set parameter color_convert.1 (0x38d9040) : type=IMAGE ref=0x38d81a0
ZONE_GRAPH: {22cd89c0}    [1] Created node object 0x38d9040 OK
ZONE_GRAPH: {22cd89c0} [0] Verification of graph 0x38d8a70
ZONE_GRAPH: {22cd89c0}    [1] Graph optimization level: 2
ZONE_GRAPH: {22cd89c0}    [1] No cycle detected in the graph : OK
ZONE_GRAPH: {22cd89c0}    [1] Node parameters validation
ZONE_GRAPH: {22cd89c0}       [2] Validate parameters from node 0x38d9040, name = color_convert
ZONE_GRAPH: {22cd89c0}          [3] Expected output: IMAGE, dims=1920x1080, format=VX_DF_IMAGE_YUV4
ZONE_ERROR: {22cd89c0}          [3] invalid image (dims=640x480,format=VX_DF_IMAGE_YUV4), expected dims=1920x1080,format=VX_DF_IMAGE_YUV4

中间的大特号中的数字表示是打印日志的线程{22cd89c0}

另一种控制调试消息的方法是nvxSetLogZone函数。它启用/禁用不同的日志区域。nvxSetLogZone函数重写NVX_LOG环境变量预设。nvxSetLogZone使用示例:

    nvxSetLogZone(NVX_LOG_ZONE_ERROR, vx_true_e);
    nvxSetLogZone(NVX_LOG_ZONE_GRAPH, vx_true_e);

图调试和可视化

Message Logs

openvx图形可以是复杂的对象,通常需要开发人员特别注意。当Graph出现问题时,首先应该激活Graph的日志消息,以及警告和错误消息。
可以这样做:

export NVX_LOG=error,warning,graph

   nvxSetLogZone(NVX_LOG_ZONE_ERROR, vx_true_e);
    nvxSetLogZone(NVX_LOG_ZONE_WARNING, vx_true_e);
    nvxSetLogZone(NVX_LOG_ZONE_GRAPH, vx_true_e);

使用环境变量设置Graph选项

临时设置Graph选项非常有用;例如,禁用所有优化,可以通过设置NVX_GRAPH环境变量为带有NVX_GRAPH_VERIFY_OPTIONS graph属性的API设置的所有Graph选项。为了简化NVX_GRAPH环境变量的定义,可以使用逗号代替空格作为分隔符。

export NVX_GRAPH=-O0,--dot,dot_

特别说明:使用NVX_GRAPH环境变量设置的选项适用于应用程序的所有图形。如果应用程序已经使用API为某些图形设置了选项,那么通过定义 NVX_GRAPH_VERIFY_OPTIONS 属性,该属性设置的选项被认为具有更高的优先级。

可视化图

为了检查openvx图形的格式是否正确,或者将其他开发人员创建的graph可视化,visionworks提供了将graph表示成点输出到一个文件中的选项。这个图可以通过任何读取点文件的工具来可视化,例如linux/ubuntu下的xdot。

激活点生成的最简单方法是设置nvx_graph环境变量:

export NVX_GRAPH=--dot,<file prefix>

每个graph产生两个文件,一个是应用程序创建的,另一个是vxVerifyGraph创建的。

<file prefix>_<graph id>_initial.dot  : Graph created by the application
<file prefix>_<graph id>_executed.dot : Graph to be actually executed after verification

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值