From: rketcham <Ric...@gm...> - 2008-11-18 20:15:47
|
Hello, I've written a logging class which I want to use with other applications for logging process information. The logging class works on my desktop (which is using Ubuntu) but when I cross-compile it with the 1508 buildroot (with threading enabled - fixed via toolchain/Makefile.in) and deploy it on a gumstix, the class segfaults when it tries to write to an already opened file. When the toolchain is rebuilt with threading disabled, the program miraculously works and is able to write to the file it creates. My other buildroot versions (1552, 1627, 1633) have threading enabled and don't work as well. These are the includes for my class: #include <string> //String #include <fstream> //File IO #include <sstream> //String Editing #include <stdio.h> #include <time.h> The class segfaults here: m_logFile.write(logString.c_str(),logString.size()); logString is a string created from a stringstream object: ostringstream logLine; logLine<<"stuff"; string logString = logLine.str(); I need to be able to use this logging class within an application that is also using threading. Any ideas? Thanks, Rich -- View this message in context: http://www.nabble.com/fstream-with-threading-enabled-segfaults-tp20567377p20567377.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2008-11-18 22:40:17
|
Hi Rich, > I've written a logging class which I want to use with other applications for > logging process information. The logging class works on my desktop (which is > using Ubuntu) but when I cross-compile it with the 1508 buildroot (with > threading enabled - fixed via toolchain/Makefile.in) and deploy it on a > gumstix, the class segfaults when it tries to write to an already opened > file. When the toolchain is rebuilt with threading disabled, the program > miraculously works and is able to write to the file it creates. My other > buildroot versions (1552, 1627, 1633) have threading enabled and don't work > as well. > > These are the includes for my class: > > #include <string> //String > #include <fstream> //File IO > #include <sstream> //String Editing > #include <stdio.h> > #include <time.h> > > The class segfaults here: > > m_logFile.write(logString.c_str(),logString.size()); > > logString is a string created from a stringstream object: > > ostringstream logLine; > logLine<<"stuff"; > string logString = logLine.str(); > > > I need to be able to use this logging class within an application that is > also using threading. Any ideas? You'll need to show some more context. It looks like logLine and logString are being declared on the stack. Does that object still exist when the call to m_logFile is made? How was m_logFile declared? Was it opened? Did the open succeed? Also, I'd try streaming an eos() (end of string marker) in explicitly. c_str seems to just return a pointer directly to the underlying data, so streaming in "stuff" might not be adding the end of string marker. This could be a discrepancy between the C++ support stuff between glibc and whatever is included with buildroot/uclibc. -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: rketcham <Ric...@gm...> - 2008-11-19 15:32:52
|
Hi Dave, For context, my very simple program is below. I'll try adding in the eos(). main.cpp #include "Logger.h" #include <iostream> using namespace std; int main(void){ Logger log("test","."); log.Log("Log",ERROR, "ERROR","ERROR","ERROR"); } Logger.h #ifndef LOGGER_H_ #define LOGGER_H_ #include <string> //String #include <sstream> //String Editing #include <stdio.h> #include <time.h> #include <fstream> //File IO using namespace std; enum LoggerCodes{ ERROR, WARNING, INFO }; class Logger{ public: /******************************************************** * Logger() * Operation: Take in the log name and directory and format them * to be used for naming the logging file. * * Input: * logName - The name to use for the log. * logDir - The directory to put logName.log into. * * Output: * Stores names in member variables. Returns nothing. * ******************************************************/ Logger(string logName, string logDir):m_LogName(logName) { if(logDir.size()>0){ if(logDir[logDir.length()-1] != '/') logDir+='/'; } m_LogDir = logDir; } /******************************************************** * ~Logger() * Input: None * * Output: None * ******************************************************/ ~Logger(void){}; /******************************************************** * Logger() * * Operation: This function updates the log file with information * generated by the application using the class. * * Input: * category - Category is an application defined field. * loggerCode - Whether its and error, warning, or info. * event - What the name of the event is is. * details - A description of the event. * extraInfo - Extra information about the event. * * Output - None. * ******************************************************/ void Log(/*Category*/string category,/*Event Type*/LoggerCodes loggerCode, /*Event*/string event,/*Details*/string details,/*Auxiliary Info*/string extraInfo) { UpdateLogFileDate(); ostringstream logLine; logLine<<getTimeStamp()<<" \t"; logLine<<category<<"\t"<<((loggerCode==ERROR)?"ERROR":(loggerCode==WARNING)?"WARNING":"INFO")<<" \t"<<event;//NEED TO FIX!!!! if(details.size()>0) logLine<<" \t"<<details; if(extraInfo.size()>0) logLine<<" \t"<<extraInfo; logLine<<"\n"; string logString = logLine.str(); m_logFile.write(logString.c_str(),logString.size()); } private: /******************************************************** * UpdateLogFileDate() * * Operation: Checks the date and keeps the filename current * according to the current date. If the date changes, the * old file is closed and a new one is started. * * Input: None * * Output: Updates filename according to date. Returns nothing. * ******************************************************/ void UpdateLogFileDate(void) { string filePath; string today(getDateStamp()); //Get Date if (m_CurrentDate != today){//See if date is what we have //If not, open a new file. if(m_logFile.is_open()) m_logFile.close();//Close previous file. filePath= m_LogDir+m_LogName+'_'+today+".log";//Create file path m_logFile.open(filePath.c_str(),ios::out | ios::app); //Open file m_CurrentDate = today; //get the new date } } //Get the time and date string getTimeStamp(void){ time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); return asctime (timeinfo); } //Get the date string getDateStamp(void){ time_t rawtime; struct tm * timeinfo; char buffer[80]; time ( &rawtime ); timeinfo = localtime ( &rawtime ); //%a for the day of the week //%B for the month //%d for the day //%Y for the year strftime (buffer,80,"%B_%d_%Y",timeinfo); string dateStamp(buffer); return dateStamp; } private: string m_LogName; string m_LogDir; string m_CurrentDate; ofstream m_logFile; }; #endif /*LOGGER_H_*/ Dave Hylands wrote: > > Hi Rich, > > You'll need to show some more context. > > It looks like logLine and logString are being declared on the stack. > Does that object still exist when the call to m_logFile is made? How > was m_logFile declared? Was it opened? Did the open succeed? > > Also, I'd try streaming an eos() (end of string marker) in explicitly. > c_str seems to just return a pointer directly to the underlying data, > so streaming in "stuff" might not be adding the end of string marker. > This could be a discrepancy between the C++ support stuff between > glibc and whatever is included with buildroot/uclibc. > > -- > Dave Hylands > Shuswap, BC, Canada > http://www.DaveHylands.com/ > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's > challenge > Build the coolest Linux based applications with Moblin SDK & win great > prizes > Grand prize is a trip for two to an Open Source event anywhere in the > world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > > -- View this message in context: http://www.nabble.com/fstream-with-threading-enabled-segfaults-tp20567377p20582283.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: hypo <hyp...@gm...> - 2008-11-18 22:45:41
|
can you GDB at run time to see why it's faulting? Do you have multiple threads running? can you write simple test code that just outputs from a stringstream (and that would all that main contains) and demonstrate that this is only due to turning on multi-threading? i guess i'm trying to determine if the bug might be in your code or how multi-threading is enabled or (rather unlikely, but not impossible) fstream library implementation. hth, hypo rketcham wrote: > > Hello, > I've written a logging class which I want to use with other applications > for logging process information. The logging class works on my desktop > (which is using Ubuntu) but when I cross-compile it with the 1508 > buildroot (with threading enabled - fixed via toolchain/Makefile.in) and > deploy it on a gumstix, the class segfaults when it tries to write to an > already opened file. When the toolchain is rebuilt with threading > disabled, the program miraculously works and is able to write to the file > it creates. My other buildroot versions (1552, 1627, 1633) have threading > enabled and don't work as well. > > These are the includes for my class: > > #include <string> //String > #include <fstream> //File IO > #include <sstream> //String Editing > #include <stdio.h> > #include <time.h> > > The class segfaults here: > > m_logFile.write(logString.c_str(),logString.size()); > > logString is a string created from a stringstream object: > > ostringstream logLine; > logLine<<"stuff"; > string logString = logLine.str(); > > > I need to be able to use this logging class within an application that is > also using threading. Any ideas? > > Thanks, > Rich > > -- View this message in context: http://www.nabble.com/fstream-with-threading-enabled-segfaults-tp20567377p20569138.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: rketcham <Ric...@gm...> - 2008-11-19 15:55:17
|
Hi, I haven't tried GDB but I'll give it a shot. I just posted my entire program (it's not that large) and I have definitely gotten it to work on the Gumstix when threading was disabled. When threading is enabled it causes the fault. It always faults on the write: m_logFile.write(logString.c_str(),logString.size());. This is with a cout<<logString<<endl; before the write: # ./main Thu Jan 1 22:44:56 1970 Log ERROR ERROR ERROR ERROR Segmentation fault # Without threading: # ./main Thu Jan 1 22:46:37 1970 Log ERROR ERROR ERROR ERROR # I also explicitly added an end of string character ('\0') to logLine and, after that didn't work, to logString, which didn't work either. I'm at a loss for this one. I did switch it over to using C-style IO, but I'd rather use fstream if I can. Thanks for your help, Rich hypo wrote: > > can you GDB at run time to see why it's faulting? Do you have multiple > threads running? can you write simple test code that just outputs from a > stringstream (and that would all that main contains) and demonstrate that > this is only due to turning on multi-threading? > > i guess i'm trying to determine if the bug might be in your code or how > multi-threading is enabled or (rather unlikely, but not impossible) > fstream library implementation. > > hth, > hypo > > > rketcham wrote: >> >> Hello, >> I've written a logging class which I want to use with other applications >> for logging process information. The logging class works on my desktop >> (which is using Ubuntu) but when I cross-compile it with the 1508 >> buildroot (with threading enabled - fixed via toolchain/Makefile.in) and >> deploy it on a gumstix, the class segfaults when it tries to write to an >> already opened file. When the toolchain is rebuilt with threading >> disabled, the program miraculously works and is able to write to the file >> it creates. My other buildroot versions (1552, 1627, 1633) have threading >> enabled and don't work as well. >> >> These are the includes for my class: >> >> #include <string> //String >> #include <fstream> //File IO >> #include <sstream> //String Editing >> #include <stdio.h> >> #include <time.h> >> >> The class segfaults here: >> >> m_logFile.write(logString.c_str(),logString.size()); >> >> logString is a string created from a stringstream object: >> >> ostringstream logLine; >> logLine<<"stuff"; >> string logString = logLine.str(); >> >> >> I need to be able to use this logging class within an application that is >> also using threading. Any ideas? >> >> Thanks, >> Rich >> >> > > -- View this message in context: http://www.nabble.com/fstream-with-threading-enabled-segfaults-tp20567377p20582800.html Sent from the Gumstix mailing list archive at Nabble.com. |