2015-09-09 30 views

回答

0

不,沒有給你一個你的代碼的WindView事件列表的命令。

爲什麼不搜索所有源文件中包含wvEvent的所有行並刪除重複項?這將產生的所有事件的列表...

---更新---

我寫了下面的小庫勾VxWorks的符號表中的符號。這可以用來掛鉤加載的應用程序內的系統調用,符號被掛鉤。

以下機制的工作由於ld命令解決使用系統符號表中的應用程序的所有未解決的引用(例如調用printf與符號printf的值,它是printf實現的地址被替換)。

這裏是圖書館的代碼:

#include <vxWorks.h> 
#include <symLib.h> 

#define MAX_HOOKS 256 

typedef struct vxhook_struct 
{ 
    SYMTAB_ID symTblId; /** id of symbol table containing the symbol */ 
    SYMBOL *symbol;  /** pointer to symbol entry within symbol table */ 

    void *originalValue; /** original value of symbol */ 
    void *hookedValue;  /** hooked value of symbol */ 
} VXHOOK; 

/** counter of installed hooks */ 
static int hooks = 0; 

/** list of installed hooks */ 
static VXHOOK hook[MAX_HOOKS]; 


/* 
** symbolIterator 
** VxWorks callback for symbol table iteration. See symEach(..) for more information. 
*/ 
static BOOL symbolIterator(char *name, 
          int val, 
          SYM_TYPE type, 
          int arg, 
          UINT16 group) 
{ 
    BOOL result = TRUE; /* continue iteration */ 
    char *pName; 


    pName = (char *)arg; 
    if ((pName != NULL) && (name != NULL)) 
    { 
     if (!strcmp(name, pName)) 
     { 
     result = FALSE; /* symbol found => stop iteration! */ 
     } 
    } 

    return (result); 
} 


/* 
** vxHookGet 
** Searches the hook list for a specific entry and returns a pointer to it if found. 
*/ 
static VXHOOK *vxHookGet(SYMTAB_ID symTblId, /* symbol table to seachr for name */ 
         char *name,   /* name of symbol */ 
         int *index)   /* optional return value of index within hook list */ 
{ 
    VXHOOK *pHook = NULL; 
    int i; 


    if (index != NULL) 
    { 
     *index = -1; 
    } 

    for (i = 0; i < hooks; i++) 
    { 
     if ((hook[i].symTblId == symTblId) && (!strcmp(hook[i].symbol->name, name))) 
     { 
     pHook = &(hook[i]); 

     if (index != NULL) 
     { 
      *index = i; 
     } 

     break; 
     } 
    } 

    return (pHook); 
} 


/* 
** vxHook 
** Hooks a symbol within a symbol table (if not already hooked). 
*/ 
STATUS vxHook(SYMTAB_ID symTblId, /* symbol table to seachr for name */ 
       char *name,   /* name of symbol */ 
       void *value,   /* new value to replace symbol value with */ 
       void **pValue)  /* optional pointer receiving original value from symbol table */ 
{ 
    STATUS result = ERROR; 
    SYMBOL *symbol; 
    VXHOOK *pHook; 


    if ((name != NULL) && (value != NULL)) 
    { 
     pHook = vxHookGet(symTblId, name, NULL); 
     if (pHook == NULL) /* symbol not hooked, yet? */ 
     { 
     if (hooks < MAX_HOOKS) /* free entries available? */ 
     { 
      pHook = &(hook[hooks]); 

      symbol = symEach(symTblId, symbolIterator, (int)name); 
      if (symbol != NULL) /* symbol found? */ 
      { 
       pHook->symTblId = symTblId; 
       pHook->symbol = symbol; 
       pHook->originalValue = symbol->value; 
       pHook->hookedValue = value; 

       if (pValue != NULL) 
       { 
        *pValue = symbol->value; 
       } 

       /* install hook */ 
       symbol->value = value; 
       printf("Value of symbol '%s' modified from 0x%x to 0x%x.\n", name, pHook->originalValue, pHook->hookedValue); 

       hooks++; 
       result = OK;  
      } 
      else 
      { 
       printf("Symbol '%s' not found in symTblId=0x%08x.\n", name, symTblId); 
      } 
     } 
     else 
     { 
      printf("Maximum number of hooks (%d) reached.\n", MAX_HOOKS); 
     } 
     } 
     else 
     { 
     printf("Symbol '%s' in symTblId=0x%08x already hooked.\n", name, symTblId); 
     } 
    } 

    return (result); 
} 


/* 
** vxHookList 
** Prints a list of all installed hooks to stdout. 
*/ 
STATUS vxHookList(void) 
{ 
    int i; 

    printf(" name    symTblId value  original\n"); 
    printf("------------------- ---------- ---------- ----------\n"); 
    for (i = 0; i < hooks; i++) 
    { 

     printf("%3d: 0x%08x %s\n", i, hook[i].symTblId, hook[i].symbol->name); 
    } 

    return (OK); 
} 


/* 
** vxUnhook 
** Unhooks a hooked symbol (restoring the original value). 
*/ 
STATUS vxUnhook(SYMTAB_ID symTblId, /* symbol table to search for name */ 
       char *name)   /* name of symbol */ 
{ 
    STATUS result = ERROR; 
    VXHOOK *pHook; 
    int i; 


    pHook = vxHookGet(symTblId, name, &i); 
    if (pHook != NULL) 
    { 
     pHook->symbol->value = pHook->originalValue; 
     printf("Original value 0x%x of symbol '%s' restored.\n", pHook->originalValue, name); 

     /* remove hook */ 
     hooks--; 

     /* shift remaining hooks... */ 
     for (; i < hooks; i++) 
     { 
     memcpy(&(hook[i]), &(hook[i + 1]), sizeof(VXHOOK)); 
     } 

     result = OK; 
    } 
    else 
    { 
     printf("Hook for '%s' (symTblId=0x%08x) not found.\n", name, symTblId); 
    } 

    return (result); 
} 

掛鉤wvEvent(..)電話,你必須做到以下幾點:

#include <wvLib.h> 
#include <symLib.h> 

STATUS (*WVEVENT_FPTR)(event_t, char *, size_t); 

WVEVENT_FPTR orig_wvEvent = wvEvent; 

STATUS my_wvEvent(event_t usrEventId,  /* event */ 
        char * buffer,   /* buffer */ 
        size_t bufSize)   /* buffer size */ 
{ 
    /* create a list of usrEventId... */ 

    return (orig_wvEvent(usrEventId, buffer, bufSize)); 
} 

STATUS hookWvEvents(void) 
{ 
    STATUS result = ERROR; 

    result = vxHook(sysSymTbl, "wvEvent", my_wvEvent, &orig_wvEvent); 

    return (result); 
} 

調用hookWvEvents後,您可以加載您的應用程序,並wvEvent所有呼叫從你的應用程序中將被重定向到my_wvEvent(然後傳遞給原始的wvEvent函數)。請記住,即使您使用vxUnhook取消掛鉤符號,掛鉤符號仍然適用於您的應用程序。

注意:這種機制也是應用測試和調試非常有幫助的,因爲你可以強調通過強制系統應用程序調用失敗...

+0

感謝盧卡斯,我這樣做。我的問題是OS代碼是在不同的環境中與應用程序代碼分開構建的,所以我一直在考慮vxWorks是否可以識別所有的用戶事件。 – user1756845

+0

@ user1756845嗯......思考一下後,我可以想到一些鉤住函數'wvEvent(..)'的代碼,並生成所有生成的WindView事件(以及它們來自哪個線程)的列表。如果這可以幫助你,我可以提供一些代碼... –

+0

雅,謝謝盧卡斯,如果有這樣的代碼,我會非常想看到它。 – user1756845