所以,我正在开始一个Java程序,如下所示
java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n MyClass
Run Code Online (Sandbox Code Playgroud)
然后我手动附加调试器,如下所示
jdb -attach 8000
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何方式让我设置jdb,以便它在未捕获的异常情况下自动附加到正在运行的进程(仅)?
原因是我想避免调试器的开销直到出现未捕获的异常.但是我现在面临的问题是,如果没有附加调试器,那么一旦出现未捕获的异常,JVM就会中止.
编辑:
从Oracle 文档来看,似乎下面的命令可以满足我的需求,但对于Windows机器而言.
java -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe MyClass
Run Code Online (Sandbox Code Playgroud)
谁知道linux等价?我试过下面的命令.
java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=jdb MyClass
Run Code Online (Sandbox Code Playgroud)
调试器似乎连接但它会立即抛出IOError.
Initializing jdb ...
java.io.IOException: Input/output error
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at com.sun.tools.example.debug.tty.TTY.<init>(TTY.java:751)
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1067)
Run Code Online (Sandbox Code Playgroud) 我正在尝试获取getelementptr指令所引用的数组的名称。当数组被索引为在实际C代码中使用中间变量时,这似乎起作用
int a = 0;
i[a] = 3;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到以下位码
%arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom
store i32 3, i32* %arrayidx, align 4
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以遍历getelementptr指令的操作数,并通过第一个操作数上的getName()方法找到array(i)的名称。
但是,如果在源代码中数组是直接索引的,
i[0] = 3;
Run Code Online (Sandbox Code Playgroud)
然后,生成的位码如下
store i32 3, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @i, i64 0, i64 0), align 4
Run Code Online (Sandbox Code Playgroud)
在这里,我不确定如何从位代码获取数组名称(i)。存储指令的第二操作数的类型设置为PointerTy。第二个操作数的包含类型为int。两者都符合预期,因为操作数是i32 *。但是,在这种情况下,我不确定如何获取getelementptr指令的句柄以迭代其操作数。
编辑:我应该提到的数组我是一个全局
由于无法基于部分密钥逐出条目的限制,我正在考虑使用缓存名称作为我的部分密钥并驱逐缓存中的所有(只有一个)条目的解决方法.例如,假设有两个键值对,如下所示:
"123 @ name1" - > value1,"124 @ name2" - > value2
理想情况下,在驱逐时,我想删除包含字符串"123"的所有键.但是,由于不支持,我正在考虑的解决方法是具有以下内容:
"123"缓存:"name1" - > value1
"124"缓存:"name2" - > value2
然后在驱逐时,我只需指定删除"123"缓存中的所有键
当然,这样做的缺点是会有很多不同的缓存.对此有任何性能损失吗?
从阅读本文来看,似乎Redis至少只使用缓存名称作为前缀.因此,它不会在其下创建多个单独的缓存.但我想验证一下我的理解.
如果有帮助,我也希望使用Redis作为我的底层缓存提供程序.
所以我在Java中有以下JNIManager类.在这个类中,正如您所看到的,我定义了一个名为setUpBackGround()的本机方法;
public class JNIManager{
public native void setUpBackground();
public void messageMe(byte[] byteArray);
}
Run Code Online (Sandbox Code Playgroud)
然后我有另一个用本机(C)代码实现的类.我们称这个类为Background Class.这个类做了一些后台工作,并调用JNIManager类的messageMe()方法传递一个byte [].
class Background{
JNIEnv* mJNIEnv;
jbyteArray mArray;
jobject mJObject;
Background(JNIEnv * env, jobject jObject){
mArray = env->NewByteArray(1040);
mJNIEnv = env;
mJObject = jObject;
}
virtual ~Background(){
mJNIEnv->DeleteLocalRef(mArray); //is this necessary?
}
void someMethod(){
jclass manager = mJNIEnv->GetObjectClass(mJObject);
jmethodID method = mJNIEnv->GetMethodID(manager, "messageMe", "([B)V");
mJNIEnv->CallVoidMethod(mJObject, method, mArray);
mJNIEnv->DeleteLocalRef(manager); // is this necessary?
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在本机方法setUpBackground中,我执行以下操作,
JNIEXPORT jlong JNICALL Java_com_example_test_JNIManager_setUpBackground
(JNIEnv * env, jobject jo){
Background* back …Run Code Online (Sandbox Code Playgroud)