首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求高手指导log4cplus在windows环境上无法使用的有关问题

2013-01-17 
求高手指导log4cplus在windows环境下无法使用的问题本帖最后由 death10001 于 2013-01-09 11:05:24 编辑lo

求高手指导log4cplus在windows环境下无法使用的问题
本帖最后由 death10001 于 2013-01-09 11:05:24 编辑 log4cplus在windows环境下无语_CrtIsValidHeapPointer(pUserData)产生问题报错或者
 _free_dbg( pUserData, pHead->nBlockUse );
 错误断点在 retval = HeapFree(_crtheap, 0, pBlock);


官方的例子:

#include "log4cplus/logger.h"
#include "log4cplus/consoleappender.h"
#include "log4cplus/loglevel.h"
#include <iomanip>

using namespace std;
using namespace log4cplus;

int
main()
{
    SharedAppenderPtr append_1(new ConsoleAppender());
    append_1->setName(LOG4CPLUS_TEXT("First"));
    Logger::getRoot().addAppender(append_1);

    Logger root = Logger::getRoot();
    Logger test = Logger::getInstance(LOG4CPLUS_TEXT("test"));

    LOG4CPLUS_DEBUG(root,
                    "This is"
                    << " a reall"
                    << "y long message." << endl
                    << "Just testing it out" << endl
                    << "What do you think?");
    test.setLogLevel(NOT_SET_LOG_LEVEL);
    LOG4CPLUS_DEBUG(test, "This is a bool: " << true);
    LOG4CPLUS_INFO(test, "This is a char: " << 'x');
    LOG4CPLUS_INFO(test, "This is a short: " << (short)-100);
    LOG4CPLUS_INFO(test, "This is a unsigned short: " << (unsigned short)100);
    LOG4CPLUS_INFO(test, "This is a int: " << (int)1000);
    LOG4CPLUS_INFO(test, "This is a unsigned int: " << (unsigned int)1000);
    LOG4CPLUS_INFO(test, "This is a long(hex): " << hex << (long)100000000);
    LOG4CPLUS_INFO(test, "This is a unsigned long: " << (unsigned long)100000000);
    LOG4CPLUS_WARN(test, "This is a float: " << (float)1.2345);
    LOG4CPLUS_ERROR(test, 
                    "This is a double: " 
                    << setprecision(15) 
                    << (double)1.2345234234);
    LOG4CPLUS_FATAL(test, 
                    "This is a long double: " 


                    << setprecision(15) 
                    << (long double)123452342342.342);
    LOG4CPLUS_WARN(test, "The following message is empty:");
    LOG4CPLUS_WARN(test, "");

    return 0;
}




 不管在MTd还MDd下,多节还是Unicode字集下(Lib和头文件是连接正确的)都会产生这样的问题。个人初步认为跟log4cplus 的new 可能没delete有关。上网找了好久好多资料都没找到相关的问题,以及解决办法,好像没人遇到这样的问题?
就是下载其官方的例子在自己复制到自己VS2008的环境下还是不行一样产生这样的问题。


听说不少人说这个log好用,求高手指导这是为什么?怎么样解决? log4cplus windows _free_dbg 释放内存错误
[解决办法]
改用我这个土造的MyLog.c?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define ARRSIZE(x) (sizeof(x)/sizeof(x[0]))
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
char logstr[16000];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt
[解决办法]
0==pszFmt[0]) return;
    if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);


        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef WIN32
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef WIN32
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}


[解决办法]
用yaolog试试,简单易用功能也不差
http://www.codeproject.com/Articles/508529/yaolog-A-powerful-easy-use-cross-platform-Cplusplu
[解决办法]
引用:
引用:崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

呵呵 我真应该去跟去学习下程序调试、内存调试。

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

热点排行