首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过JNI远程调试启动JVM

通过JNI远程调试启动JVM
EN

Stack Overflow用户
提问于 2013-12-05 00:47:48
回答 1查看 759关注 0票数 1

我有一个用Java编写的服务器,我们在本机代码中为它启动和停止JVM。我遇到了一个特定于该环境的问题,所以我想在打开远程调试的情况下启动JVM。

以下是我的JVM选项:

代码语言:javascript
复制
char** vmargs = NULL;
int vmargc = 4;
{
   // Configure the VM Args for the JVM
   //Log( "vmargs: %d\n",vma-2);
   vmargs = new char*[vmargc];

   vmargs[0] = new char[1024];
   vmargs[1] = new char[1024];
   vmargs[2] = new char[1024];
   vmargs[3] = new char[1024];

   _snprintf_s(vmargs[0], 1024,_TRUNCATE, "-Djava.library.path=%s\\bin\\lib", root.c_str());        
   _snprintf_s(vmargs[1], 1024,_TRUNCATE, "-Djava.class.path=%s\\bin\\%s", root.c_str(), JarName);
   _snprintf_s(vmargs[2], 1024,_TRUNCATE, "-Xrs");
   _snprintf_s(vmargs[3], 1024,_TRUNCATE, "-Xdebug -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=y");

    Log( "vmarg %d:%s.\n",0,vmargs[0]);
    Log( "vmarg %d:%s.\n",1,vmargs[1]);
    Log( "vmarg %d:%s.\n",2,vmargs[2]);
    Log( "vmarg %d:%s.\n",3,vmargs[3]);
}

如您所见,我使用的是"-Xdebug -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=y“。这些选项是通过以下方式输入JVM的:

代码语言:javascript
复制
int optNum = 0;
for (int g=0; g<vmargc; ++g) {
   options[optNum++].optionString = vmargs[g];
   Log("Added vmarg: %s\n", options[g].optionString);
}
vm_args.version = JNI_VERSION_1_4; //JNI Version 1.4 and above
vm_args.options = options;
vm_args.nOptions = optNum;
vm_args.ignoreUnrecognized = JNI_TRUE;

//Create the JVM
res = createJVM(&vm, (void **)&env, &vm_args);

不幸的是,JVM不会等待调试器附加或接受端口8989上的连接(连接被拒绝)。我尝试过其他端口,但JVM似乎忽略了我的选项。

JVM正在正确启动服务器,我可以将客户端连接到它。

对我做错了什么有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-05 15:49:57

弄明白了。每个参数都必须有char*数组条目,否则会混淆JVM。修正后的代码如下:

代码语言:javascript
复制
char** vmargs = NULL;
int vmargc = 5;
{
    // Configure the VM Args for the JVM
    vmargs = new char*[vmargc];

    vmargs[0] = new char[1024];
    vmargs[1] = new char[1024];
    vmargs[2] = new char[1024];
    vmargs[3] = new char[1024];
    vmargs[4] = new char[1024];

    _snprintf_s(vmargs[0], 1024,_TRUNCATE, "-Djava.library.path=%s\\bin\\lib", root.c_str());       
   _snprintf_s(vmargs[1], 1024,_TRUNCATE, "-Djava.class.path=%s\\bin\\%s", root.c_str(), JarName);
   _snprintf_s(vmargs[2], 1024,_TRUNCATE, "-Xrs");
   _snprintf_s(vmargs[3], 1024,_TRUNCATE, "-Xdebug");
   _snprintf_s(vmargs[4], 1024,_TRUNCATE, "-Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=y");

    Log( "vmarg %d:%s.\n",0,vmargs[0]);
    Log( "vmarg %d:%s.\n",1,vmargs[1]);
    Log( "vmarg %d:%s.\n",2,vmargs[2]);
    Log( "vmarg %d:%s.\n",3,vmargs[3]);
    Log( "vmarg %d:%s.\n",4,vmargs[4]);
}

将-Xdebug与-Xrunjdwp分离允许JVM同时识别两者。当它们共享char*时,JVM并没有将它们解析为两个选项,而是认为它们是一个选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20389243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档