5

我正在尝试使用 Java 1.7.0_21 在 Windows 8 上调试小程序。

我已将 bleow 添加到运行时参数中。

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 

当我尝试连接时,我在本地和远程机器上都收到“无法在端口 5005 上打开与主机的连接”错误。

如果我执行 netstat -an 我看不到任何端口 5005 正在监听。似乎 JVM 没有打开侦听调试端口。

我已将端口添加到防火墙,甚至完全禁用了防火墙,但没有区别。

这里有没有其他人尝试在 Windows 8 上调试 Java 7?

谢谢

4

3 回答 3

2

我遇到了同样的问题,可以稍微说明一下这个问题。我还没有解决方案,这就是我来这里的原因,但这可能有助于找到答案。

问题在于 JRE 启动的实际运行时。如果您在 Java 控制面板中查看可执行文件,它将是 javaw.exe。因此,您正在向其中添加调试标志。如果您使用 Process Explorer 查看运行您的小程序的实际进程,它是 java.exe。我不知道 javaw.exe 是否只是产生 java.exe 然后死亡或什么,但标志永远不会传递到 java.exe。

如果您转到控制面板中的 Java 选项卡,您过去可以在那里添加另一个运行时。好吧,您仍然可以,但是在单击“确定”然后单击下一个对话框选项卡上的“应用”后,然后单击返回 Java 选项卡,您添加的运行时将消失。我修改的所有设置都没有使浏览器插件获得传递的运行时参数,这使得无法在浏览器上下文中调试小程序。

于 2013-05-03T16:51:33.863 回答
2

做到了……几乎!

因为我被困住了,所以我做了很艰难的事情:用我自己的一个替换 java exe,这迫使 java 进入调试模式

(请温柔一点,这不是高质量的开发 :))

  • 备份你原来的 java.exe 并用这个假 java 替换它。
  • 不要忘记更新exeFile以指向您的 java 目录
  • 不要忘记stdoutRedirect更新stderrRedirect
  • -static-libgcc -static-libstdc++使用mingW 的编译选项

假Java.exe

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<time.h>
#include<strings.h>
int main(int givenArgc,char *givenArgv[])
{ 
    std::cout<<"step 0.a\n";
    char exeFile[] = "c:\\java\\jdk1.7.0_21\\bin\\java.exe";
    int prependArgc = 4;
    char* prependArgv[] = {
        "-Djava.compiler=NONE",
        "-Xnoagent",
        "-Xdebug",
        "-Xrunjdwp:transport=dt_socket,address=2502,server=y,suspend=y"
    };


    std::cout<<"step 0.b\n";
    time_t rawtime;
    struct tm * timeinfo;
    char date [80];

    time (&rawtime);
    timeinfo = localtime (&rawtime);

    strftime (date,80,"%Y%m%d%H%M%S",timeinfo);

    std::cout<<"step 0.c\n";
    char stderrRedirect[100];
    char stdoutRedirect[100];
    sprintf(stderrRedirect,"2>d:\\tmp\\%s-stderr.txt",date);
    sprintf(stdoutRedirect,">d:\\tmp\\%s-stdout.txt",date);

    std::cout<<"step 0.d\n";
    int appendArgc = 2;
    char* appendArgv[] = {
        stderrRedirect,
        stdoutRedirect
    };

    std::cout<<"step 0.e\n";
    int argc = prependArgc+givenArgc-1+appendArgc;
    char** argv = (char**)malloc(argc*sizeof(char*)); 

    std::cout<<"step 1.a\n";
    char** src = prependArgv;
    int nbItems = prependArgc;
    int j = 0;
    for(int i=0;i<nbItems;i++){
        argv[j++]=src[i];
    }

    std::cout<<"step 1.b\n";
    src = givenArgv;
    nbItems = givenArgc;
    for(int i=1;i<nbItems;i++){
        argv[j++]=src[i];
    }

    std::cout<<"step 1.c\n";
    src = appendArgv;
    nbItems = appendArgc;
    for(int i=0;i<nbItems;i++){
        argv[j++]=src[i];
    }

    std::cout<<"step 3\n";
    char str[4096];
    strcpy(str,exeFile);
    std::cout<<"step 4\n";
    for(int i =0;i<argc;i++){
        strcat (str," ");
        strcat (str,argv[i]);
    }
    std::cout<<"step 5\n";
    std::cout<<"will run : ";
    std::cout<<str;

    std::cout<<"\nstep 6\n";
    system(str);
    free(argv);
    return 0;
}
于 2013-05-07T14:31:02.113 回答
1

我按照错误中的建议设置了环境变量 JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8989" ,它对我有用(至少在 Chrome 中)

与此相关的 sun 错误数据库中有很多错误,似乎它只在 java-8 (b97) 中解决了这里是sun-bug的链接,它描述了完全相同的问题,这里是你可以的地方下载 java-8 (b99 是当前版本)

于 2013-07-24T10:37:21.833 回答