[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| Re: [ecf-dev] a difficult ECF build issue | 
Ted,
I don't have any direct experience with building or running Eclipse on a 
64-bit platform, but I'll attempt to address some of the more general 
questions.
 
So I am trying to debug. If I put src in a workspace, then the plugin 
works fine in the runtime workbench. But in this case, the src is 
recompiled. Is there a way of actually running and debugging a 
downloaded binary (pointing to src files in some way)?
What you can do is:
1. start your target Eclipse in debug mode
2. connect to it from a host Eclipse (on your dev machine)
On your target machine, start Eclipse like this:
./eclipse -vmargs 
-agentlib:jdwp=suspend=y,transport=dt_socket,server=y,address=`hostname`:8000
You should see the splashscreen come up and this printed to the console:
Listening for transport dt_socket at address: 8000
For more information on the various options please see 
http://java.sun.com/j2se/1.5.0/docs/guide/jpda/conninv.html#Invocation.
On your host machine, start your Eclipse IDE like you normally do. You 
should have a separate eclipse directory with all target plugins that 
your code depends on (including the 64-bit linux versions). Point your 
Preferences->Plugin Development -> Target Platform to that location and 
also specify the appropriate platform environment (second tab on that 
page). This is what your IDE will "see".
Finally, create a debug launch configuration: Run -> Open Debug 
Dialog... -> Remote Java Application. As the Project, pick something 
with lots of dependencies so you don't have to manually add them in the 
Source tab. This just gives you the necessary visibility into your 
target code (the code compiled in your IDE won't actually be used here). 
Specify the target hostname and port where you started your target and 
hit Debug.
At this point you should see your target instance come up and you should 
be able to set and hit breakpoints in your host IDE.
 
Here are details .....
 
1. I am building Eclipse plugins (headless builds) on a 64-bit 
computer running Suse 10.2. All the plugins built on this machine 
build without errors and so far all but one are functional. The plugin 
that is not functional is the Skype plugin.
 
2. I should be more specific about non-functional. First of all, the 
plugin is only non-functional on Windows. It works fine on 32-bit 
Linux. I have been unable to test it on 64-bit Linux but hope to soon 
(looking for a platform; our build machine is not practical). The 
behavior is that Skype appears in the ECF dropdown, but when you 
select it, nothing happens.
 
3. When I build the plugin on 32-bit Linux, it is functional on both 
Windows and Linux. The plugin requires that Skype be installed and 
running. I have what I think are the latest Skype versions. The Linux 
Skype looks a lot different than the Windows Skype BTW.
 
4. If I replace one file in the 150 or so files comprising the Skype 
plugin built on 64-bit Linux, it becomes functional on both Windows 
and Linux. The file I must replace is 
com/skype/connector/windows/WindowsConnector$1.class in 
com.skype_0.3.0.HEAD.jar. I replace it with the same file built on 
32-bit Linux.
 
5. Originally, the Skype plugin would not build. To get it to build 
without errors, Scott and I cast a returned value to an int. (We don't 
believe that there is any important information in the upper bits 
anyway, but we have been unable to actually look at the bits of the 
returned long because we so far cannot debug on a 64-bit machine. This 
returned value is an int when run on 32-bit machines and a long when 
run on 64-bit machines. The change we made is in the file 
eclipse/plugins/com.skype/src/com/skype/connector/windows/WindowsConnector.java 
(around line 221) and is as follows.
 
       public void run() {
             try {
              display = new Display();
              windowClass = new TCHAR(0, "" + 
System.currentTimeMillis() + (int) (Math.random() * 1000), true);
              long tmpMessageReceived = new 
Callback(WindowsConnector.this, "messageReceived", 4).getAddress();
              int messageReceived = (int) tmpMessageReceived;
             if (messageReceived == 0) {
 
6. When we built on our 64-bit machine we had to add a 32-bit win 
plugin to our eclipse/plugins directory so that imports would be 
resolved. This is a 64-bit Eclipse that we run on this Linux machine 
so the win32 plugin is not normally there. The plugin I copied is 
org.eclipse.swt.win32.win32.x86_3.3.0.v3346.jar. This has the same 
version at the other plugins, but it should not be used to run Eclipse 
because Eclipse is running on Linux. It seems strange to me that we 
must add a plugin to the eclipse/plugins directory that eclipse itself 
does not use, but we could see no other way of resolving references.
Looking at the snippet, I believe TCHAR actually comes from SWT's win32 
fragment. This class is not public API, but you can still make it work 
by isolating platform-specific code into a platform-specific fragment. 
I'm going to take a look at this specific issue in the source (heaven 
knows I owe you guys at least that much :-S)
 
7. The Eclipse that we run on this 64-bit Suse is 
eclipse-SDK-3.3-linux-gtk-x86_64.tar. The java is from 
jdk-6u4-linux-x64.bin.
       ted@ecf2:/opt> java -version
       java version "1.6.0_04"
      Java(TM) SE Runtime Environment (build 1.6.0_04-b12)
      Java HotSpot(TM) 64-Bit Server VM (build 10.0-b19, mixed mode)
 
8. If I check out the Skype files into my workspace on my Windows 
laptop, the skype plugin works fine. I can set a breakpoint and look 
at the returned int. However, I do not know a way of actually running 
the 64-bit built plugin on my laptop and debugging to see where it 
hangs. Visual Studio has a feature called something like "attach to a 
running binary" that would let me do something like this? Does Eclipse?
Please let me know if you have any luck with the debugging. Thanks.
--Peter