2016-11-09 24 views
-2

当我尝试打开一个Logger类的文件时,我遇到了一些SIGSEGV有点麻烦。我一直在使用这个类,但这是我第一次得到这个。而从这样一个简单的线被称为先前时间:当试图打开一个Logger时,记录器接收到段错误

LOG(logDEBUG) << "Node " << nodeId << " in link layer state waitAck."; 

我得到这个从strace的:

open("simulation.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3 
lseek(3, 0, SEEK_END)     = 16380108 
--- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=NULL} --- 
+++ killed by SIGSEGV (core dumped) +++ 

得到这个GDB:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7210289 in malloc_consolidate() from /usr/lib/libc.so.6 
(gdb) backtrace 
#0 0x00007ffff7210289 in malloc_consolidate() from /usr/lib/libc.so.6 
#1 0x00007ffff7211d2a in _int_malloc() from /usr/lib/libc.so.6 
#2 0x00007ffff7213d44 in malloc() from /usr/lib/libc.so.6 
#3 0x00007ffff7ae1a48 in operator new (sz=8192) 
    at /build/gcc/src/gcc/libstdc++-v3/libsupc++/new_op.cc:50 
#4 0x00007ffff7ae1af5 in operator new[] (sz=<optimized out>) 
    at /build/gcc/src/gcc/libstdc++-v3/libsupc++/new_opv.cc:32 
#5 0x00007ffff7b41698 in std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer 
    (this=0x7fffffffdc68) 
    at /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/fstream.tcc:55 
#6 0x00007ffff7b45932 in std::basic_filebuf<char, std::char_traits<char> >::open (this=0x7fffffffdc68, 
    __s=0x690550 <Log::fileName[abi:cxx11]+16> "simulation.log", __mode=17) 
    at /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/fstream.tcc:187 
#7 0x00007ffff7b45a53 in std::basic_filebuf<char, std::char_traits<char> >::open (
    __mode=<optimized out>, __s=..., this=0x7fffffffdc68) 
    at /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/fstream:308 
#8 std::basic_ofstream<char, std::char_traits<char> >::open (this=0x7fffffffdc60, __s=..., 
    __mode=<optimized out>) 
    at /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/fstream:823 
#9 0x0000000000421c33 in Log::Log (this=0x7fffffffdc60) at src/log.cpp:21 
#10 0x0000000000446198 in LinkCsma::iterate2Receive (this=0x6a9440, [email protected]: 9387) 
    at src/link_csma.cpp:329 
#11 0x00000000004232a4 in Node::iterate2Receive (this=0x6a52f0, [email protected]: 9387) 
    at src/node.cpp:550 
#12 0x000000000042f2bc in DirectionalNodes::iterate (this=0x6a6eb0, [email protected]: 9387) 
    at src/directional_nodes.cpp:250 
#13 0x0000000000460ce5 in Simulation::run (this=0x6a6f00) at src/simulation.cpp:184 
#14 0x0000000000429e8c in main (argc=1, argv=0x7fffffffe878) at src/main.cpp:65 

从日志类的代码是:

#ifndef LOG_H__ 
#define LOG_H__ 

#include <fstream> 
#include <sstream> 
#include <string> 
#include <cstdio> 
#include <ctime> 

#ifdef DEBUG 
    #define LOG(level) \ 
    Log().write(level) 
#else 
    #define LOG(level) \ 
    if(level >= logDEBUG) ; \ 
    else Log().write(level) 
#endif 

enum LogLevel { 
    logERROR, 
    logWARNING, 
    logINFO, 
    logDEBUG 
}; 

class Log 
{ 
    public: 
     Log(); 
     ~Log(); 
     static void setFile(const std::string& s); 
     std::ofstream& write(LogLevel level = logINFO); 
    protected: 
     std::ofstream fileStream; 
    private: 
     Log(const Log&); 
     Log& operator =(const Log&); 
     std::string level2String(LogLevel level); 
     std::string timeString(); 

     static std::string fileName; 
     static const std::string DEFAULT_LOG_FILE; 
}; 

#endif //LOG_H__ 

和:

#include "../include/log.h" 

using namespace std; 

string Log::fileName; 
const string Log::DEFAULT_LOG_FILE = "logfile.log"; 

Log::Log() 
{ 
    fileStream.open(fileName, ios::out | ios::app); 
} 

Log::~Log() 
{ 
    fileStream << endl; 
    flush(fileStream); 
    fileStream.close(); 
} 

std::string Log::level2String(LogLevel level) 
{ 
    static const char* const buffer[] = { "ERROR", "WARNING", "INFO", "DEBUG" }; 
    return buffer[level]; 
} 

void Log::setFile(const std::string& s) 
{ 
    fileName = s; 
} 

std::string Log::timeString() 
{ 
    time_t t = time(0); 
    struct tm * now = localtime(&t); 
    stringstream ss; 

    ss << now->tm_hour << ":" << now->tm_min << " " 
     << now->tm_mday << "/" << (now->tm_mon+1) << "/" <<  (now->tm_year+1900); 

    return ss.str(); 
} 

std::ofstream& Log::write(LogLevel level) 
{ 
    fileStream << timeString(); 
    fileStream << " " << level2String(level) << ":\t"; 
    return fileStream; 
} 
+0

fileName通过调用setFile方法来设置。虽然在公开电话中检查时,gdb只显示“<优化出>”。 – thiroc

+0

当你摆脱宏时会发生什么? – Beta

+0

@Beta:没有什么变化。我实际上发现,如果我只包含一行“cout << fileName;”在打开文件之前,它不会收到seg故障。不知道为什么。 – thiroc

回答

相关问题