VLC 디버그

5215 단어
VLC 원본을 분석하는 과정에서 가장 자주 사용하는 방식은 VLC가 자체로 가지고 있는 msg 이다Dbg(...)함수, 그러나 이 함수는 존재하는 대상을 입력으로 해야 하기 때문에 실제적으로 많은 함수에 이런 대상이 없다. 또한 이러한 함수의 운행 과정을 이해하기 위해 본고는 VLC가 제공하는 디버깅 분석 함수에 따라 간단한 수정을 해서 이런 함수에 응용하고자 한다.
        1.vlc/include/vlcmessages.h에 다음 코드 추가
VLC_API void vlc_Debug(vlc_object_t *, int,
                     const char *, const char *, ...) VLC_FORMAT( 4, 5 );
VLC_API void vlc_vaDebug(vlc_object_t *, int,
                       const char *, const char *, va_list);

#define msg_Output(p_this,...) \
    vlc_Debug(VLC_OBJECT(p_this), VLC_MSG_DBG,  MODULE_STRING, __VA_ARGS__ )
       
2. vlc/src/misc/messages.c에 다음 코드 추가
void vlc_Debug(vlc_object_t *obj, int type,
                     const char *module, const char *format, ...)
{
    va_list args;

    va_start (args, format);
    vlc_vaDebug (obj, type, module, format, args);
    va_end (args);

}

static void PrintDebug(int, const msg_item_t *, const char *, va_list);

void vlc_vaDebug (vlc_object_t *obj, int type, const char *module,
                const char *format, va_list args)
{
   // if (obj != NULL && obj->i_flags & OBJECT_FLAGS_QUIET)
   //     return;

    /* C locale to get error messages in English in the logs */
    locale_t c = newlocale (LC_MESSAGES_MASK, "C", (locale_t)0);
    locale_t locale = uselocale (c);

#ifndef __GLIBC__
    /* Expand %m to strerror(errno) - only once */
    char buf[strlen(format) + 2001], *ptr;
    strcpy (buf, format);
    ptr = (char*)buf;
    format = (const char*) buf;

    for( ;; )
    {
        ptr = strchr( ptr, '%' );
        if( ptr == NULL )
            break;

        if( ptr[1] == 'm' )
        {
            char errbuf[2001];
            size_t errlen;

#ifndef WIN32
            strerror_r( errno, errbuf, 1001 );
#else
            int sockerr = WSAGetLastError( );
            if( sockerr )
            {
                strncpy( errbuf, net_strerror( sockerr ), 1001 );
                WSASetLastError( sockerr );
            }
            if ((sockerr == 0)
             || (strcmp ("Unknown network stack error", errbuf) == 0))
                strncpy( errbuf, strerror( errno ), 1001 );
#endif
            errbuf[1000] = 0;

            /* Escape '%' from the error string */
            for( char *percent = strchr( errbuf, '%' );
                 percent != NULL;
                 percent = strchr( percent + 2, '%' ) )
            {
                memmove( percent + 1, percent, strlen( percent ) + 1 );
            }

            errlen = strlen( errbuf );
            memmove( ptr + errlen, ptr + 2, strlen( ptr + 2 ) + 1 );
            memcpy( ptr, errbuf, errlen );
            break; /* Only once, so we don't overflow */
        }

        /* Looks for conversion specifier... */
        do
            ptr++;
        while( *ptr && ( strchr( "diouxXeEfFgGaAcspn%", *ptr ) == NULL ) );
        if( *ptr )
            ptr++; /* ...and skip it */
    }
#endif

    /* Fill message information fields */
    msg_item_t msg;

    msg.i_object_id = (uintptr_t)obj;
    msg.psz_object_type = (obj != NULL) ? obj->psz_object_type : "generic";
    msg.psz_module = module;
    msg.psz_header = NULL;

    for (vlc_object_t *o = obj; o != NULL; o = o->p_parent)
        if (o->psz_header != NULL)
        {
            msg.psz_header = o->psz_header;
            break;
        }

    /* Pass message to subscribers */
 //   libvlc_priv_t *priv = libvlc_priv (obj->p_libvlc);

    va_list ap;

    va_copy (ap, args);
  //  if (priv->b_color)
  //      PrintColorMsg (&priv->i_verbose, type, &msg, format, ap);
  //  else
    PrintDebug (type, &msg, format, ap);
    va_end (ap);

    vlc_rwlock_rdlock (&msg_lock);
    for (msg_subscription_t *sub = msg_head; sub != NULL; sub = sub->next)
    {
        va_copy (ap, args);
        sub->func (sub->opaque, type, &msg, format, ap);
        va_end (ap);
    }
    vlc_rwlock_unlock (&msg_lock);

    uselocale (locale);
    freelocale (c);
}

static void PrintDebug (int type, const msg_item_t *p_item,
                      const char *format, va_list ap)
{
 //   const signed char *pverbose = d;
    FILE *stream = stderr;

   // if (*pverbose < 0 || *pverbose < (type - VLC_MSG_ERR))
   //     return;

    int canc = vlc_savecancel ();

    flockfile (stream);
    fprintf (stream, "[%p] ", (void *)p_item->i_object_id);
    if (p_item->psz_header != NULL)
        utf8_fprintf (stream, "[%s] ", p_item->psz_header);
    utf8_fprintf (stream, "%s %s%s: ", p_item->psz_module,
                  p_item->psz_object_type, msg_type[type]);
    utf8_vfprintf (stream, format, ap);
    putc_unlocked ('
', stream); #if defined (WIN32) || defined (__OS2__) fflush (stream); #endif funlockfile (stream); vlc_restorecancel (canc); }

      
3. 사용(함수에 다음 코드를 추가하면 됩니다)
vlc_object_t *debug = NULL;
msg_Output(debug,"--------bank.c-----module_InitBank()---------------");

좋은 웹페이지 즐겨찾기