debug.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FILE:    debug.c
  3.  * PROGRAM: RAT
  4.  * AUTHORS: Isidor Kouvelas 
  5.  *          Colin Perkins 
  6.  *          Mark Handley 
  7.  *          Orion Hodson
  8.  *          Jerry Isdale
  9.  * 
  10.  * $Revision: 1.6 $
  11.  * $Date: 2002/06/11 19:58:02 $
  12.  *
  13.  * Copyright (c) 1995-2000 University College London
  14.  * All rights reserved.
  15.  *
  16.  * Redistribution and use in source and binary forms, with or without
  17.  * modification, is permitted provided that the following conditions 
  18.  * are met:
  19.  * 1. Redistributions of source code must retain the above copyright
  20.  *    notice, this list of conditions and the following disclaimer.
  21.  * 2. Redistributions in binary form must reproduce the above copyright
  22.  *    notice, this list of conditions and the following disclaimer in the
  23.  *    documentation and/or other materials provided with the distribution.
  24.  * 3. All advertising materials mentioning features or use of this software
  25.  *    must display the following acknowledgement:
  26.  *      This product includes software developed by the Computer Science
  27.  *      Department at University College London
  28.  * 4. Neither the name of the University nor of the Department may be used
  29.  *    to endorse or promote products derived from this software without
  30.  *    specific prior written permission.
  31.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
  32.  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  33.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  34.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
  35.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  36.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  37.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  39.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  40.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  41.  * SUCH DAMAGE.
  42.  */
  43. #include "config_unix.h"
  44. #include "config_win32.h"
  45. #include "gettimeofday.h"
  46. #include "debug.h"
  47. void _dprintf(const char *format, ...)
  48. {
  49. #ifdef DEBUG
  50. #ifdef WIN32
  51.         char msg[65535];
  52.         va_list ap;
  53.         
  54.         va_start(ap, format);
  55. _vsnprintf(msg, 65535, format, ap);
  56.         va_end(ap);
  57.         OutputDebugString(msg);
  58. #else 
  59.         va_list ap;
  60.  
  61.         va_start(ap, format);
  62.         vfprintf(stderr, format, ap);
  63.         va_end(ap);
  64. #endif /* WIN32 */
  65. #else
  66.         UNUSED (format);
  67. #endif /* DEBUG */
  68. }
  69. /**
  70.  * debug_dump:
  71.  * @lp: pointer to memory region.
  72.  * @len: length of memory region in bytes.
  73.  * 
  74.  * Writes a dump of a memory region to stdout.  The dump contains a
  75.  * hexadecimal and an ascii representation of the memory region.
  76.  * 
  77.  **/
  78. void debug_dump(void*lp, long len)
  79. {
  80.    char * p;
  81.    long i, j, start;
  82.    char Buff[80];
  83.    char stuffBuff[10];
  84.    char tmpBuf[10];
  85.   
  86.    _dprintf("Dump of %ld=%lx bytesn",len, len);
  87.    start = 0L;
  88.    while (start < len)
  89.    {
  90.     /* start line with pointer position key */
  91.       p = (char*)lp + start;
  92.       sprintf(Buff,"%p: ",p);
  93.   
  94.     /* display each character as hex value */
  95.       for (i=start, j=0; j < 16; p++,i++, j++)
  96.       {
  97.          if (i < len)
  98.          {
  99.             sprintf(tmpBuf,"%X",((int)(*p) & 0xFF));
  100.   
  101.             if (strlen((char *)tmpBuf) < 2)
  102.             {
  103.                stuffBuff[0] = '0';
  104.                stuffBuff[1] = tmpBuf[0];
  105.                stuffBuff[2] = ' ';
  106.                stuffBuff[3] = '';
  107.             } else
  108.             {
  109.                stuffBuff[0] = tmpBuf[0];
  110.                stuffBuff[1] = tmpBuf[1];
  111.                stuffBuff[2] = ' ';
  112.                stuffBuff[3] = '';
  113.             }
  114.             strcat(Buff, stuffBuff);
  115.          } else
  116.             strcat(Buff," ");
  117.          if (j == 7) /* space between groups of 8 */
  118.             strcat(Buff," ");
  119.       }
  120.   
  121.     /* fill out incomplete lines */
  122.       for(;j<16;j++)
  123.       {
  124.          strcat(Buff,"   ");
  125.          if (j == 7)
  126.             strcat(Buff," ");
  127.       }
  128.       strcat(Buff,"  ");
  129.   
  130.     /* display each character as character value */
  131.       for (i=start,j=0,p=(char*)lp+start;
  132.          (i < len && j < 16); p++,i++, j++)
  133.       {
  134.          if ( ((*p) >= ' ') && ((*p) <= '~') )   /* test displayable */
  135.             sprintf(tmpBuf,"%c", *p);
  136.          else
  137.             sprintf(tmpBuf,"%c", '.');
  138.          strcat(Buff,tmpBuf);
  139.          if (j == 7)   /* space between groups of 8 */
  140.             strcat(Buff," ");
  141.       }
  142.       _dprintf("%sn", Buff);
  143.       start = i;  /* next line starting byte */
  144.    }
  145. }
  146. /**
  147.  * debug_set_core_dir:
  148.  * @argv0: the application path (usually argv[0] in main()).
  149.  * 
  150.  * Creates a directory with the application name and makes it the
  151.  * current working directory.  
  152.  * 
  153.  * This function exists because some unix variants use the name 'core'
  154.  * for core dump files.  When an application uses multiple processes,
  155.  * this can be problematic if the failure of one process leads to the
  156.  * failure of another because the dependent process 'core' file will
  157.  * overwrite the core of the failing process.
  158.  **/
  159. void debug_set_core_dir(const char *argv0)
  160. {
  161. #if defined(DEBUG) && !defined(WIN32)
  162.         struct stat s;
  163.         char coredir[64];
  164.         const char *appname;
  165.         appname = strrchr(argv0, '/');
  166.         if (appname == NULL) {
  167.                 appname = argv0;
  168.         } else {
  169.                 appname = appname + 1;
  170.         }
  171.         /* Should check length of appname, but this is debug code   */
  172.         /* and developers should know better than to have 64 char   */
  173.         /* app name.                                                */
  174.         sprintf(coredir, "core-%s", appname);
  175.         mkdir(coredir, S_IRWXU);
  176.         if (stat(coredir, &s) != 0) {
  177.                 debug_msg("Could not stat %sn", coredir);
  178.                 return;
  179.         }
  180.         if (!S_ISDIR(s.st_mode)) {
  181.                 debug_msg("Not a directory: %sn", coredir);
  182.                 return;
  183.         }
  184.         if (!(s.st_mode & S_IWUSR) || !(s.st_mode & S_IXUSR)) {
  185.                 debug_msg("Cannot write in or change to %sn", coredir);
  186.                 return;
  187.         }
  188.         if (chdir(coredir)) {
  189.                 perror(coredir);
  190.         }
  191. #endif /* DEBUG */
  192.         UNUSED(argv0);
  193. }
  194. static int rtp_debug_level =
  195. #ifdef DEBUG
  196. LOG_DEBUG;
  197. #else
  198. LOG_ERR;
  199. #endif
  200. void rtp_set_loglevel (int loglevel)
  201. {
  202.   rtp_debug_level = loglevel;
  203. }
  204. static rtp_error_msg_func_t error_msg_func = NULL;
  205. void rtp_set_error_msg_func (rtp_error_msg_func_t func)
  206. {
  207.   error_msg_func = func;
  208. }
  209. void rtp_message (int loglevel, const char *fmt, ...)
  210. {
  211.   va_list ap;
  212.   if (loglevel <= rtp_debug_level) {
  213.     va_start(ap, fmt);
  214.     if (error_msg_func != NULL) {
  215.       (error_msg_func)(loglevel, "rtp", fmt, ap);
  216.     } else {
  217.  #if _WIN32 && _DEBUG
  218.   char msg[1024];
  219.       _vsnprintf(msg, 1024, fmt, ap);
  220.       OutputDebugString(msg);
  221.       OutputDebugString("n");
  222. #else
  223.       struct timeval thistime;
  224.       char buffer[80];
  225.       time_t secs;
  226.       gettimeofday(&thistime, NULL);
  227.       // To add date, add %a %b %d to strftime
  228.       secs = thistime.tv_sec;
  229.       strftime(buffer, sizeof(buffer), "%X", localtime(&secs));
  230.       printf("%s.%03ld-rtp-%d: ",
  231.      buffer, (unsigned long)thistime.tv_usec / 1000, loglevel);
  232.       vprintf(fmt, ap);
  233.       printf("n");
  234. #endif
  235.     }
  236.     va_end(ap);
  237.   }
  238. }