[Rd] Problem using ofstream in C++ class in package for MacOS X

cstrato cstrato at aon.at
Thu Feb 8 23:53:21 CET 2007


Ross Boylan wrote:
> On Thu, Feb 08, 2007 at 10:04:14PM +0100, cstrato wrote:
>   
>> Ross Boylan wrote:
>>     
>>> On Sun, Feb 04, 2007 at 10:47:37PM +0100, cstrato wrote:
>>>  
>>>       
>>>> Seth Falcon wrote:
>>>>    
>>>>         
>>>>> cstrato <cstrato at aon.at> writes:
>>>>>  
>>>>>      
>>>>>           
>>>>>> Thank you for your fast answer.
>>>>>> Sorrowly, I don´t know how to use a debugger on MacOS X, I am using 
>>>>>> old-style print commands.
>>>>>>    
>>>>>>        
>>>>>>             
>>>>> You should be able to use gdb on OS X (works for me, YMMV).  So you
>>>>> could try:
>>>>>
>>>>>      R -d gdb
>>>>>      run
>>>>>      # source a script that causes crash
>>>>>      # back in gdb, use backtrace, etc.
>>>>>
>>>>> + seth
>>>>>
>>>>>
>>>>>  
>>>>>      
>>>>>           
>>>> Dear Seth
>>>>
>>>> Thank you for this tip, I just tried it and here is the result:
>>>>
>>>> Welcome to MyClass
>>>>         
>>>>> writeFileCpp("myout_fileCpp.txt")
>>>>>           
>>>> [1] "outfile =  myout_fileCpp.txt"
>>>> Writing file myout_fileCpp.txt using C++ style.
>>>> ---MyClassA::MyClassA()---------
>>>> ---MyClassA::WriteFileCpp---------
>>>>
>>>> Program received signal EXC_BAD_ACCESS, Could not access memory.
>>>> Reason: KERN_PROTECTION_FAILURE at address: 0x00000006
>>>> 0x020fe231 in std::ostream::flush (this=0x214f178) at 
>>>> /Builds/unix/o403/i686-apple-darwin8/libstdc++-v3/include/bits/ostream.tcc:395
>>>> 395     
>>>> /Builds/unix/o403/i686-apple-darwin8/libstdc++-v3/include/bits/ostream.tcc: 
>>>> No such file or directory.
>>>>        in 
>>>> /Builds/unix/o403/i686-apple-darwin8/libstdc++-v3/include/bits/ostream.tcc
>>>> (gdb)
>>>>
>>>> It seems that it cannot find ostream.tcc, whatever this extension means.
>>>>
>>>> Best regards
>>>> Christian
>>>>    
>>>>         
>>> I also don't see what the problem is, but have a couple of thoughts.
>>> Under OS-X there is an environment variable you can define to get the
>>> dynamic linker to load debug versions of libraries.  I can't remember
>>> what it is, but maybe something like DYLD_DEBUG (but probably DEBUG is
>>> part of the value of the variable).
>>>
>>> For that, or the tracing above, to be fully informative you need to
>>> have installed the appropriate debugging libraries and sources.
>>>
>>> You may need to set an explicit source search path in gdb to pick up
>>> the source files.
>>>
>>> Try stepping through the code from write before the crash to determine
>>> exactly where it runs into trouble.
>>>
>>> Does the output file you are trying to create exist?
>>>
>>> Unfortunately, none of this really gets at your core bug, but it might
>>> help track it down.
>>>
>>> Ross
>>>
>>>
>>>  
>>>       
>> Dear Ross
>>
>> Thank you, my problem is that I know exactly where the problem is but 
>> not how to solve it.
>>
>> I have installed R-2.4.1 on three different machines to test the package:
>> - Intel-Laptop running Fedora Core 4:         package is OK
>> - PPC-PowerBook Titanium OS X 10.4.4:         package is OK
>> - Intel-MacBook Pro Core 2 Duo OS X 10.4.8:   C output OK, C++ output 
>> crashes R
>>
>> The following code in method WriteFileCpp() works, but gives no result:
>> {
>>  std::ofstream output(outfile);
>>  output.close();
>> }
>>
>> The following code in method WriteFileCpp() crashes R:
>> {
>>  std::ofstream output(outfile);
>>  output << "21" << endl;
>>  output.close();
>> }
>>
>> It seems that on the Intel-MacBook Pro the operator "<<" is not 
>> recognized, when called from within my package in R.
>> In contrast, when compiled as a C++ library, the same code does work on 
>> my Intel-Mac!
>>
>> Best regards
>> Christian
>>
>>
>>     
> Knowing the line isn't as specific as knowing exactly where it was
> when it crashed.
>
> Your stack trace was
> Thread 0 Crashed:
> 0   libstdc++.6.dylib     0x020fe231 std::basic_ostream<char,
> std::char_traits<char> >::flush() + 17 (ostream.tcc:395)
> 1   libstdc++.6.dylib     0x020fe358 std::basic_ostream<char,
> std::char_traits<char>
>  >::sentry::sentry[in-charge](std::basic_ostream<char,
> std::char_traits<char> >&) + 120 (ostream.tcc:56)
> 2   libstdc++.6.dylib     0x02100b5d std::basic_ostream<char,
> std::char_traits<char> >& std::operator<< <std::char_traits<char>
>  >(std::basic_ostream<char, std::char_traits<char> >&, char const*) + 29
> (ostream.tcc:620)
> 3   MyClass.so            0x0004a30f MyClassA::WriteFileCpp(char const*)
> which doesn't look as if the problem is that << isn't recognized.
> What is the thing that was at address 0x06?
>
> The flush is probably from the endl.  If you traced it through, you
> could tell if the first << completed.
>
> Does
>  output << endl;
> work?
>   
Does not work!
> or
>  output << "21";
>   
Does not work!
> or
>  output << 21 << endl;
>   
Does not work!
> or
>  #include <string>
>  string s("21");
>  output << s;
> ?
>   
Does work!  Even
"output << s << endl;"
works, but the outfile is empty!
> The different fates of the two OS-X platforms is certainly vexing.
> These are all shots in the dark, but
> 1) Was the complete system (i.e., R as well as your code) built with
> the the toolchain on both platforms?
>   
Yes
> 2) Are your environments (e.g., environment variables) the same?
>   
Yes
> 3) The recommended way to build stuff that will be talking to R is
> with R CMD config.  Check first if that gives the same results on both
> systems, and second if your build is using them.
>   
Not tested yet
> 4) Maybe some dylib (e.g., stdc++) is not getting initialized
> properly.
>
> Maybe there's some subtle linker problem, or a problem with the
> representation of strings
>
>
>   
What do you mean with linker problem?



More information about the R-devel mailing list