Which VM have you used ?
I cross post to vm-dev list.
Laurent.
On Fri, Dec 24, 2010 at 3:54 AM, Hernán Morales Durand < hernan.morales@gmail.com> wrote:
Laurent, not much progress here :( I just reproduced the Unix VM crash. First I've linked the library so we do not have to change every module name call
user@ubuntu:/usr/lib$ ln -T -s /usr/lib/libyaz.so.3.0.0 yaz
and I've tried to execute the library tracer in the shell script
ltrace -f -l /usr/lib/libyaz.so.3.0.0 -o out.txt "$BASE/squeakvm" \ -plugins "$BASE" \ -encoding latin1 \ -vm-display-X11 \ "$ROOT/Contents/Resources/pharo.image"
but it crash the VM too with an unhandled exception even before the GUI is displayed. What I've observed is that every FFI call which receives an ExternalStructure as parameter kills the VM. This is weird because this doesn't happen in the Windows VM. I ran this little script I use to debug the library
| conn lib rs rsSize records | lib := Z3950FFILibrary default. conn := lib createConnectionTo: #Alabama asZ3950Server hostName port: 7090. lib createOptions. lib setConnection: conn optionName: 'preferredRecordSyntax' optionValue: 'USMARC'. rs := lib searchPqf: conn query: '@attr 1=1003 collins'. rsSize := lib resultSetSize: rs. rsSize > 0 ifFalse: [ 'no results' ]. records := Array new: rsSize. 0 to: rsSize - 1 do: [: pos | record := lib resultSetRecord: rs position: pos. record isNil not ifTrue: [ records at: pos + 1 put: ( lib getRecord: record function: 'render; charset=marc8, iso8859-1' length: nil ). ] ]. records
and the the doIt just hangs the VM, the console output going through the Debugger is the following:
Segmentation fault
-1370902312 ContextPart>doPrimitive:method:receiver:args: -1370902404 ContextPart>tryPrimitiveFor:receiver:args: -1370902788 ContextPart>send:to:with:super: -1370902896 ContextPart>send:super:numArgs: -1370902988 InstructionStream>interpretExtension:in:for: -1370903080 InstructionStream>interpretNextInstructionFor: -1370903172 ContextPart>step -1370903280 Process>step -1370903372 Process>step: -1370920392 Debugger>send -1370937720 PluggableButtonMorph>performAction -1370937812 PluggableButtonMorph>mouseUp: -1370937996 SequenceableCollection>do: -1370957140 PluggableButtonMorph>mouseUp: -1370957232 Morph>handleMouseUp: -1370957324 MouseButtonEvent>sentTo: -1370957416 Morph>handleEvent: -1370957584 Morph>handleFocusEvent: -1370957676 HandMorph>sendFocusEvent:to:clear: -1370957768 PasteUpMorph>becomeActiveDuring: -1370957860 BlockClosure>on:do: -1370957992 PasteUpMorph>becomeActiveDuring: -1370958084 HandMorph>sendFocusEvent:to:clear: -1370958260 HandMorph>sendEvent:focus:clear: -1370958352 HandMorph>sendMouseEvent: -1370958444 HandMorph>handleEvent: -1370966728 HandMorph>processEvents -1370966836 WorldState>doOneCycleNowFor: -1370966952 SequenceableCollection>do: -1370967044 WorldState>handsDo: -1370967136 WorldState>doOneCycleNowFor: -1370969680 WorldState>doOneCycleFor: -1370969772 PasteUpMorph>doOneCycle -1383611064 >spawnNewProcess -1383611192 BlockClosure>newProcess Aborted
it would be nice if someone could tell something about debugging FFI calls, or just any idea to try. Cheers,
Hernán
2010/12/23 laurent laffont laurent.laffont@gmail.com:
Hi, I have unmangled all function names. Image also crashes when evaluating
the
Kant test. (but this time I get ILLEGAL INSTRUCTION on strace). I've
tried
with Cog and the VM in the Seaside OneClick. I've uploaded the modified packages on squeaksource here: http://www.squeaksource.com/LaurentLSandbox.html (you can use Z3950Slice to load all at once). Laurent
On Thu, Dec 23, 2010 at 1:57 AM, Hernán Morales Durand hernan.morales@gmail.com wrote:
Hi Laurent,
Thanks for the feedback, I've uploaded the repository with the missing method but I cannot reproduce the crash in Windows. Have you unmangled every function name tested? Are you running just the Z3950FFILibraryTest? Notice the Z3950FFIServerLibraryTest tests are performed against a Z39.50 server running in local host, otherwise will fail (however that shouldn't crash the VM), so you may want to run only the Z3950FFILibraryTest suite. If you or anyone want a local Zebra server for Win32 - although most configuration files should work with other platforms - for testing purposes please let me know.
Does the Kant test crash the VM too?
Z3950Client new server: #Acadia; query: ( Z3950Query new author: 'Kant' ).
(see http://67.222.12.200:8889/WebOpus/52 for sample successful
results)
I will set up a Linux box tomorrow and try to reproduce there. Cheers,
2010/12/22 laurent laffont laurent.laffont@gmail.com:
Hi Hernan, finally I switch back to Linux to make it work, OSX gives me
headaches.
So on linux the yaz module is found. I get the "Unable to find
function
address" but I found that writing: <cdecl: ZOOMOptions 'ZOOM_options_create' (void) module: 'yaz'> instead of <cdecl: ZOOMOptions '_ZOOM_options_create@0' (void) module: 'yaz3'> works. If I understand, function names are not mangled when compiling with gcc on Linux.
Trying to run tests I've also had a "could not coerce arguments" in Z3950FFILibrary>>createConnectionTo:port because Z3950TestCase>>portNumber answers a String and <cdecl: ZOOMConnection 'ZOOM_connection_new' (char* short) module: 'yaz'> so it's waiting for a short. I've replaced portNumber to answer a SmallInteger. And now the image crashes on connectionIsIdle call: write(1, "\ncreateConnectionTo:port:", 25) = 25 write(1, "\nconnectionIsIdle:", 18) = 18 rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0 write(1, "\n", 1) = 1 tgkill(25830, 25830, SIGABRT) = 0 --- SIGABRT (Aborted) @ 0 (0) ---
Any idea ?
Laurent Laffont
On Tue, Dec 21, 2010 at 7:58 AM, laurent laffont laurent.laffont@gmail.com wrote:
The module is found ! How:
- Using VM Squeak 5.8b12 2 (instead of Cog or the VM provided in
Seaside One-Click image)
- go in Squeak\ 5.8b12\ 2.app/Contents/Resources/, then ln -s
/usr/local/lib/libyaz.3.dylib . Now I have the "Unable to find function address" you have talked earlier :) I will look at the mangled function names.
Laurent --- on the road to the FFI mountain.
On Tue, Dec 21, 2010 at 6:59 AM, Hernán Morales Durand hernan.morales@gmail.com wrote:
Laurent, I forward this e-mail to the squeak mailing list, may be someone
there
have a better idea how the OSX VM works. BTW there are more commentaries here
http://forum.world.st/squeak-dev-Alien-amp-Squeak-FFI-issues-on-Snow-Leopard...
Cheers,
Hernán
2010/12/20 laurent laffont laurent.laffont@gmail.com: > Hi Hernan, > the strace equivalent on OSX seems to be dtruss (yes I'm learning > OSX > too :) > sudo dtruss -p [pid of process] > in the trace I have this: > > >
stat("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3.bundle/Contents/MacOS/yaz3\0",
> 0xBFF59440, 0xBFF5AB28) = -1 Err#2 > > >
stat64("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3.bundle/Contents/MacOS/yaz3\0",
> 0xBFF5892C, 0xBFF5AB28) = -1 Err#2 > > >
stat("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3\0",
> 0xBFF59440, 0xBFF5AB28) = 0 0 > > >
stat64("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3\0",
> 0xBFF5892C, 0xBFF5AB28) = 0 0 > > >
open("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3\0",
> 0x0, 0x0) = 12 0 > pread(0xC, "\317\372\355\376\a\0", 0x1000, 0x0) = 4096 0 > close(0xC) = 0 0 > > >
stat("/Users/laurentlaffont/Downloads/Plugins/yaz3.bundle/Contents/MacOS/yaz3\0",
> 0xBFF59440, 0x1000) = -1 Err#2 > > >
stat64("/Users/laurentlaffont/Downloads/Plugins/yaz3.bundle/Contents/MacOS/yaz3\0",
> 0xBFF5892C, 0x1000) = -1 Err#2 > stat("/Users/laurentlaffont/Downloads/Plugins/yaz3\0", 0xBFF59440, > 0x1000) = > -1 Err#2 > stat64("/Users/laurentlaffont/Downloads/Plugins/yaz3\0",
0xBFF5892C,
> 0x1000) > = -1 Err#2 > > so it looks like the VM is trying to find yaz3 at non standard
Unix
> places > (I don't know if it's SqueakVM or OSX related). > I've created Contents/Resources/yaz3.bundle/Contents/MacOS/, put
yaz
> lib > there, ln -s libyaz.3.dylib yaz3 but no success. > > I've read good > post http://forum.world.st/FFI-Documentation-td2225150.html : > > Module Location - where the external library file lives > - depends on the platform > - Mac > - pre Snow Leopard > - checks VM path and common library > paths > - Snow Leopard > - only looks in VM bundle's
Resources
> file, you must either [5]: > - store all external
libraries
> there > - ln -s path/to/library > path/to/VM/Resources/library_name > - Change the VM's Info.plist > "SqueakPluginsBuiltInOrLocalOnly" key from > "true" to "false." > > For this SqueakPluginsBuiltInOrLocalOnly I suppose I need to
compile
> a > VM ? > Cheers, > Laurent Laffont > > > On Mon, Dec 20, 2010 at 4:12 PM, Hernán Morales Durand > hernan.morales@gmail.com wrote: >> >> Hi Laurent >> >> I've read there is a couple of system calll monitors in MacOS, >> ktrace >> and dtrace (http://en.wikipedia.org/wiki/Ktrace , >> http://en.wikipedia.org/wiki/DTrace) so you may attach to the VM >> and >> see what's missing? >> Cheers, >> >> Hernán >> >> 2010/12/20 laurent laffont laurent.laffont@gmail.com: >> > Thanks Hernan. >> > It still doesn't work. I've also tried to play with
LD_LOAD_PATH
>> > / >> > LD_LIBRARY_PATH no success.... I want to make it work so I need >> > to >> > learn >> > :) >> > >> > For the mangled function names, on Linux and OSX there's nm. >> > Here's what I get: >> > $ nm -g libyaz.3.dylib | grep ZOOM_connection_create >> > 0000000000046a30 T _ZOOM_connection_create >> > Cheers, >> > Laurent >> > >> > On Sun, Dec 19, 2010 at 6:23 PM, Hernán Morales Durand >> > hernan.morales@gmail.com wrote: >> >> >> >> Hi Laurent, >> >> >> >> Thanks for reporting. The correct #moduleName for MacOS was >> >> missing, >> >> I've uploaded a new version answering 'libyaz.3.dylib' which I >> >> guess >> >> is the corresponding for 'yaz3.dll' (according to >> >> http://en.wikipedia.org/wiki/Dynamic_library#Naming ). >> >> >> >> I haven't access to a MacOS, but in Windows I've had to find
the
>> >> mangled function names (i.e. _ZOOM_connection_create@4) so
FFI
>> >> can >> >> find the function addresses and you don't get the classic >> >> "Error: >> >> Unable to find function address". I don't know if it's related >> >> since >> >> talks about C++, but you may want to check >> >> http://wiki.squeak.org/squeak/3735 >> >> >> >> The tool I've used to find the mangled function names in
Windows
>> >> is >> >> the Steve Miller's Dependency Walker >> >> http://www.dependencywalker.com/ >> >> >> >> 2010/12/19 laurent laffont laurent.laffont@gmail.com: >> >> > Hi, >> >> > >> >> > I want to use http://www.squeaksource.com/Z3950 >> >> > Following install instructions, I've dowloaded yaz sources >> >> > (I've >> >> > tried >> >> > 4.1.2 >> >> > and 3.0.52) as it seems there's no binary for OSX,
./configure
>> >> > && make >> >> > && >> >> > make install. >> >> > Then using latest Seaside One Click image I've copied >> >> > /usr/local/lib/*yaz* >> >> > in Seaside.app/Contents/MacOS >> >> > $ ls ~/Downloads/Seaside.app/Contents/MacOS/ >> >> > Squeak VM Opt libyaz.a libyaz.la >> >> > libyaz_icu.a libyaz_icu.la libyaz_server.a >> >> > libyaz_server.la libyaz.3.dylib libyaz.dylib >> >> > libyaz_icu.3.dylib libyaz_icu.dylib >> >> > libyaz_server.3.dylib >> >> > libyaz_server.dylib >> >> > >> >> > >> >> > But then I have a External Module Not Found on >> >> > YAZPQFFFILibrary>>createParser >> >> > " YAZPQDFFILibrary default createParser " >> >> > <cdecl: YAZPQFParser 'yaz_pqf_create' (void) module: 'yaz3'> >> >> > ^ self externalCallFailed >> >> > >> >> > Any hint ? >> >> > Cheers, >> >> > Laurent Laffont -- FFI newbie >> >> > >> >> > Pharo Smalltalk Screencasts: http://www.pharocasts.com/ >> >> > Blog: http://magaloma.blogspot.com/ >> >> > >> >> >> >> -- >> >> Hernán Morales >> >> Information Technology Manager, >> >> Institute of Veterinary Genetics. >> >> National Scientific and Technical Research Council (CONICET). >> >> La Plata (1900), Buenos Aires, Argentina. >> >> Telephone: +54 (0221) 421-1799. >> >> Internal: 422 >> >> Fax: 425-7980 or 421-1799. >> >
Hern??n,
A segmentation fault that occurs when calling the function in an external library would most likely indicate that the arguments being passed to the library function are not correct for some reason. Probably it is something related to the ExternalStructure as you mention.
You must use a normal 32-bit VM and 32-bit libraries. I think that you are doing this, but I mention it because using 64-bit VM or libraries will definitely crash FFI. http://bugs.squeak.org/view.php?id=7237
Dave
On Fri, Dec 24, 2010 at 08:33:33AM +0100, laurent laffont wrote:
Which VM have you used ?
I cross post to vm-dev list.
Laurent.
On Fri, Dec 24, 2010 at 3:54 AM, Hern??n Morales Durand < hernan.morales@gmail.com> wrote:
Laurent, not much progress here :( I just reproduced the Unix VM crash. First I've linked the library so we do not have to change every module name call
user@ubuntu:/usr/lib$ ln -T -s /usr/lib/libyaz.so.3.0.0 yaz
and I've tried to execute the library tracer in the shell script
ltrace -f -l /usr/lib/libyaz.so.3.0.0 -o out.txt "$BASE/squeakvm" \ -plugins "$BASE" \ -encoding latin1 \ -vm-display-X11 \ "$ROOT/Contents/Resources/pharo.image"
but it crash the VM too with an unhandled exception even before the GUI is displayed. What I've observed is that every FFI call which receives an ExternalStructure as parameter kills the VM. This is weird because this doesn't happen in the Windows VM. I ran this little script I use to debug the library
| conn lib rs rsSize records | lib := Z3950FFILibrary default. conn := lib createConnectionTo: #Alabama asZ3950Server hostName port: 7090. lib createOptions. lib setConnection: conn optionName: 'preferredRecordSyntax' optionValue: 'USMARC'. rs := lib searchPqf: conn query: '@attr 1=1003 collins'. rsSize := lib resultSetSize: rs. rsSize > 0 ifFalse: [ 'no results' ]. records := Array new: rsSize. 0 to: rsSize - 1 do: [: pos | record := lib resultSetRecord: rs position: pos. record isNil not ifTrue: [ records at: pos + 1 put: ( lib getRecord: record function: 'render; charset=marc8, iso8859-1' length: nil ). ] ]. records
and the the doIt just hangs the VM, the console output going through the Debugger is the following:
Segmentation fault
-1370902312 ContextPart>doPrimitive:method:receiver:args: -1370902404 ContextPart>tryPrimitiveFor:receiver:args: -1370902788 ContextPart>send:to:with:super: -1370902896 ContextPart>send:super:numArgs: -1370902988 InstructionStream>interpretExtension:in:for: -1370903080 InstructionStream>interpretNextInstructionFor:
Hi David,
2010/12/24 David T. Lewis lewis@mail.msen.com:
Hern??n,
A segmentation fault that occurs when calling the function in an external library would most likely indicate that the arguments being passed to the library function are not correct for some reason. Probably it is something related to the ExternalStructure as you mention.
The strange thing is that in the Windows VM goes fine. Is there a special VM debug flag or parameter specifically for this cases? Maybe I could check with that.
You must use a normal 32-bit VM and 32-bit libraries. I think that you are doing this, but I mention it because using 64-bit VM or libraries will definitely crash FFI. http://bugs.squeak.org/view.php?id=7237
Yes, I'm sure because Ubuntu 8.10 doesn't allow to install libraries compiled for another architecture.
Cheers,
Dave
On Fri, Dec 24, 2010 at 08:33:33AM +0100, laurent laffont wrote:
Which VM have you used ?
I cross post to vm-dev list.
Laurent.
On Fri, Dec 24, 2010 at 3:54 AM, Hern??n Morales Durand < hernan.morales@gmail.com> wrote:
Laurent, not much progress here :( I just reproduced the Unix VM crash. First I've linked the library so we do not have to change every module name call
user@ubuntu:/usr/lib$ ln -T -s /usr/lib/libyaz.so.3.0.0 yaz
and I've tried to execute the library tracer in the shell script
ltrace -f -l /usr/lib/libyaz.so.3.0.0 -o out.txt "$BASE/squeakvm" \ -plugins "$BASE" \ -encoding latin1 \ -vm-display-X11 \ "$ROOT/Contents/Resources/pharo.image"
but it crash the VM too with an unhandled exception even before the GUI is displayed. What I've observed is that every FFI call which receives an ExternalStructure as parameter kills the VM. This is weird because this doesn't happen in the Windows VM. I ran this little script I use to debug the library
| conn lib rs rsSize records | lib := Z3950FFILibrary default. conn := lib createConnectionTo: #Alabama asZ3950Server hostName port: 7090. lib createOptions. lib setConnection: conn optionName: 'preferredRecordSyntax' optionValue: 'USMARC'. rs := lib searchPqf: conn query: '@attr 1=1003 collins'. rsSize := lib resultSetSize: rs. rsSize > 0 ifFalse: [ 'no results' ]. records := Array new: rsSize. 0 to: rsSize - 1 do: [: pos | record := lib resultSetRecord: rs position: pos. record isNil not ifTrue: [ records at: pos + 1 put: ( lib getRecord: record function: 'render; charset=marc8, iso8859-1' length: nil ). ] ]. records
and the the doIt just hangs the VM, the console output going through the Debugger is the following:
Segmentation fault
-1370902312 ContextPart>doPrimitive:method:receiver:args: -1370902404 ContextPart>tryPrimitiveFor:receiver:args: -1370902788 ContextPart>send:to:with:super: -1370902896 ContextPart>send:super:numArgs: -1370902988 InstructionStream>interpretExtension:in:for: -1370903080 InstructionStream>interpretNextInstructionFor:
On Fri, Dec 24, 2010 at 12:44:50PM -0300, Hern??n Morales Durand wrote:
Hi David,
2010/12/24 David T. Lewis lewis@mail.msen.com:
Hern??n,
A segmentation fault that occurs when calling the function in an external library would most likely indicate that the arguments being passed to the library function are not correct for some reason. Probably it is something related to the ExternalStructure as you mention.
The strange thing is that in the Windows VM goes fine.
There are differences in the Windows an unix implementations, so sometimes a declaration that works on Windows may need to be done differently on unix. I don't have any examples, but I know I have seen this in the past.
Is there a special VM debug flag or parameter specifically for this cases? Maybe I could check with that.
I do not know of anything that would help here. In the past I have done debugging by setting gdb breakpoints right before running the workspace script. It's a real pain but it can be done.
I know that this does not answer your question, but if you can consider building a plugin rather than using FFI, I think you may find it to be easier to debug and more reliable overall.
Dave
You must use a normal 32-bit VM and 32-bit libraries. I think that you are doing this, but I mention it because using 64-bit VM or libraries will definitely crash FFI. ??http://bugs.squeak.org/view.php?id=7237
Yes, I'm sure because Ubuntu 8.10 doesn't allow to install libraries compiled for another architecture.
Cheers,
Dave
On Fri, Dec 24, 2010 at 08:33:33AM +0100, laurent laffont wrote:
Which VM have you used ?
I cross post to vm-dev list.
Laurent.
On Fri, Dec 24, 2010 at 3:54 AM, Hern??n Morales Durand < hernan.morales@gmail.com> wrote:
Laurent, not much progress here :( I just reproduced the Unix VM crash. First I've linked the library so we do not have to change every module name call
user@ubuntu:/usr/lib$ ln -T -s /usr/lib/libyaz.so.3.0.0 yaz
and I've tried to execute the library tracer in the shell script
ltrace -f -l /usr/lib/libyaz.so.3.0.0 -o out.txt "$BASE/squeakvm" \ ?? ?? ?? ??-plugins "$BASE" \ ?? ?? ?? ??-encoding latin1 \ ?? ?? ?? ??-vm-display-X11 \ ?? ?? ?? ??"$ROOT/Contents/Resources/pharo.image"
but it crash the VM too with an unhandled exception even before the GUI is displayed. What I've observed is that every FFI call which receives an ExternalStructure as parameter kills the VM. This is weird because this doesn't happen in the Windows VM. I ran this little script I use to debug the library
| conn lib rs rsSize records | lib := Z3950FFILibrary default. conn := lib ?? ?? ?? ??createConnectionTo: #Alabama asZ3950Server hostName ?? ?? ?? ??port: 7090. lib createOptions. lib ?? ?? ?? ??setConnection: conn ?? ?? ?? ??optionName: 'preferredRecordSyntax' ?? ?? ?? ??optionValue: 'USMARC'. rs := lib ?? ?? ?? ??searchPqf: conn ?? ?? ?? ??query: ??'@attr 1=1003 collins'. rsSize := lib resultSetSize: rs. rsSize > 0 ?? ?? ?? ??ifFalse: ??[ 'no results' ]. records := Array new: rsSize. 0 to: rsSize - 1 do: [: pos | ?? ?? ?? ??record := lib resultSetRecord: rs position: pos. ?? ?? ?? ??record isNil not ?? ?? ?? ?? ?? ?? ?? ??ifTrue: ??[ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??records ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??at: pos + 1 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??put: ( lib ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??getRecord: record ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??function: 'render; charset=marc8, iso8859-1' ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??length: nil ). ] ]. records
and the the doIt just hangs the VM, the console output going through the Debugger is the following:
Segmentation fault
-1370902312 ContextPart>doPrimitive:method:receiver:args: -1370902404 ContextPart>tryPrimitiveFor:receiver:args: -1370902788 ContextPart>send:to:with:super: -1370902896 ContextPart>send:super:numArgs: -1370902988 InstructionStream>interpretExtension:in:for: -1370903080 InstructionStream>interpretNextInstructionFor:
-- Hern??n Morales Information Technology Manager, Institute of Veterinary Genetics. National Scientific and Technical Research Council (CONICET). La Plata (1900), Buenos Aires, Argentina. Telephone: +54 (0221) 421-1799. Internal: 422 Fax: 425-7980 or 421-1799.
On 24 December 2010 17:17, David T. Lewis lewis@mail.msen.com wrote:
On Fri, Dec 24, 2010 at 12:44:50PM -0300, Hern??n Morales Durand wrote:
Hi David,
2010/12/24 David T. Lewis lewis@mail.msen.com:
Hern??n,
A segmentation fault that occurs when calling the function in an external library would most likely indicate that the arguments being passed to the library function are not correct for some reason. Probably it is something related to the ExternalStructure as you mention.
The strange thing is that in the Windows VM goes fine.
If you using structs, one of the things you need to be aware is struct fields memory alignment.
for instance:
struct foo { char x; char y; } bar;
try compile and print:
printf ('%d" , &bar.y - &bar.x );
depending on compiler's default alignment, it could be 1 or 4 or anything else. :) This is of course may vary from platform to platform and from compiler to compiler.
Not sure if you can specify the struct alignment using FFI package.
There are differences in the Windows an unix implementations, so sometimes a declaration that works on Windows may need to be done differently on unix. I don't have any examples, but I know I have seen this in the past.
Is there a special VM debug flag or parameter specifically for this cases? Maybe I could check with that.
I do not know of anything that would help here. In the past I have done debugging by setting gdb breakpoints right before running the workspace script. It's a real pain but it can be done.
I know that this does not answer your question, but if you can consider building a plugin rather than using FFI, I think you may find it to be easier to debug and more reliable overall.
Dave
You must use a normal 32-bit VM and 32-bit libraries. I think that you are doing this, but I mention it because using 64-bit VM or libraries will definitely crash FFI. ??http://bugs.squeak.org/view.php?id=7237
Yes, I'm sure because Ubuntu 8.10 doesn't allow to install libraries compiled for another architecture.
Cheers,
Dave
On Fri, Dec 24, 2010 at 08:33:33AM +0100, laurent laffont wrote:
Which VM have you used ?
I cross post to vm-dev list.
Laurent.
On Fri, Dec 24, 2010 at 3:54 AM, Hern??n Morales Durand < hernan.morales@gmail.com> wrote:
Laurent, not much progress here :( I just reproduced the Unix VM crash. First I've linked the library so we do not have to change every module name call
user@ubuntu:/usr/lib$ ln -T -s /usr/lib/libyaz.so.3.0.0 yaz
and I've tried to execute the library tracer in the shell script
ltrace -f -l /usr/lib/libyaz.so.3.0.0 -o out.txt "$BASE/squeakvm" \ ?? ?? ?? ??-plugins "$BASE" \ ?? ?? ?? ??-encoding latin1 \ ?? ?? ?? ??-vm-display-X11 \ ?? ?? ?? ??"$ROOT/Contents/Resources/pharo.image"
but it crash the VM too with an unhandled exception even before the GUI is displayed. What I've observed is that every FFI call which receives an ExternalStructure as parameter kills the VM. This is weird because this doesn't happen in the Windows VM. I ran this little script I use to debug the library
| conn lib rs rsSize records | lib := Z3950FFILibrary default. conn := lib ?? ?? ?? ??createConnectionTo: #Alabama asZ3950Server hostName ?? ?? ?? ??port: 7090. lib createOptions. lib ?? ?? ?? ??setConnection: conn ?? ?? ?? ??optionName: 'preferredRecordSyntax' ?? ?? ?? ??optionValue: 'USMARC'. rs := lib ?? ?? ?? ??searchPqf: conn ?? ?? ?? ??query: ??'@attr 1=1003 collins'. rsSize := lib resultSetSize: rs. rsSize > 0 ?? ?? ?? ??ifFalse: ??[ 'no results' ]. records := Array new: rsSize. 0 to: rsSize - 1 do: [: pos | ?? ?? ?? ??record := lib resultSetRecord: rs position: pos. ?? ?? ?? ??record isNil not ?? ?? ?? ?? ?? ?? ?? ??ifTrue: ??[ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??records ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??at: pos + 1 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??put: ( lib ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??getRecord: record ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??function: 'render; charset=marc8, iso8859-1' ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??length: nil ). ] ]. records
and the the doIt just hangs the VM, the console output going through the Debugger is the following:
Segmentation fault
-1370902312 ContextPart>doPrimitive:method:receiver:args: -1370902404 ContextPart>tryPrimitiveFor:receiver:args: -1370902788 ContextPart>send:to:with:super: -1370902896 ContextPart>send:super:numArgs: -1370902988 InstructionStream>interpretExtension:in:for: -1370903080 InstructionStream>interpretNextInstructionFor:
-- Hern??n Morales Information Technology Manager, Institute of Veterinary Genetics. National Scientific and Technical Research Council (CONICET). La Plata (1900), Buenos Aires, Argentina. Telephone: +54 (0221) 421-1799. Internal: 422 Fax: 425-7980 or 421-1799.
On 12/24/2010 5:27 PM, Igor Stasenko wrote:
If you using structs, one of the things you need to be aware is struct fields memory alignment.
for instance:
struct foo { char x; char y; } bar;
try compile and print:
printf ('%d" ,&bar.y -&bar.x );
depending on compiler's default alignment, it could be 1 or 4 or anything else. :) This is of course may vary from platform to platform and from compiler to compiler.
Not sure if you can specify the struct alignment using FFI package.
You can. The default i.e.,
fields ^#( (x 'char') (y 'char') )
is 1-aligned, to change it to be 4-aligned you can tell the FFI how much bytes each element in the spec takes, i.e.,
fields ^#( (x 'char' 4) (y 'char' 4) )
More commonly, you would have alignments like this:
fields ^#( (r 'byte') (g 'byte') (b 'byte' 2) "<- align next element on word boundary" (a 'ulong') )
Cheers, - Andreas
Thanks for the answers guys. It is very dissapointing to try a fix when the VM suddenly dissapears over and over again. I have no time for building a plugin, so our best options are to wait a fix from someone with VM/FFI knowledge or slowly specify the struct alignments of the Z39.50 structures (and not sure if it's the real cause because... the VMs segfaults). Cheers,
Hernán
2010/12/24 David T. Lewis lewis@mail.msen.com:
On Fri, Dec 24, 2010 at 12:44:50PM -0300, Hern??n Morales Durand wrote:
Hi David,
2010/12/24 David T. Lewis lewis@mail.msen.com:
Hern??n,
A segmentation fault that occurs when calling the function in an external library would most likely indicate that the arguments being passed to the library function are not correct for some reason. Probably it is something related to the ExternalStructure as you mention.
The strange thing is that in the Windows VM goes fine.
There are differences in the Windows an unix implementations, so sometimes a declaration that works on Windows may need to be done differently on unix. I don't have any examples, but I know I have seen this in the past.
Is there a special VM debug flag or parameter specifically for this cases? Maybe I could check with that.
I do not know of anything that would help here. In the past I have done debugging by setting gdb breakpoints right before running the workspace script. It's a real pain but it can be done.
I know that this does not answer your question, but if you can consider building a plugin rather than using FFI, I think you may find it to be easier to debug and more reliable overall.
Dave
You must use a normal 32-bit VM and 32-bit libraries. I think that you are doing this, but I mention it because using 64-bit VM or libraries will definitely crash FFI. ??http://bugs.squeak.org/view.php?id=7237
Yes, I'm sure because Ubuntu 8.10 doesn't allow to install libraries compiled for another architecture.
Cheers,
Dave
On Fri, Dec 24, 2010 at 08:33:33AM +0100, laurent laffont wrote:
Which VM have you used ?
I cross post to vm-dev list.
Laurent.
On Fri, Dec 24, 2010 at 3:54 AM, Hern??n Morales Durand < hernan.morales@gmail.com> wrote:
Laurent, not much progress here :( I just reproduced the Unix VM crash. First I've linked the library so we do not have to change every module name call
user@ubuntu:/usr/lib$ ln -T -s /usr/lib/libyaz.so.3.0.0 yaz
and I've tried to execute the library tracer in the shell script
ltrace -f -l /usr/lib/libyaz.so.3.0.0 -o out.txt "$BASE/squeakvm" \ ?? ?? ?? ??-plugins "$BASE" \ ?? ?? ?? ??-encoding latin1 \ ?? ?? ?? ??-vm-display-X11 \ ?? ?? ?? ??"$ROOT/Contents/Resources/pharo.image"
but it crash the VM too with an unhandled exception even before the GUI is displayed. What I've observed is that every FFI call which receives an ExternalStructure as parameter kills the VM. This is weird because this doesn't happen in the Windows VM. I ran this little script I use to debug the library
| conn lib rs rsSize records | lib := Z3950FFILibrary default. conn := lib ?? ?? ?? ??createConnectionTo: #Alabama asZ3950Server hostName ?? ?? ?? ??port: 7090. lib createOptions. lib ?? ?? ?? ??setConnection: conn ?? ?? ?? ??optionName: 'preferredRecordSyntax' ?? ?? ?? ??optionValue: 'USMARC'. rs := lib ?? ?? ?? ??searchPqf: conn ?? ?? ?? ??query: ??'@attr 1=1003 collins'. rsSize := lib resultSetSize: rs. rsSize > 0 ?? ?? ?? ??ifFalse: ??[ 'no results' ]. records := Array new: rsSize. 0 to: rsSize - 1 do: [: pos | ?? ?? ?? ??record := lib resultSetRecord: rs position: pos. ?? ?? ?? ??record isNil not ?? ?? ?? ?? ?? ?? ?? ??ifTrue: ??[ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??records ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??at: pos + 1 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??put: ( lib ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??getRecord: record ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??function: 'render; charset=marc8, iso8859-1' ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??length: nil ). ] ]. records
and the the doIt just hangs the VM, the console output going through the Debugger is the following:
Segmentation fault
-1370902312 ContextPart>doPrimitive:method:receiver:args: -1370902404 ContextPart>tryPrimitiveFor:receiver:args: -1370902788 ContextPart>send:to:with:super: -1370902896 ContextPart>send:super:numArgs: -1370902988 InstructionStream>interpretExtension:in:for: -1370903080 InstructionStream>interpretNextInstructionFor:
-- Hern??n Morales Information Technology Manager, Institute of Veterinary Genetics. National Scientific and Technical Research Council (CONICET). La Plata (1900), Buenos Aires, Argentina. Telephone: +54 (0221) 421-1799. Internal: 422 Fax: 425-7980 or 421-1799.
On Sat, Dec 25, 2010 at 9:23 PM, Hernán Morales Durand < hernan.morales@gmail.com> wrote:
Thanks for the answers guys. It is very dissapointing to try a fix when the VM suddenly dissapears over and over again. I have no time for building a plugin, so our best options are to wait a fix from someone with VM/FFI knowledge or slowly specify the struct alignments of the Z39.50 structures (and not sure if it's the real cause because... the VMs segfaults).
Program in the debugger. Seriously, run the VM from within gdb. You have the changes file for crash recovery. You use gdb for identifying the cause of the crash. You'll make progress, albeit slowly. Also, try writing a C program that prints out the struct offsets, e.g.
#define printoffset(struct,field) printf("&" #struct "." #field "=%d\n", (char *)&(struct.field) - (char *)&field)
Better still get the FFI to generate such a file for you automagically that prints out the relevant Smalltalk source.
HTH Eliot
Cheers,
Hernán
2010/12/24 David T. Lewis lewis@mail.msen.com:
On Fri, Dec 24, 2010 at 12:44:50PM -0300, Hern??n Morales Durand wrote:
Hi David,
2010/12/24 David T. Lewis lewis@mail.msen.com:
Hern??n,
A segmentation fault that occurs when calling the function in an external library would most likely indicate that the arguments being passed to the library function are not correct for some reason. Probably it is something related to the ExternalStructure as you mention.
The strange thing is that in the Windows VM goes fine.
There are differences in the Windows an unix implementations, so sometimes a declaration that works on Windows may need to be done differently on unix. I don't have any examples, but I know I have seen this in the past.
Is there a special VM debug flag or parameter specifically for this cases? Maybe I could check with that.
I do not know of anything that would help here. In the past I have done debugging by setting gdb breakpoints right before running the workspace script. It's a real pain but it can be done.
I know that this does not answer your question, but if you can consider building a plugin rather than using FFI, I think you may find it to be easier to debug and more reliable overall.
Dave
You must use a normal 32-bit VM and 32-bit libraries. I think that you are doing this, but I mention it because using 64-bit VM or libraries will definitely crash FFI. ??http://bugs.squeak.org/view.php?id=7237
Yes, I'm sure because Ubuntu 8.10 doesn't allow to install libraries compiled for another architecture.
Cheers,
Dave
On Fri, Dec 24, 2010 at 08:33:33AM +0100, laurent laffont wrote:
Which VM have you used ?
I cross post to vm-dev list.
Laurent.
On Fri, Dec 24, 2010 at 3:54 AM, Hern??n Morales Durand < hernan.morales@gmail.com> wrote:
Laurent, not much progress here :( I just reproduced the Unix VM crash. First I've linked the library
so
we do not have to change every module name call
user@ubuntu:/usr/lib$ ln -T -s /usr/lib/libyaz.so.3.0.0 yaz
and I've tried to execute the library tracer in the shell script
ltrace -f -l /usr/lib/libyaz.so.3.0.0 -o out.txt "$BASE/squeakvm" \ ?? ?? ?? ??-plugins "$BASE" \ ?? ?? ?? ??-encoding latin1 \ ?? ?? ?? ??-vm-display-X11 \ ?? ?? ?? ??"$ROOT/Contents/Resources/pharo.image"
but it crash the VM too with an unhandled exception even before the GUI is displayed. What I've observed is that every FFI call which receives an ExternalStructure as parameter kills the VM. This is weird because this doesn't happen in the Windows VM. I ran this little script I
use
to debug the library
| conn lib rs rsSize records | lib := Z3950FFILibrary default. conn := lib ?? ?? ?? ??createConnectionTo: #Alabama asZ3950Server hostName ?? ?? ?? ??port: 7090. lib createOptions. lib ?? ?? ?? ??setConnection: conn ?? ?? ?? ??optionName: 'preferredRecordSyntax' ?? ?? ?? ??optionValue: 'USMARC'. rs := lib ?? ?? ?? ??searchPqf: conn ?? ?? ?? ??query: ??'@attr 1=1003 collins'. rsSize := lib resultSetSize: rs. rsSize > 0 ?? ?? ?? ??ifFalse: ??[ 'no results' ]. records := Array new: rsSize. 0 to: rsSize - 1 do: [: pos | ?? ?? ?? ??record := lib resultSetRecord: rs position: pos. ?? ?? ?? ??record isNil not ?? ?? ?? ?? ?? ?? ?? ??ifTrue: ??[ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??records ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??at: pos + 1 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??put: ( lib ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
??getRecord: record
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
??function: 'render; charset=marc8,
iso8859-1' ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??length:
nil ). ] ].
records
and the the doIt just hangs the VM, the console output going
through
the Debugger is the following:
Segmentation fault
-1370902312 ContextPart>doPrimitive:method:receiver:args: -1370902404 ContextPart>tryPrimitiveFor:receiver:args: -1370902788 ContextPart>send:to:with:super: -1370902896 ContextPart>send:super:numArgs: -1370902988 InstructionStream>interpretExtension:in:for: -1370903080 InstructionStream>interpretNextInstructionFor:
-- Hern??n Morales Information Technology Manager, Institute of Veterinary Genetics. National Scientific and Technical Research Council (CONICET). La Plata (1900), Buenos Aires, Argentina. Telephone: +54 (0221) 421-1799. Internal: 422 Fax: 425-7980 or 421-1799.
This is the one found in the Pharo OneClick 1.1.1 with standard VM.
4.0.3-2202 #1 XShm Tue Apr 13 11:56:47 PDT 2010 gcc 4.3.2 Linux vps2.piumarta.com 2.6.18-028stab053.10-ent #1 SMP Thu Feb 28 20:34:08 MSK 2008 i686 GNU/Linux
As the same situation happens with the CogVM, this is the version information:
3.9-7 #5 Sat Sep 18 22:06:50 PDT 2010 gcc 4.1.2 Croquet Closure Cog VM [CoInterpreter VMMaker-oscog.29] Linux mcqfes 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 EST 2009 i686 i686 i386 GNU/Linux
with the corresponding Segfault trace:
Segmentation fault
Smalltalk stack dump: 0xbfcb6bcc M MethodContext(ContextPart)>doPrimitive:method:receiver:args: -1377623896: a(n) MethodContext 0xbfcb6bf8 M MethodContext(ContextPart)>tryPrimitiveFor:receiver:args: -1377623896: a(n) MethodContext 0xbfcb6c28 M MethodContext(ContextPart)>send:to:with:super: -1377623896: a(n) MethodContext 0xbfcb6c60 M MethodContext(ContextPart)>send:super:numArgs: -1377623896: a(n) MethodContext 0xbfcb6c98 M MethodContext(InstructionStream)>interpretExtension:in:for: -1377623896: a(n) MethodContext 0xbfcb6ccc M MethodContext(InstructionStream)>interpretNextInstructionFor: -1377623896: a(n) MethodContext 0xbfcb6ce8 M MethodContext(ContextPart)>step -1377623896: a(n) MethodContext 0xbfcb6d00 M Process>step -1377787784: a(n) Process 0xbfcb6d1c M Process>completeStep: -1377787784: a(n) Process 0xbfcb6d40 M Debugger>doStep -1377787748: a(n) Debugger 0xbfcb6d58 M PluggableButtonMorph>performAction -1377774712: a(n) PluggableButtonMorph 0xbfcb6d74 M [] in PluggableButtonMorph>mouseUp: -1377774712: a(n) PluggableButtonMorph 0xbfcb6d98 M Array(SequenceableCollection)>do: -1376378232: a(n) Array 0xbfcb6db8 M PluggableButtonMorph>mouseUp: -1377774712: a(n) PluggableButtonMorph 0xbfcb6dd4 M PluggableButtonMorph(Morph)>handleMouseUp: -1377774712: a(n) PluggableButtonMorph 0xbfcb6df0 M MouseButtonEvent>sentTo: -1376378272: a(n) MouseButtonEvent 0xbfcb6e0c M PluggableButtonMorph(Morph)>handleEvent: -1377774712: a(n) PluggableButtonMorph 0xbfcb6e28 M PluggableButtonMorph(Morph)>handleFocusEvent: -1377774712: a(n) PluggableButtonMorph 0xbfcb6e50 M [] in HandMorph>sendFocusEvent:to:clear: -1401331780: a(n) HandMorph 0xbfcb6e6c M [] in PasteUpMorph>becomeActiveDuring: -1401044432: a(n) PasteUpMorph 0xbfcb6e88 M BlockClosure>on:do: -1376378324: a(n) BlockClosure 0xbfcb6eb4 M PasteUpMorph>becomeActiveDuring: -1401044432: a(n) PasteUpMorph 0xbfcb6ed8 M HandMorph>sendFocusEvent:to:clear: -1401331780: a(n) HandMorph 0xbfcb6f00 M HandMorph>sendEvent:focus:clear: -1401331780: a(n) HandMorph 0xbfcb6f24 M HandMorph>sendMouseEvent: -1401331780: a(n) HandMorph 0xbfcb6f48 M HandMorph>handleEvent: -1401331780: a(n) HandMorph 0xbfcb6f74 M HandMorph>processEvents -1401331780: a(n) HandMorph 0xbfcb6f8c M [] in WorldState>doOneCycleNowFor: -1400414096: a(n) WorldState 0xbfcb6fb0 M Array(SequenceableCollection)>do: -1402762152: a(n) Array 0xbfcb6fcc M WorldState>handsDo: -1400414096: a(n) WorldState 0xbfcb6fe8 M WorldState>doOneCycleNowFor: -1400414096: a(n) WorldState 0xbfcb7004 M WorldState>doOneCycleFor: -1400414096: a(n) WorldState 0xbfcb7020 M PasteUpMorph>doOneCycle -1401044432: a(n) PasteUpMorph 0xbfcb7040 I [] in Project class>spawnNewProcess -1400334588: a(n) Project class -1381481244 s [] in BlockClosure>newProcess
Most recent primitives millisecondClockValue signal at:put: at:put: primSignal:atMilliseconds: millisecondClockValue wait primGetNextEvent: shallowCopy wait at:put: wait signal signal primGetNextEvent: millisecondClockValue wait signal at:put: at:put: millisecondClockValue primSignal:atMilliseconds: millisecondClockValue wait signal wait relinquishProcessorForMicroseconds: relinquishProcessorForMicroseconds: relinquishProcessorForMicroseconds: millisecondClockValue signal at:put: at:put: primSignal:atMilliseconds: millisecondClockValue wait millisecondClockValue @ actualScreenSize species species millisecondClockValue basicNew new: at:put: at:put: at:put: at:put: new: basicNew basicNew basicNew shallowCopy at:put: at:put: at:put: at:put: at:put: at:put: species new: basicNew at:put: at:put: at:put: species new: replaceFrom:to:with:startingAt: shallowCopy at:put: at:put: at:put: shallowCopy species new: replaceFrom:to:with:startingAt: species new: replaceFrom:to:with:startingAt: basicNew new: basicNew basicNew wait signal wait at:put: signal at:put: at:put: @ @ basicNew species species shallowCopy shallowCopy perform: stringHash:initialHash: stringHash:initialHash: stringHash:initialHash: stringHash:initialHash: basicNew stringHash:initialHash: stringHash:initialHash: stringHash:initialHash: stringHash:initialHash: basicNew new: at:put: at:put: at:put: at:put: at:put: at:put: at:put: at:put: at:put: basicNew new: basicNew @ @ @ at:put: basicNew @ @ @ at:put: basicNew @ @ @ @ @ @ at:put: basicNew @ @ @ at:put: basicNew basicNew: at:put: at:put: at:put: at:put: @ @ @ @ @ @ @ at:put: basicNew @ @ @ @ at:put: basicNew @ @ @ @ @ @ at:put: basicNew @ @ @ @ at:put: basicNew @ @ @ @ @ at:put: basicNew basicNew new: @ @ basicNew pointsTo: pointsTo: pointsTo: pointsTo: shallowCopy shallowCopy @ @ basicNew @ @ basicNew @ perform:with: @ @ perform:with: @ basicNew @ @ basicNew @ perform:with: @ @ perform:with: @ basicNew @ @ basicNew @ @ basicNew basicNew at:put: findSubstring:in:startingAt:matchTable: indexOfAscii:inString:startingAt: perform: objectAt: new: at: stackp: at:put: at: stackp: at:put: at: stackp: at:put: at: stackp: pointsTo: objectAt: objectAt: new: objectAt: at:put: objectAt: at:put: objectAt: at:put: objectAt: at:put: tryInvokeWithArguments: Aborted
Cheers,
Hernán
2010/12/24 laurent laffont laurent.laffont@gmail.com:
Which VM have you used ? I cross post to vm-dev list. Laurent. On Fri, Dec 24, 2010 at 3:54 AM, Hernán Morales Durand hernan.morales@gmail.com wrote:
Laurent, not much progress here :( I just reproduced the Unix VM crash. First I've linked the library so we do not have to change every module name call
user@ubuntu:/usr/lib$ ln -T -s /usr/lib/libyaz.so.3.0.0 yaz
and I've tried to execute the library tracer in the shell script
ltrace -f -l /usr/lib/libyaz.so.3.0.0 -o out.txt "$BASE/squeakvm" \ -plugins "$BASE" \ -encoding latin1 \ -vm-display-X11 \ "$ROOT/Contents/Resources/pharo.image"
but it crash the VM too with an unhandled exception even before the GUI is displayed. What I've observed is that every FFI call which receives an ExternalStructure as parameter kills the VM. This is weird because this doesn't happen in the Windows VM. I ran this little script I use to debug the library
| conn lib rs rsSize records | lib := Z3950FFILibrary default. conn := lib createConnectionTo: #Alabama asZ3950Server hostName port: 7090. lib createOptions. lib setConnection: conn optionName: 'preferredRecordSyntax' optionValue: 'USMARC'. rs := lib searchPqf: conn query: '@attr 1=1003 collins'. rsSize := lib resultSetSize: rs. rsSize > 0 ifFalse: [ 'no results' ]. records := Array new: rsSize. 0 to: rsSize - 1 do: [: pos | record := lib resultSetRecord: rs position: pos. record isNil not ifTrue: [ records at: pos + 1 put: ( lib getRecord: record function: 'render; charset=marc8, iso8859-1' length: nil ). ] ]. records
and the the doIt just hangs the VM, the console output going through the Debugger is the following:
Segmentation fault
-1370902312 ContextPart>doPrimitive:method:receiver:args: -1370902404 ContextPart>tryPrimitiveFor:receiver:args: -1370902788 ContextPart>send:to:with:super: -1370902896 ContextPart>send:super:numArgs: -1370902988 InstructionStream>interpretExtension:in:for: -1370903080 InstructionStream>interpretNextInstructionFor: -1370903172 ContextPart>step -1370903280 Process>step -1370903372 Process>step: -1370920392 Debugger>send -1370937720 PluggableButtonMorph>performAction -1370937812 PluggableButtonMorph>mouseUp: -1370937996 SequenceableCollection>do: -1370957140 PluggableButtonMorph>mouseUp: -1370957232 Morph>handleMouseUp: -1370957324 MouseButtonEvent>sentTo: -1370957416 Morph>handleEvent: -1370957584 Morph>handleFocusEvent: -1370957676 HandMorph>sendFocusEvent:to:clear: -1370957768 PasteUpMorph>becomeActiveDuring: -1370957860 BlockClosure>on:do: -1370957992 PasteUpMorph>becomeActiveDuring: -1370958084 HandMorph>sendFocusEvent:to:clear: -1370958260 HandMorph>sendEvent:focus:clear: -1370958352 HandMorph>sendMouseEvent: -1370958444 HandMorph>handleEvent: -1370966728 HandMorph>processEvents -1370966836 WorldState>doOneCycleNowFor: -1370966952 SequenceableCollection>do: -1370967044 WorldState>handsDo: -1370967136 WorldState>doOneCycleNowFor: -1370969680 WorldState>doOneCycleFor: -1370969772 PasteUpMorph>doOneCycle -1383611064 >spawnNewProcess -1383611192 BlockClosure>newProcess Aborted
it would be nice if someone could tell something about debugging FFI calls, or just any idea to try. Cheers,
Hernán
2010/12/23 laurent laffont laurent.laffont@gmail.com:
Hi, I have unmangled all function names. Image also crashes when evaluating the Kant test. (but this time I get ILLEGAL INSTRUCTION on strace). I've tried with Cog and the VM in the Seaside OneClick. I've uploaded the modified packages on squeaksource here: http://www.squeaksource.com/LaurentLSandbox.html (you can use Z3950Slice to load all at once). Laurent
On Thu, Dec 23, 2010 at 1:57 AM, Hernán Morales Durand hernan.morales@gmail.com wrote:
Hi Laurent,
Thanks for the feedback, I've uploaded the repository with the missing method but I cannot reproduce the crash in Windows. Have you unmangled every function name tested? Are you running just the Z3950FFILibraryTest? Notice the Z3950FFIServerLibraryTest tests are performed against a Z39.50 server running in local host, otherwise will fail (however that shouldn't crash the VM), so you may want to run only the Z3950FFILibraryTest suite. If you or anyone want a local Zebra server for Win32 - although most configuration files should work with other platforms - for testing purposes please let me know.
Does the Kant test crash the VM too?
Z3950Client new server: #Acadia; query: ( Z3950Query new author: 'Kant' ).
(see http://67.222.12.200:8889/WebOpus/52 for sample successful results)
I will set up a Linux box tomorrow and try to reproduce there. Cheers,
2010/12/22 laurent laffont laurent.laffont@gmail.com:
Hi Hernan, finally I switch back to Linux to make it work, OSX gives me headaches. So on linux the yaz module is found. I get the "Unable to find function address" but I found that writing: <cdecl: ZOOMOptions 'ZOOM_options_create' (void) module: 'yaz'> instead of <cdecl: ZOOMOptions '_ZOOM_options_create@0' (void) module: 'yaz3'> works. If I understand, function names are not mangled when compiling with gcc on Linux.
Trying to run tests I've also had a "could not coerce arguments" in Z3950FFILibrary>>createConnectionTo:port because Z3950TestCase>>portNumber answers a String and <cdecl: ZOOMConnection 'ZOOM_connection_new' (char* short) module: 'yaz'> so it's waiting for a short. I've replaced portNumber to answer a SmallInteger. And now the image crashes on connectionIsIdle call: write(1, "\ncreateConnectionTo:port:", 25) = 25 write(1, "\nconnectionIsIdle:", 18) = 18 rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0 write(1, "\n", 1) = 1 tgkill(25830, 25830, SIGABRT) = 0 --- SIGABRT (Aborted) @ 0 (0) ---
Any idea ?
Laurent Laffont
On Tue, Dec 21, 2010 at 7:58 AM, laurent laffont laurent.laffont@gmail.com wrote:
The module is found ! How:
- Using VM Squeak 5.8b12 2 (instead of Cog or the VM provided in
Seaside One-Click image)
- go in Squeak\ 5.8b12\ 2.app/Contents/Resources/, then ln -s
/usr/local/lib/libyaz.3.dylib . Now I have the "Unable to find function address" you have talked earlier :) I will look at the mangled function names.
Laurent --- on the road to the FFI mountain.
On Tue, Dec 21, 2010 at 6:59 AM, Hernán Morales Durand hernan.morales@gmail.com wrote: > > Laurent, > I forward this e-mail to the squeak mailing list, may be someone > there > have a better idea how the OSX VM works. BTW there are more > commentaries here > > > > http://forum.world.st/squeak-dev-Alien-amp-Squeak-FFI-issues-on-Snow-Leopard... > Cheers, > > Hernán > > 2010/12/20 laurent laffont laurent.laffont@gmail.com: > > Hi Hernan, > > the strace equivalent on OSX seems to be dtruss (yes I'm learning > > OSX > > too :) > > sudo dtruss -p [pid of process] > > in the trace I have this: > > > > > > > > stat("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3.bundle/Contents/MacOS/yaz3\0", > > 0xBFF59440, 0xBFF5AB28) = -1 Err#2 > > > > > > > > stat64("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3.bundle/Contents/MacOS/yaz3\0", > > 0xBFF5892C, 0xBFF5AB28) = -1 Err#2 > > > > > > > > stat("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3\0", > > 0xBFF59440, 0xBFF5AB28) = 0 0 > > > > > > > > stat64("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3\0", > > 0xBFF5892C, 0xBFF5AB28) = 0 0 > > > > > > > > open("/Users/laurentlaffont/Downloads/Seaside.app/Contents/Resources/yaz3\0", > > 0x0, 0x0) = 12 0 > > pread(0xC, "\317\372\355\376\a\0", 0x1000, 0x0) = 4096 0 > > close(0xC) = 0 0 > > > > > > > > stat("/Users/laurentlaffont/Downloads/Plugins/yaz3.bundle/Contents/MacOS/yaz3\0", > > 0xBFF59440, 0x1000) = -1 Err#2 > > > > > > > > stat64("/Users/laurentlaffont/Downloads/Plugins/yaz3.bundle/Contents/MacOS/yaz3\0", > > 0xBFF5892C, 0x1000) = -1 Err#2 > > stat("/Users/laurentlaffont/Downloads/Plugins/yaz3\0", > > 0xBFF59440, > > 0x1000) = > > -1 Err#2 > > stat64("/Users/laurentlaffont/Downloads/Plugins/yaz3\0", > > 0xBFF5892C, > > 0x1000) > > = -1 Err#2 > > > > so it looks like the VM is trying to find yaz3 at non standard > > Unix > > places > > (I don't know if it's SqueakVM or OSX related). > > I've created Contents/Resources/yaz3.bundle/Contents/MacOS/, put > > yaz > > lib > > there, ln -s libyaz.3.dylib yaz3 but no success. > > > > I've read good > > post http://forum.world.st/FFI-Documentation-td2225150.html : > > > > Module Location - where the external library file lives > > - depends on the platform > > - Mac > > - pre Snow Leopard > > - checks VM path and common library > > paths > > - Snow Leopard > > - only looks in VM bundle's > > Resources > > file, you must either [5]: > > - store all external > > libraries > > there > > - ln -s path/to/library > > path/to/VM/Resources/library_name > > - Change the VM's > > Info.plist > > "SqueakPluginsBuiltInOrLocalOnly" key from > > "true" to "false." > > > > For this SqueakPluginsBuiltInOrLocalOnly I suppose I need to > > compile > > a > > VM ? > > Cheers, > > Laurent Laffont > > > > > > On Mon, Dec 20, 2010 at 4:12 PM, Hernán Morales Durand > > hernan.morales@gmail.com wrote: > >> > >> Hi Laurent > >> > >> I've read there is a couple of system calll monitors in MacOS, > >> ktrace > >> and dtrace (http://en.wikipedia.org/wiki/Ktrace , > >> http://en.wikipedia.org/wiki/DTrace) so you may attach to the VM > >> and > >> see what's missing? > >> Cheers, > >> > >> Hernán > >> > >> 2010/12/20 laurent laffont laurent.laffont@gmail.com: > >> > Thanks Hernan. > >> > It still doesn't work. I've also tried to play with > >> > LD_LOAD_PATH > >> > / > >> > LD_LIBRARY_PATH no success.... I want to make it work so I > >> > need > >> > to > >> > learn > >> > :) > >> > > >> > For the mangled function names, on Linux and OSX there's nm. > >> > Here's what I get: > >> > $ nm -g libyaz.3.dylib | grep ZOOM_connection_create > >> > 0000000000046a30 T _ZOOM_connection_create > >> > Cheers, > >> > Laurent > >> > > >> > On Sun, Dec 19, 2010 at 6:23 PM, Hernán Morales Durand > >> > hernan.morales@gmail.com wrote: > >> >> > >> >> Hi Laurent, > >> >> > >> >> Thanks for reporting. The correct #moduleName for MacOS was > >> >> missing, > >> >> I've uploaded a new version answering 'libyaz.3.dylib' which > >> >> I > >> >> guess > >> >> is the corresponding for 'yaz3.dll' (according to > >> >> http://en.wikipedia.org/wiki/Dynamic_library#Naming ). > >> >> > >> >> I haven't access to a MacOS, but in Windows I've had to find > >> >> the > >> >> mangled function names (i.e. _ZOOM_connection_create@4) so > >> >> FFI > >> >> can > >> >> find the function addresses and you don't get the classic > >> >> "Error: > >> >> Unable to find function address". I don't know if it's > >> >> related > >> >> since > >> >> talks about C++, but you may want to check > >> >> http://wiki.squeak.org/squeak/3735 > >> >> > >> >> The tool I've used to find the mangled function names in > >> >> Windows > >> >> is > >> >> the Steve Miller's Dependency Walker > >> >> http://www.dependencywalker.com/ > >> >> > >> >> 2010/12/19 laurent laffont laurent.laffont@gmail.com: > >> >> > Hi, > >> >> > > >> >> > I want to use http://www.squeaksource.com/Z3950 > >> >> > Following install instructions, I've dowloaded yaz sources > >> >> > (I've > >> >> > tried > >> >> > 4.1.2 > >> >> > and 3.0.52) as it seems there's no binary for OSX, > >> >> > ./configure > >> >> > && make > >> >> > && > >> >> > make install. > >> >> > Then using latest Seaside One Click image I've copied > >> >> > /usr/local/lib/*yaz* > >> >> > in Seaside.app/Contents/MacOS > >> >> > $ ls ~/Downloads/Seaside.app/Contents/MacOS/ > >> >> > Squeak VM Opt libyaz.a libyaz.la > >> >> > libyaz_icu.a libyaz_icu.la libyaz_server.a > >> >> > libyaz_server.la libyaz.3.dylib libyaz.dylib > >> >> > libyaz_icu.3.dylib libyaz_icu.dylib > >> >> > libyaz_server.3.dylib > >> >> > libyaz_server.dylib > >> >> > > >> >> > > >> >> > But then I have a External Module Not Found on > >> >> > YAZPQFFFILibrary>>createParser > >> >> > " YAZPQDFFILibrary default createParser " > >> >> > <cdecl: YAZPQFParser 'yaz_pqf_create' (void) module: > >> >> > 'yaz3'> > >> >> > ^ self externalCallFailed > >> >> > > >> >> > Any hint ? > >> >> > Cheers, > >> >> > Laurent Laffont -- FFI newbie > >> >> > > >> >> > Pharo Smalltalk Screencasts: http://www.pharocasts.com/ > >> >> > Blog: http://magaloma.blogspot.com/ > >> >> > > >> >> > >> >> -- > >> >> Hernán Morales > >> >> Information Technology Manager, > >> >> Institute of Veterinary Genetics. > >> >> National Scientific and Technical Research Council (CONICET). > >> >> La Plata (1900), Buenos Aires, Argentina. > >> >> Telephone: +54 (0221) 421-1799. > >> >> Internal: 422 > >> >> Fax: 425-7980 or 421-1799. > >> >
vm-dev@lists.squeakfoundation.org