📄 cmdwatch.cpp
字号:
/*
* TOPPERS/JSP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Just Standard Profile Kernel
*
* Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
*
* 忋婰挊嶌尃幰偼丆埲壓偺 (1)乣(4) 偺忦審偐丆Free Software Foundation
* 偵傛偭偰岞昞偝傟偰偄傞 GNU General Public License 偺 Version 2 偵婰
* 弎偝傟偰偄傞忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃傾
* 傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
* 棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
* (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
* 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
* 僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
* (2) 杮僜僼僩僂僃傾傪丆儔僀僽儔儕宍幃側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒傞宍偱嵞攝晍偡傞応崌偵偼丆嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡
* 幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰
* 偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (3) 杮僜僼僩僂僃傾傪丆婡婍偵慻傒崬傓側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒側偄宍偱嵞攝晍偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙
* 偲丏
* (a) 嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊
* 嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (b) 嵞攝晍偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆TOPPERS僾儘僕僃僋僩偵
* 曬崘偡傞偙偲丏
* (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
* 奞偐傜傕丆忋婰挊嶌尃幰偍傛傃TOPPERS僾儘僕僃僋僩傪柶愑偡傞偙偲丏
*
* 杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偍
* 傛傃TOPPERS僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
* 娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
* 愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
*
* @(#) $Id: cmdwatch.cpp,v 1.3 2003/06/30 15:51:47 takayuki Exp $
*/
// cmdwatch.cpp : 僐儞僜乕儖 傾僾儕働乕僔儑儞偺僄儞僩儕 億僀儞僩傪掕媊偟傑偡丅
//
#include <stdio.h>
#include <stdarg.h>
#include <windows.h>
#include <objbase.h>
#include <unknwn.h>
#include <ocidl.h>
#include <conio.h>
#pragma warning(disable:4200) //旕昗弨偺奼挘婡擻 : 挿偝0偺攝楍傪帩偮峔憿懱
#define TMAX_LOGINFO 8
typedef unsigned int BITMASK;
typedef struct {
unsigned int logtype;
unsigned int logtim;
unsigned int valid;
unsigned int bufsz;
unsigned char buf[];
} DBIFLOG;
#define DBIFLOG_BUFMARGIN ((unsigned int)(&((DBIFLOG *)0)->buf))
/*
* 儘僌忣曬偺廳梫搙偺掕媊
*/
#define LOG_EMERG 0 /* 僔儍僢僩僟僂儞偵抣偡傞僄儔乕 */
#define LOG_ALERT 1
#define LOG_CRIT 2
#define LOG_ERR 3 /* 僔僗僥儉僄儔乕 */
#define LOG_WARNING 4 /* 寈崘儊僢僙乕僕 */
#define LOG_NOTICE 5
#define LOG_INFO 6
#define LOG_DEBUG 7 /* 僨僶僢僌梡儊僢僙乕僕 */
/*
* 儘僌忣曬偺廳梫搙偺價僢僩儅僢僾傪嶌傞偨傔偺儅僋儘
*/
#define LOG_MASK(prio) (1 << (prio))
#define LOG_UPTO(prio) ((1 << ((prio) + 1)) - 1)
/*
* 儘僌忣曬偺庬暿偺掕媊
*/
#define LOG_TYP_INTERRUPT 0x01 /* 妱崬傒僴儞僪儔 */
#define LOG_TYP_ISR 0x02 /* 妱崬傒僒乕價僗僴儞僪儔 */
#define LOG_TYP_TIMERHDR 0x03 /* 僞僀儉僀儀儞僩僴儞僪儔 */
#define LOG_TYP_CPUEXC 0x04 /* CPU椺奜僴儞僪儔 */
#define LOG_TYP_TSKEXC 0x05 /* 僞僗僋椺奜張棟儖乕僠儞 */
#define LOG_TYP_TSKSTAT 0x06 /* 僞僗僋忬懺曄壔 */
#define LOG_TYP_DISPATCH 0x07 /* 僨傿僗僷僢僠儍 */
#define LOG_TYP_SVC 0x08 /* 僒乕價僗僐乕儖 */
#define LOG_TYP_COMMENT 0x09 /* 僐儊儞僩乮暥帤楍偺傒偺儘僌乯 */
#define LOG_ENTER 0x00 /* 擖岥乛奐巒 */
#define LOG_LEAVE 0x80 /* 弌岥乛廔椆 */
static FILE * destination = NULL;
static const char * apiname[] =
{ "cre_tsk","del_tsk","act_tsk","can_act","sta_tsk","ext_tsk","exd_tsk","ter_tsk","chg_pri","get_pri","ref_tsk","ref_tst","slp_tsk","tslp_tsk","wup_tsk","can_wup","rel_wai","sus_tsk","rsm_tsk","frsm_tsk","dly_tsk","","def_tex","ras_tex","dis_tex","ena_tex","sns_tex","ref_tex","cre_sem","del_sem","sig_sem","","wai_sem","pol_sem","twai_sem","ref_sem","cre_flg","del_flg","set_flg","clr_flg","wai_flg","pol_flg","twai_flg","ref_flg","cre_dtq","del_dtq","","","snd_dtq","psnd_dtq","tsnd_dtq","fsnd_dtq","rcv_dtq","prcv_dtq","trcv_dtq","ref_dtq","cre_mbx","del_mbx","snd_mbx","","rcv_mbx","prcv_mbx","trcv_mbx","ref_mbx","cre_mpf","del_mpf","rel_mpf","","get_mpf","pget_mpf","tget_mpf","ref_mpf","set_tim","get_tim","cre_cyc","del_cyc","sta_cyc","stp_cyc","ref_cyc","","rot_rdq","get_tid","","","loc_cpu","unl_cpu","dis_dsp","ena_dsp","sns_ctx","sns_loc","sns_dsp","sns_dpn","ref_sys","","","","def_inh","cre_isr","del_isr","ref_isr","dis_int","ena_int","chg_ixx","get_ixx","def_svc","def_exc","ref_cfg","ref_ver","iact_tsk","iwup_tsk","irel_wai","iras_tex","isig_sem","iset_flg","ipsnd_dtq","ifsnd_dtq","irot_rdq","iget_tid","iloc_cpu","iunl_cpu","isig_tim","","","","cre_mtx","del_mtx","unl_mtx","","loc_mtx","ploc_mtx","tloc_mtx","ref_mtx","cre_mbf","del_mbf","","","snd_mbf","psnd_mbf","tsnd_mbf" };
void Printf(const char * format, ... )
{
va_list vl;
char buffer[1024];
int i;
va_start(vl,format);
i = ::vsprintf(buffer, format, vl);
if(destination != NULL)
fwrite(buffer, i, 1, destination);
fwrite(buffer, i, 1, stdout);
}
const char * get_apiname(int fncd)
{ return apiname[-5 - fncd]; };
void print_log(DBIFLOG * log)
{
int i;
Printf("%10d ms : ",log->logtim);
switch(log->logtype)
{
case LOG_TYP_SVC:
Printf("[SVC|ENT] %s (",get_apiname(*(int*)log->buf));
for(i=0;i < *((int*)log->buf+1);i++)
{
if(i!=0)
Printf(", ");
Printf("0x%08x",*((int*)log->buf+2+i));
}
Printf(")\n");
break;
case LOG_TYP_SVC|LOG_LEAVE:
Printf("[SVC|LEA] %s",get_apiname(*(int*)log->buf));
if(*((int*)log->buf+1) > 0)
Printf(" (ercd = 0x%08x)",*((int*)log->buf+2));
Printf("\n");
break;
case LOG_TYP_TSKSTAT:
Printf("[TSKSTAT] Tsk:%d ",*(int*)log->buf);
switch(*((int*)log->buf+1))
{
case 0x01:
case 0x02:
Printf("<Ready>\n",*(int*)log->buf);
break;
case 0x04:
case 0x0c:
if(*((int*)log->buf+1) == 0x04)
Printf("<Waiting : ");
else
Printf("<Wait-Suspend : ");
switch(*((int*)log->buf+2))
{
case 0x1:
Printf("Sleep>\n");
break;
case 0x2:
Printf("Delay>\n");
break;
case 0x4:
Printf("Semaphore (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x8:
Printf("Eventflag (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x10:
Printf("Dataqueue[send] (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x20:
Printf("Dataqueue[receive] (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x40:
Printf("Mailbox (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x80:
Printf("Mutex (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x100:
Printf("MessageBuffer[send] (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x200:
Printf("MessageBuffer[receive] (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x400:
Printf("Rendezvous[call] (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x800:
Printf("Rendezvous[accept] (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x1000:
Printf("Rendezvous[completion] (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x2000:
Printf("Fixed Memorypool (id=%d)>\n",*((int*)log->buf+3));
break;
case 0x4000:
Printf("Variable Memorypool (id=%d)>\n",*((int*)log->buf+3));
break;
default:
Printf(" complex [%04x]>\n", *((int*)log->buf+2));
break;
}
break;
case 0x08:
Printf("<Suspended>\n");
break;
case 0x10:
Printf("<Dormant>\n");
break;
default:
Printf("<Unknown : %d>",*(int*)log->buf);
break;
}
break;
case LOG_TYP_TSKEXC:
Printf("[TEX|ENT] Tsk:%d\n",*(int*)log->buf);
break;
case LOG_TYP_TSKEXC | LOG_LEAVE:
Printf("[TEX|LEA] Tsk:%d\n",*(int*)log->buf);
break;
case LOG_TYP_DISPATCH:
if(*((int*)log->buf+1) == 0)
Printf("[DSP|ENT] Tsk:%d Task-context\n",*(int*)log->buf);
else
Printf("[DSP|ENT] Tsk:%d Nontask-context\n",*(int*)log->buf);
break;
case LOG_TYP_DISPATCH | LOG_LEAVE:
Printf("[DSP|LEA] Tsk:%d\n",*(int*)log->buf);
break;
case LOG_TYP_COMMENT:
*((char *)log->buf + log->bufsz -1) = '\x0';
Printf("[COMMENT](%d) : <%s>\n",*(int *)log->buf,log->buf+sizeof(int));
break;
case LOG_TYP_INTERRUPT:
Printf("[INT|ENT] %d\n",*(int*)log->buf);
break;
case LOG_TYP_INTERRUPT | LOG_LEAVE:
Printf("[INT|LEA] %d\n",*(int*)log->buf);
break;
case LOG_TYP_CPUEXC:
Printf("[CEX|ENT] Tsk:%d\n",*(int*)log->buf);
break;
case LOG_TYP_CPUEXC | LOG_LEAVE:
Printf("[CEX|LEA] Tsk:%d\n",*(int*)log->buf);
break;
case LOG_TYP_TIMERHDR:
case LOG_TYP_TIMERHDR | LOG_LEAVE:
if((log->logtype & LOG_LEAVE) != 0)
Printf("[INT|LEA]");
else
Printf("[INT|ENT]");
if( *(int*)log->buf == 0x8d )
Printf(" cyclic ");
else
Printf(" OBJ(%02x) ", *(int*)log->buf);
Printf(" ID:%d EXINF:0x%08x\n",*((int*)log->buf+1), *((int*)log->buf+2));
break;
default:
Printf("[UNKNOWN] : 0x%x\n",log->logtype);
};
}
const CLSID CLSID_KernelLog = {0x4BD327FC,0x9E4A,0x4A5D,{0x95,0x03,0x27,0xC9,0x79,0xA8,0xE8,0x02}};
MIDL_INTERFACE("395F900A-AC7E-4A78-9BC1-EE5EF76254FF")
IKernelLog : public IUnknown
{
public:
};
struct __declspec(uuid("35E35399-55ED-45FC-8F0B-4A1BC6CEA3F0")) _IKernelLogEvents;
class IKernelLogEvents : public IUnknown
{
public:
STDMETHOD(QueryInterface)(REFIID, void **);
STDMETHOD_(ULONG,AddRef)();
STDMETHOD_(ULONG,Release)();
virtual HRESULT STDMETHODCALLTYPE OnKernelStart(void);
virtual HRESULT STDMETHODCALLTYPE OnKernelExit(void);
virtual HRESULT STDMETHODCALLTYPE OnLogEvent(long sz, byte __RPC_FAR data[]);
IKernelLogEvents(void) { RefCount = 0; };
// virtual ~IKernelLogEvents(void) { if(destination != NULL) fclose(destination); };
LONG RefCount;
};
HRESULT IKernelLogEvents::QueryInterface(REFIID riid, void ** ppvObject)
{
if( riid == __uuidof(_IKernelLogEvents) || riid == __uuidof(IUnknown) )
{
*ppvObject = this;
::InterlockedIncrement(&RefCount);
return S_OK;
}
return E_NOINTERFACE;
}
ULONG IKernelLogEvents::AddRef(void)
{ return ::InterlockedIncrement(&RefCount); }
ULONG IKernelLogEvents::Release(void)
{
if( ::InterlockedDecrement(&RefCount) == 0 )
{
delete this;
return 0;
}
return RefCount;
}
HRESULT IKernelLogEvents::OnKernelExit(void)
{
Printf("OnKernelExit at \n");
if(destination != NULL)
{
fclose(destination);
destination = 0;
}
return S_OK;
}
HRESULT IKernelLogEvents::OnKernelStart(void)
{
char buffer[256];
SYSTEMTIME systim;
if(destination != NULL)
fclose(destination);
::GetLocalTime(&systim);
::wsprintf(buffer, "kernel-log-%04d%02d%02d-%02d%02d%02d.txt", systim.wYear, systim.wMonth, systim.wDay, systim.wHour, systim.wMinute, systim.wSecond);
destination = fopen(buffer, "wt");
Printf("OnKernelStart\n");
return S_OK;
}
HRESULT IKernelLogEvents::OnLogEvent(long sz, byte data [])
{
print_log((DBIFLOG *)data);
return S_OK;
}
//僐僱僋僔儑儞億僀儞僩傊偺愙懕
bool Advise(IUnknown * container, REFIID iid, IUnknown * sink, DWORD * cookie, IConnectionPoint ** pcp = NULL)
{
IConnectionPointContainer * cpc;
IConnectionPoint * cp;
HRESULT result;
if(pcp == NULL)
pcp = &cp;
container->QueryInterface(IID_IConnectionPointContainer, (void **)&cpc);
if(cpc == 0)
return false;
cpc->FindConnectionPoint(iid, pcp);
cpc->Release();
if(*pcp == 0)
return false;
if(FAILED(result = (*pcp)->Advise(sink, cookie)))
return false;
if(pcp == &cp)
cp->Release();
return true;
}
DWORD tmain_threadid;
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
switch(dwCtrlType)
{
case CTRL_C_EVENT:
::PostThreadMessage(tmain_threadid,WM_QUIT,0,0);
break;
default:
return FALSE;
}
return TRUE;
}
int main(int argc, char * argv[])
{
IKernelLog * pKernelLog;
IKernelLogEvents * psKernelLogEvents;
IConnectionPoint * cp;
DWORD cookie;
MSG msg;
IKernelLogEvents a;
::CoInitialize(NULL);
destination = 0;
tmain_threadid = ::GetCurrentThreadId();
if(!FAILED(::CoCreateInstance(CLSID_KernelLog, NULL, CLSCTX_ALL, __uuidof(IKernelLog), (void **)&pKernelLog)))
{
cp = NULL;
psKernelLogEvents = new IKernelLogEvents;
if(Advise(pKernelLog, __uuidof(_IKernelLogEvents), psKernelLogEvents, &cookie, &cp))
{
::SetConsoleCtrlHandler(HandlerRoutine, TRUE);
while(::GetMessage(&msg, NULL, 0, 0) != 0)
{ ::DispatchMessage(&msg); }
::SetConsoleCtrlHandler(HandlerRoutine, FALSE);
cp->Unadvise(cookie);
}
delete psKernelLogEvents;
if(pKernelLog != NULL)
pKernelLog->Release();
}
if(destination != NULL)
{
Printf("\n\nSuspended by Ctrl-C event occursion.\n");
fclose(destination);
}
::CoUninitialize();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -