engine/inc/debug.h
branchpodcatcher_qt_symbian4
changeset 228 c553fa9dcbe5
parent 227 325137e6edd1
child 229 a12ea4c1b5b6
equal deleted inserted replaced
227:325137e6edd1 228:c553fa9dcbe5
     1 /*
       
     2 * Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB
       
     3 *
       
     4 * All rights reserved.
       
     5 * This component and the accompanying materials are made available
       
     6 * under the terms of the License "Eclipse Public License v1.0"
       
     7 * which accompanies this distribution, and is available
       
     8 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     9 *
       
    10 * Initial Contributors:
       
    11 * EmbedDev AB - initial contribution.
       
    12 *
       
    13 * Contributors:
       
    14 *
       
    15 * Description:
       
    16 *
       
    17 */
       
    18 
       
    19 // dbg_dp.h
       
    20 // debug printouts
       
    21 
       
    22 /*************************************************
       
    23 
       
    24     USAGE
       
    25     DP("Hi there");
       
    26     DP1("My name is %S", &name);
       
    27     DPV1("My detailed info is %S", &detailedInfo);
       
    28     DP_MSG(aMsg);
       
    29     DP_MSG_COMPL(aMsg, r);
       
    30     DP_EXC(aType);
       
    31 
       
    32     CUSTOMISATION
       
    33     With SUPPORT_DP_CLIENT_SERVER_V2 defined, a
       
    34     proper opcode type (default TOpcode) needs to
       
    35     be specified.
       
    36 
       
    37     NOTE
       
    38     This file may be included by many components
       
    39     within one application and defining something
       
    40     here will affect all such components. In such
       
    41     cases it might be better to state a MACRO in
       
    42     the intended component's MMP file.
       
    43 
       
    44 **************************************************/
       
    45 
       
    46 #ifndef ___DBG_DP_H
       
    47 #define ___DBG_DP_H
       
    48 
       
    49 // This file may be included butThese defines may be individual
       
    50 
       
    51 //#if defined (_DEBUG) && (__WINS__)
       
    52 //#if defined _DEBUG
       
    53 #   define SUPPORT_DP_STANDARD
       
    54 #   define SUPPORT_DP_FILE
       
    55 //#endif
       
    56 
       
    57 // #define SUPPORT_RDEBUG_PRINT
       
    58 // #define SUPPORT_DP_VERBOSE
       
    59 // #define SUPPORT_DP_THREAD_NAME
       
    60 // #define SUPPORT_DP_CLIENT_SERVER_V2
       
    61 // #define SUPPORT_DP_EXCEPTION
       
    62 // #define SUPPORT_DP_COMMDB
       
    63 
       
    64 // ------------------------------------------------- no need to modify
       
    65 
       
    66 #if defined (SUPPORT_RDEBUG_PRINT)\
       
    67  || defined (SUPPORT_DP_VERBOSE)\
       
    68  || defined(SUPPORT_DP_CLIENT_SERVER_V2)\
       
    69  || defined(SUPPORT_DP_EXCEPTION)
       
    70 #   define SUPPORT_DP_STANDARD
       
    71 #endif
       
    72 
       
    73 #if defined(SUPPORT_RDEBUG_PRINT)
       
    74 #   include <e32svr.h> // RDebug
       
    75 #endif
       
    76 
       
    77 #if defined(SUPPORT_DP_FILE)
       
    78 #   include <flogger.h>
       
    79 #endif
       
    80 
       
    81 #if defined(SUPPORT_DP_CLIENT_SERVER_V2)
       
    82 #   include "dbg_cmn.h" // TOpcode
       
    83 #endif
       
    84 
       
    85 #if defined(SUPPORT_DP_COMMDB)
       
    86 #   include <commdbconnpref.h> // TCommDbConnPref
       
    87 #endif
       
    88 
       
    89 namespace Dbg
       
    90 {
       
    91 
       
    92 // ------------------------------------------------- file output
       
    93 #ifdef SUPPORT_DP_FILE
       
    94 _LIT(KLogDir, "podcatcher");
       
    95 _LIT(KLogFile, "debug.log");
       
    96 #   define DPF(a); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S %s"), &s, L##a);
       
    97 #   define DPF1(a,b); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b);
       
    98 #   define DPF2(a,b,c); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b,c);
       
    99 #   define DPF3(a,b,c,d); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b,c,d);
       
   100 #   define DPF4(a,b,c,d,e); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b,c,d,e);
       
   101 #   define DPF5(a,b,c,d,e,f); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b,c,d,e,f);
       
   102 #   define DPF6(a,b,c,d,e,f,g); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b, c, d,e,f,g);
       
   103 #	define HEXDUMP(aHeader, aMargin, aPtr, aLen); RFileLogger::HexDump(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, aHeader, aMargin, aPtr, aLen);
       
   104 #   define DPDT(dt); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("DateTime: %d-%d-%d %d:%d:%d "), dt.Year(), dt.Month()+1, dt.Day()+1, dt.Hour(), dt.Minute(), dt.Second() );
       
   105 
       
   106 #else
       
   107 #   define DPF(a);
       
   108 #   define DPF1(a,b);
       
   109 #   define DPF2(a,b,c);
       
   110 #   define DPF3(a,b,c,d);
       
   111 #   define DPF4(a,b,c,d,e);
       
   112 #   define DPF5(a,b,c,d,e,f);
       
   113 #   define DPF6(a,b,c,d,e,f,g);
       
   114 #	define HEXDUMP(aHeader, aMargin, aPtr, aLen);
       
   115 #   define DPDT(dt); 
       
   116 #endif
       
   117 // ------------------------------------------------- standard debugprint
       
   118 #ifdef SUPPORT_DP_STANDARD
       
   119 
       
   120 inline void FormatThreadName(TFullName& aName)
       
   121 {
       
   122     const TChar KLeftBracket('[');
       
   123     const TChar KScope(':');
       
   124     TInt a = aName.LocateReverse(KLeftBracket);
       
   125     if (a==KErrNotFound)
       
   126         { return; }
       
   127     TInt b = aName.Locate(KScope);
       
   128     if (b==KErrNotFound || b<a)
       
   129         { return; }
       
   130     aName.Delete(a,b-a);
       
   131 }
       
   132 
       
   133 #ifdef SUPPORT_RDEBUG_PRINT
       
   134 #   define DP(a);\
       
   135     {\
       
   136         TFullName s = RThread().FullName();\
       
   137         Dbg::FormatThreadName(s);\
       
   138         RDebug::Print(_L("%S %s"), &s, L##a);\
       
   139         DPF(a);\
       
   140     }
       
   141 #   define DP1(a,b);\
       
   142     {\
       
   143         TFullName s = RThread().FullName();\
       
   144         Dbg::FormatThreadName(s);\
       
   145         RDebug::Print(_L("%S " L##a), &s, b);\
       
   146         DPF1(a,b);\
       
   147     }
       
   148 #   define DP2(a,b,c);\
       
   149     {\
       
   150         TFullName s = RThread().FullName();\
       
   151         Dbg::FormatThreadName(s);\
       
   152         RDebug::Print(_L("%S " L##a), &s, b,c);\
       
   153         DPF2(a,b,c);\
       
   154     }
       
   155 #   define DP3(a,b,c,d);\
       
   156     {\
       
   157         TFullName s = RThread().FullName();\
       
   158         Dbg::FormatThreadName(s);\
       
   159         RDebug::Print(_L("%S " L##a), &s, b,c,d);\
       
   160         DPF3(a,b,c,d);\
       
   161     }
       
   162 #   define DP4(a,b,c,d,e);\
       
   163     {\
       
   164         TFullName s = RThread().FullName();\
       
   165         Dbg::FormatThreadName(s);\
       
   166         RDebug::Print(_L("%S " L##a), &s, b,c,d,e);\
       
   167         DPF4(a,b,c,d,e);\
       
   168     }
       
   169 #   define DP5(a,b,c,d,e,f);\
       
   170     {\
       
   171         TFullName s = RThread().FullName();\
       
   172         Dbg::FormatThreadName(s);\
       
   173         RDebug::Print(_L("%S " L##a), &s, b,c,d,e,f);\
       
   174         DPF5(a,b,c,d,e,f);\
       
   175     }
       
   176 #   define DP6(a,b,c,d,e,f,g);\
       
   177     {\
       
   178         TFullName s = RThread().FullName();\
       
   179         Dbg::FormatThreadName(s);\
       
   180         RDebug::Print(_L("%S " L##a), &s, b,c,d,e,f,g);\
       
   181         DPF6(a,b,c,d,e,f,g);\
       
   182     }
       
   183 #else	//SUPPORT_RDEBUG_PRINT
       
   184 #   define DP(a);\
       
   185     {\
       
   186         TFullName s = RThread().FullName();\
       
   187         Dbg::FormatThreadName(s);\
       
   188         DPF(a);\
       
   189     }
       
   190 #   define DP1(a,b);\
       
   191     {\
       
   192         TFullName s = RThread().FullName();\
       
   193         Dbg::FormatThreadName(s);\
       
   194         DPF1(a,b);\
       
   195     }
       
   196 #   define DP2(a,b,c);\
       
   197     {\
       
   198         TFullName s = RThread().FullName();\
       
   199         Dbg::FormatThreadName(s);\
       
   200         DPF2(a,b,c);\
       
   201     }
       
   202 #   define DP3(a,b,c,d);\
       
   203     {\
       
   204         TFullName s = RThread().FullName();\
       
   205         Dbg::FormatThreadName(s);\
       
   206         DPF3(a,b,c,d);\
       
   207     }
       
   208 #   define DP4(a,b,c,d,e);\
       
   209     {\
       
   210         TFullName s = RThread().FullName();\
       
   211         Dbg::FormatThreadName(s);\
       
   212         DPF4(a,b,c,d,e);\
       
   213     }
       
   214 #   define DP5(a,b,c,d,e,f);\
       
   215     {\
       
   216         TFullName s = RThread().FullName();\
       
   217         Dbg::FormatThreadName(s);\
       
   218         DPF5(a,b,c,d,e,f);\
       
   219     }
       
   220 #   define DP6(a,b,c,d,e,f,g);\
       
   221     {\
       
   222         TFullName s = RThread().FullName();\
       
   223         Dbg::FormatThreadName(s);\
       
   224         DPF6(a,b,c,d,e,f,g);\
       
   225     }
       
   226 #endif	//SUPPORT_RDEBUG_PRINT
       
   227 #   define ASSERT_DP(a, b); {if(!(a)){DP(b);}}
       
   228 #   define ASSERT_DP1(a,b,c); {if(!(a)){DP1(b,c);}}
       
   229 #   define ASSERT_DP2(a,b,c,d); {if(!(a)){DP2(b,c,d);}}
       
   230 #   define ASSERT_DP3(a,b,c,d,e); {if(!(a)){DP3(b,c,d,e);}}
       
   231 #   define ASSERT_DP4(a,b,c,d,e,f); {if(!(a)){DP4(b,c,d,e,f);}}
       
   232 #   define ASSERT_DP5(a,b,c,d,e,f,g); {if(!(a)){DP5(b,c,d,e,f,g);}}
       
   233 #   define ASSERT_DP6(a,b,c,d,e,f,g,h); {if(!(a)){DP6(b,c,d,e,f,g,h);}}
       
   234 // @brief stuff to get enum strings from enums
       
   235 #   define ENUM_CASE(n,c)\
       
   236         case c: { _LIT(KTxt##c, #c); n.Set(KTxt##c); break; }
       
   237 #   define DEFAULT(n)\
       
   238         default: { _LIT(KTxtUnknown, "Unknown"); n.Set(KTxtUnknown); break; }
       
   239 #else
       
   240 #   define DP(a);
       
   241 #   define DP1(a,b);;
       
   242 #   define DP2(a,b,c);
       
   243 #   define DP3(a,b,c,d);
       
   244 #   define DP4(a,b,c,d,e);
       
   245 #   define DP5(a,b,c,d,e,f);
       
   246 #   define DP6(a,b,c,d,e,f,g);
       
   247 #   define ASSERT_DP(a, b);
       
   248 #   define ASSERT_DP1(a,b,c);
       
   249 #   define ASSERT_DP2(a,b,c,d);
       
   250 #   define ASSERT_DP3(a,b,c,d,e);
       
   251 #   define ASSERT_DP4(a,b,c,d,e,f);
       
   252 #   define ASSERT_DP5(a,b,c,d,e,f,g);
       
   253 #   define ASSERT_DP6(a,b,c,d,e,f,g,h);
       
   254 #   define ENUM_CASE(n,c)
       
   255 #   define DEFAULT(n)
       
   256 #endif
       
   257 // ------------------------------------------------- detailed debugprint
       
   258 #ifdef SUPPORT_DP_VERBOSE
       
   259 #   define DPV(a); { DP(a); }
       
   260 #   define DPV1(a,b); { DP1(a,b); }
       
   261 #   define DPV2(a,b,c); { DP2(a,b,c); }
       
   262 #   define DPV3(a,b,c,d); { DP3(a,b,c,d); }
       
   263 #   define DPV4(a,b,c,d,e); { DP4(a,b,c,d,e); }
       
   264 #   define DPV5(a,b,c,d,e,f); { DP5(a,b,c,d,e,f); }
       
   265 #   define DPV6(a,b,c,d,e,f,g); { DP6(a,b,c,d,e,f,g); }
       
   266 #	define DPDTV(dt); { DPDT(dt); }
       
   267 #else
       
   268 #   define DPV(a);
       
   269 #   define DPV1(a,b);
       
   270 #   define DPV2(a,b,c);
       
   271 #   define DPV3(a,b,c,d);
       
   272 #   define DPV4(a,b,c,d,e);
       
   273 #   define DPV5(a,b,c,d,e,f);
       
   274 #   define DPV6(a,b,c,d,e,f,g);
       
   275 #	define DPDTV(dt);
       
   276 #endif
       
   277 // ------------------------------------------------- client/server V2
       
   278 #ifdef SUPPORT_DP_CLIENT_SERVER_V2
       
   279 
       
   280 // @brief Get client thread name from a message
       
   281 static void GetClientName(const RMessage2& aMsg, TFullName& aName)
       
   282 {
       
   283     RThread thread;
       
   284     aMsg.Client(thread);
       
   285     aName = thread.FullName();
       
   286     Dbg::FormatThreadName(aName);
       
   287 }
       
   288 
       
   289 // @brief Get server opcode from any message
       
   290 static TOpcode GetServerOpcode(const RMessage2& aMsg)
       
   291 {
       
   292     return (TOpcode)aMsg.Function();
       
   293 }
       
   294 
       
   295 // @brief Get server opcode name from a server opcode
       
   296 static TPtrC GetServerOpcodeName(TOpcode aOpcode)
       
   297 {
       
   298     TPtrC name;
       
   299     switch(aOpcode)
       
   300     {
       
   301         // ENUM_CASE(name, EOpcodeOne);
       
   302         // ENUM_CASE(name, EOpcodeTwo);
       
   303         DEFAULT(name);
       
   304     }
       
   305     return name;
       
   306 }
       
   307 
       
   308 // @brief Print generic message.
       
   309 inline void PrintMsg(const RMessage2& aMsg)
       
   310 {
       
   311     TFullName threadName;
       
   312     GetClientName(aMsg, threadName);
       
   313     TOpcode sOpcode = GetServerOpcode(aMsg);
       
   314     TPtrC sOpcodeName = GetServerOpcodeName(sOpcode);
       
   315     DP3("? %S %S(%d)", &threadName, &sOpcodeName, sOpcode);
       
   316 }
       
   317 
       
   318 // @brief Print generic message completion.
       
   319 inline void PrintMsgCompl(const RMessage2& aMsg, TInt aErr)
       
   320 {
       
   321     TFullName threadName;
       
   322     GetClientName(aMsg, threadName);
       
   323     TOpcode sOpcode = GetServerOpcode(aMsg);
       
   324     TPtrC sOpcodeName = GetServerOpcodeName(sOpcode);
       
   325     DP4("! %S %S(%d) r=%d", &threadName, &sOpcodeName, sOpcode, aErr);
       
   326 }
       
   327 
       
   328 // m= message, r=error
       
   329 #   define DP_MSG(m); PrintMsg(m);
       
   330 #   define DP_MSG_COMPL(m,r); PrintMsgCompl(m,r);
       
   331 #else
       
   332 #   define DP_MSG(m);
       
   333 #   define DP_MSG_COMPL(m,r);
       
   334 #endif
       
   335 // ------------------------------------------------- exception debugprint
       
   336 #ifdef SUPPORT_DP_EXCEPTION
       
   337 
       
   338 // @brief Get an exception type
       
   339 static TPtrC GetExcName(TExcType aType)
       
   340 {
       
   341     TPtrC name;
       
   342     switch(aType)
       
   343     {
       
   344         ENUM_CASE(name, EExcGeneral);
       
   345         ENUM_CASE(name, EExcIntegerDivideByZero);
       
   346         ENUM_CASE(name, EExcSingleStep);
       
   347         ENUM_CASE(name, EExcBreakPoint);
       
   348         ENUM_CASE(name, EExcIntegerOverflow);
       
   349         ENUM_CASE(name, EExcBoundsCheck);
       
   350         ENUM_CASE(name, EExcInvalidOpCode);
       
   351         ENUM_CASE(name, EExcDoubleFault);
       
   352         ENUM_CASE(name, EExcStackFault);
       
   353         ENUM_CASE(name, EExcAccessViolation);
       
   354         ENUM_CASE(name, EExcPrivInstruction);
       
   355         ENUM_CASE(name, EExcAlignment);
       
   356         ENUM_CASE(name, EExcPageFault);
       
   357         ENUM_CASE(name, EExcFloatDenormal);
       
   358         ENUM_CASE(name, EExcFloatDivideByZero);
       
   359         ENUM_CASE(name, EExcFloatInexactResult);
       
   360         ENUM_CASE(name, EExcFloatInvalidOperation);
       
   361         ENUM_CASE(name, EExcFloatOverflow);
       
   362         ENUM_CASE(name, EExcFloatStackCheck);
       
   363         ENUM_CASE(name, EExcFloatUnderflow);
       
   364         ENUM_CASE(name, EExcAbort);
       
   365         ENUM_CASE(name, EExcKill);
       
   366         ENUM_CASE(name, EExcUserInterrupt);
       
   367         ENUM_CASE(name, EExcDataAbort);
       
   368         ENUM_CASE(name, EExcCodeAbort);
       
   369         ENUM_CASE(name, EExcMaxNumber);
       
   370         ENUM_CASE(name, EExcInvalidVector);
       
   371         DEFAULT(name);
       
   372     }
       
   373     return name;
       
   374 }
       
   375 
       
   376 // @brief Print exception info.
       
   377 inline void PrintExc(TExcType aType)
       
   378 {
       
   379     TPtrC excName = GetExcName(aType);
       
   380     DP2("### Exception %S(%d) ###", &excName, aType);
       
   381 }
       
   382 
       
   383 #   define DP_EXC(t); PrintExc(t);
       
   384 #else
       
   385 #   define DP_EXC(t);
       
   386 #endif
       
   387 // ------------------------------------------------- 
       
   388 #ifdef SUPPORT_DP_COMMDB
       
   389 
       
   390 inline void LogIap(const TDesC* aName, const TCommDbConnPref& aPref)
       
   391 {
       
   392     TUint32 iapId=aPref.IapId();
       
   393     TUint32 netId=aPref.NetId();
       
   394     TCommDbDialogPref dlgPref=aPref.DialogPreference();
       
   395     TCommDbConnectionDirection dir=aPref.Direction();
       
   396     TUint32 bearerSet=aPref.BearerSet();
       
   397     if(aName==0)
       
   398     {
       
   399         UI_FLOG(Log::Printf(
       
   400             _L("iapId=%u, netId=%u, dlgPref=%d, dir=%d, bearerSet=0x%02x"),
       
   401             iapId, netId, dlgPref, dir, bearerSet));
       
   402     }
       
   403     else
       
   404     {
       
   405         UI_FLOG(Log::Printf(
       
   406             _L("\"%S\", iapId=%u, netId=%u, dlgPref=%d, dir=%d, bearerSet=0x%02x"),
       
   407             aName, iapId, netId, dlgPref, dir, bearerSet));
       
   408     }
       
   409 }
       
   410 
       
   411 #   define DP_COMMDBCONNPREF(a,b); LogIap(a,b);
       
   412 #else
       
   413 #   define DP_COMMDBCONNPREF(a,b);
       
   414 #endif
       
   415 // ------------------------------------------------- 
       
   416 
       
   417 }
       
   418 #endif //___DBG_DP_H
       
   419