我有一个用Java编写的服务器,我们在本机代码中为它启动和停止JVM。我遇到了一个特定于该环境的问题,所以我想在打开远程调试的情况下启动JVM。
以下是我的JVM选项:
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的:
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正在正确启动服务器,我可以将客户端连接到它。
对我做错了什么有什么想法吗?
发布于 2013-12-05 15:49:57
弄明白了。每个参数都必须有char*数组条目,否则会混淆JVM。修正后的代码如下:
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并没有将它们解析为两个选项,而是认为它们是一个选项。
https://stackoverflow.com/questions/20389243
复制相似问题