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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章