是否有一個vxWorks命令列出了代碼中編譯的所有wv事件。我正在嘗試隔離使用vxWorks 6.5的某個產品上的所有事件。如何打印所有vxWorks wvEvents
0
A
回答
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
取消掛鉤符號,掛鉤符號仍然適用於您的應用程序。
注意:這種機制也是應用測試和調試非常有幫助的,因爲你可以強調通過強制系統應用程序調用失敗...
相關問題
- 1. 如何同時打印所有輸出
- 2. 如何打印所有結果單行
- 3. 如何打印TreeMap中的所有值?
- 4. 如何打印datatable的所有值?
- 5. 如何打印數組的所有值?
- 6. 如何打印Vector的所有值[]
- 7. 如何打印矩陣的所有列
- 8. 如何記錄所有打印語句
- 9. 如何打印所有這些塊?
- 10. 如何打印所有的事實?
- 11. 單擊打印所有按鈕並打印所有圖像打印
- 12. 打印所有項目
- 13. 打印所有$匹配PHP
- 14. 所有文件不打印
- 15. 的Python:打印所有namedtuples
- 16. 打印所有端口值
- 17. 打印所有組合,python
- 18. 打印所有功能 - cakephp
- 19. Outlook打印 - 所有事件
- 20. 打印所有重複行
- 21. 腳本打印所有零
- 22. 打印所有JavaScript函數
- 23. 打印所有節點SimpleXML
- 24. 打印所有JVM標誌
- 25. Xcode,打印所有文件?
- 26. 打印所有變量?
- 27. 打印所有在Python REPL
- 28. 打印如果所有值都較高
- 29. 如何打開並打印目錄中的所有文件
- 30. 如何打印所有的HTTP/REST請求那些打Wildfly
感謝盧卡斯,我這樣做。我的問題是OS代碼是在不同的環境中與應用程序代碼分開構建的,所以我一直在考慮vxWorks是否可以識別所有的用戶事件。 – user1756845
@ user1756845嗯......思考一下後,我可以想到一些鉤住函數'wvEvent(..)'的代碼,並生成所有生成的WindView事件(以及它們來自哪個線程)的列表。如果這可以幫助你,我可以提供一些代碼... –
雅,謝謝盧卡斯,如果有這樣的代碼,我會非常想看到它。 – user1756845